如何在win32 application 中调用MFC的类

时间:2022-08-20 10:04:53
用SDK编程时,写界面较烦,能否在win32 application 中调用MFC的类,比如CDialog类
做输入,输出.有无用SDK编写的对话框的范例,请贴一份.

谢谢!

我在北京,希望能有机会和大家一起交流,共同进步.
email:wfsong@263.net

5 个解决方案

#1


我想基于MFC写可能会好一些.
因为我们平时写一些程序可能只用到MFC的框架,其他还是用的SDK的API.

其实MFC只是在SDK的基础上封了薄薄的一层,把C调用改成了C++调用而已,直接使用API更爽.

#2


MFC的头文件比较复杂,而且相互之间依赖性较大,可能还没做就被各种Undefine弄昏了。
一般在MFC中用SDK比较常见。
如果用SDK写对话框,程序如下:
/* Test4.cpp */
#include <windows.h>
#include <stdio.h>
#include "resource.h"

LRESULT CALLBACK DialogProc(
  HWND hwndDlg,  // handle to dialog box
  UINT uMsg,     // message
  WPARAM wParam, // first message parameter
  LPARAM lParam  // second message parameter
);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
    HWND            hwnd ;
    MSG   msg ;
    WNDCLASS        cs = {  CS_HREDRAW | CS_VREDRAW,
DialogProc,
0,
         DLGWINDOWEXTRA,  //Note!!Must be this
hInstance,
LoadIcon(NULL,IDI_APPLICATION),
LoadCursor(NULL,IDC_ARROW),
(HBRUSH)(COLOR_BTNFACE+1),
NULL,
"IDD_TEST4_DIALOG"};

    RegisterClass(&cs);

    hwnd = CreateDialog (hInstance, MAKEINTRESOURCE(IDD_TEST4_DIALOG), NULL, NULL) ;
    ShowWindow (hwnd, iCmdShow) ;
    UpdateWindow (hwnd) ;
 
    // message WM_QUIT cause function GetMessage return 0
    while(GetMessage(&msg,NULL,0,0)) {
          TranslateMessage(&msg);
          DispatchMessage(&msg);
    }
    return msg.wParam ;
}

LRESULT CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
   switch(uMsg) 
   {
   case WM_COMMAND:
   switch (LOWORD (wParam))
   {
      case IDOK:
      case IDCANCEL:
      PostQuitMessage (0) ;
      return TRUE; 
   }
   break;
   case WM_DESTROY:
        PostQuitMessage (0) ;
        return TRUE;
   }
   return  DefWindowProc(hwndDlg,uMsg,wParam,lParam);
}
/* Test4.rc */
/*注意:IDD_TEST4_DIALOG 的窗口类被设成了CLASS "IDD_TEST4_DIALOG",也就是使用在Test4.cpp里注册的窗口类创建Dialog*/
#include "resource.h"
#include "afxres.h"

IDD_TEST4_DIALOG DIALOGEX 0, 0, 320, 113
STYLE DS_MODALFRAME | DS_3DLOOK | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | 
    WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "Test4"
CLASS "IDD_TEST4_DIALOG"
FONT 9, "宋体"
BEGIN
    DEFPUSHBUTTON   "Close",IDOK,200,7,113,18
    EDITTEXT        IDC_EDIT1,7,19,83,16,ES_AUTOHSCROLL | ES_WANTRETURN
    EDITTEXT        IDC_EDIT2,99,19,83,16,ES_AUTOHSCROLL | ES_WANTRETURN
    EDITTEXT        IDC_EDIT5,7,90,83,16,ES_AUTOHSCROLL | ES_WANTRETURN
    EDITTEXT        IDC_EDIT4,99,54,83,16,ES_AUTOHSCROLL | ES_WANTRETURN
    EDITTEXT        IDC_EDIT3,7,54,83,16,ES_AUTOHSCROLL | ES_WANTRETURN
    EDITTEXT        IDC_EDIT6,99,90,83,16,ES_AUTOHSCROLL | ES_WANTRETURN
    LISTBOX         IDC_LIST1,199,32,114,74,NOT LBS_NOTIFY | 
                    LBS_NOINTEGRALHEIGHT | WS_TABSTOP
    LTEXT           "IDC_EDIT1:",IDC_STATIC,7,7,41,8
    LTEXT           "IDC_EDIT2:",IDC_STATIC,99,7,41,8
    LTEXT           "IDC_EDIT3:",IDC_STATIC,7,41,41,8
    LTEXT           "IDC_EDIT4:",IDC_STATIC,99,39,41,8
    LTEXT           "IDC_EDIT5:",IDC_STATIC,7,78,41,8
    LTEXT           "IDC_EDIT6:",IDC_STATIC,99,78,41,8
END
/* resource.h */
// Used by Test4.rc
//
#define IDD_TEST4_DIALOG                102
#define IDR_MAINFRAME                   128
#define IDC_EDIT1                       1000
#define IDC_EDIT2                       1001
#define IDC_EDIT3                       1002
#define IDC_EDIT4                       1003
#define IDC_EDIT5                       1004
#define IDC_EDIT6                       1005
#define IDC_LIST1                       1012

#3


MFC 把复杂的事情 变容易了,
MFC 把清楚的事情 变糊涂了。

#4


to tramfer:
你可以直接在SDK程序中加入资源文件,然后放入对话框,放好控件,最后在程序中调用CreateWindow就行了。
另外:你没有《Windows程序设计》吗?那上面有一些很好的例子,找朋友借借吧

#5


这个问题不算解决了吧,在sdk工程中的确是可以用资源编辑器编辑如对话框之类的资源,但是并不能由wizard来自动产生mfc中复杂的消息映射宏之类,所以对对话框的操作仍然得自己添加相应的回调函数等,从这个角度讲,在win32 application中是不能调用MFC中这些有关界面相应的类的,那么,如果有一个win32 application,仅想在其中调用如CFile,CStdioFile这些文件操作的类,那么把winzard自动生成的stdafx.h中的#include <windows.h>改成#include <afxwin.h>或#include <afx.h>就可以了。唉,说了半天都忘了原来准备说什么了!

#1


我想基于MFC写可能会好一些.
因为我们平时写一些程序可能只用到MFC的框架,其他还是用的SDK的API.

其实MFC只是在SDK的基础上封了薄薄的一层,把C调用改成了C++调用而已,直接使用API更爽.

#2


MFC的头文件比较复杂,而且相互之间依赖性较大,可能还没做就被各种Undefine弄昏了。
一般在MFC中用SDK比较常见。
如果用SDK写对话框,程序如下:
/* Test4.cpp */
#include <windows.h>
#include <stdio.h>
#include "resource.h"

LRESULT CALLBACK DialogProc(
  HWND hwndDlg,  // handle to dialog box
  UINT uMsg,     // message
  WPARAM wParam, // first message parameter
  LPARAM lParam  // second message parameter
);

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
    HWND            hwnd ;
    MSG   msg ;
    WNDCLASS        cs = {  CS_HREDRAW | CS_VREDRAW,
DialogProc,
0,
         DLGWINDOWEXTRA,  //Note!!Must be this
hInstance,
LoadIcon(NULL,IDI_APPLICATION),
LoadCursor(NULL,IDC_ARROW),
(HBRUSH)(COLOR_BTNFACE+1),
NULL,
"IDD_TEST4_DIALOG"};

    RegisterClass(&cs);

    hwnd = CreateDialog (hInstance, MAKEINTRESOURCE(IDD_TEST4_DIALOG), NULL, NULL) ;
    ShowWindow (hwnd, iCmdShow) ;
    UpdateWindow (hwnd) ;
 
    // message WM_QUIT cause function GetMessage return 0
    while(GetMessage(&msg,NULL,0,0)) {
          TranslateMessage(&msg);
          DispatchMessage(&msg);
    }
    return msg.wParam ;
}

LRESULT CALLBACK DialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
   switch(uMsg) 
   {
   case WM_COMMAND:
   switch (LOWORD (wParam))
   {
      case IDOK:
      case IDCANCEL:
      PostQuitMessage (0) ;
      return TRUE; 
   }
   break;
   case WM_DESTROY:
        PostQuitMessage (0) ;
        return TRUE;
   }
   return  DefWindowProc(hwndDlg,uMsg,wParam,lParam);
}
/* Test4.rc */
/*注意:IDD_TEST4_DIALOG 的窗口类被设成了CLASS "IDD_TEST4_DIALOG",也就是使用在Test4.cpp里注册的窗口类创建Dialog*/
#include "resource.h"
#include "afxres.h"

IDD_TEST4_DIALOG DIALOGEX 0, 0, 320, 113
STYLE DS_MODALFRAME | DS_3DLOOK | WS_MINIMIZEBOX | WS_POPUP | WS_VISIBLE | 
    WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION "Test4"
CLASS "IDD_TEST4_DIALOG"
FONT 9, "宋体"
BEGIN
    DEFPUSHBUTTON   "Close",IDOK,200,7,113,18
    EDITTEXT        IDC_EDIT1,7,19,83,16,ES_AUTOHSCROLL | ES_WANTRETURN
    EDITTEXT        IDC_EDIT2,99,19,83,16,ES_AUTOHSCROLL | ES_WANTRETURN
    EDITTEXT        IDC_EDIT5,7,90,83,16,ES_AUTOHSCROLL | ES_WANTRETURN
    EDITTEXT        IDC_EDIT4,99,54,83,16,ES_AUTOHSCROLL | ES_WANTRETURN
    EDITTEXT        IDC_EDIT3,7,54,83,16,ES_AUTOHSCROLL | ES_WANTRETURN
    EDITTEXT        IDC_EDIT6,99,90,83,16,ES_AUTOHSCROLL | ES_WANTRETURN
    LISTBOX         IDC_LIST1,199,32,114,74,NOT LBS_NOTIFY | 
                    LBS_NOINTEGRALHEIGHT | WS_TABSTOP
    LTEXT           "IDC_EDIT1:",IDC_STATIC,7,7,41,8
    LTEXT           "IDC_EDIT2:",IDC_STATIC,99,7,41,8
    LTEXT           "IDC_EDIT3:",IDC_STATIC,7,41,41,8
    LTEXT           "IDC_EDIT4:",IDC_STATIC,99,39,41,8
    LTEXT           "IDC_EDIT5:",IDC_STATIC,7,78,41,8
    LTEXT           "IDC_EDIT6:",IDC_STATIC,99,78,41,8
END
/* resource.h */
// Used by Test4.rc
//
#define IDD_TEST4_DIALOG                102
#define IDR_MAINFRAME                   128
#define IDC_EDIT1                       1000
#define IDC_EDIT2                       1001
#define IDC_EDIT3                       1002
#define IDC_EDIT4                       1003
#define IDC_EDIT5                       1004
#define IDC_EDIT6                       1005
#define IDC_LIST1                       1012

#3


MFC 把复杂的事情 变容易了,
MFC 把清楚的事情 变糊涂了。

#4


to tramfer:
你可以直接在SDK程序中加入资源文件,然后放入对话框,放好控件,最后在程序中调用CreateWindow就行了。
另外:你没有《Windows程序设计》吗?那上面有一些很好的例子,找朋友借借吧

#5


这个问题不算解决了吧,在sdk工程中的确是可以用资源编辑器编辑如对话框之类的资源,但是并不能由wizard来自动产生mfc中复杂的消息映射宏之类,所以对对话框的操作仍然得自己添加相应的回调函数等,从这个角度讲,在win32 application中是不能调用MFC中这些有关界面相应的类的,那么,如果有一个win32 application,仅想在其中调用如CFile,CStdioFile这些文件操作的类,那么把winzard自动生成的stdafx.h中的#include <windows.h>改成#include <afxwin.h>或#include <afx.h>就可以了。唉,说了半天都忘了原来准备说什么了!