mfc原理和消息映射

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MFC思想

win32程序中创建一个窗口的过程:设计窗口阶段(由WNDCLASS结构描述部分)、窗口的注册及创建显示过程、消息循环部分。win32用标准的C语言代码实现,是面向过程的。在MFC中采用了面向对象的思想,即用面向对象的C++思想对以上代码进行了封装,也就是说将一些对窗口进行操作的API的函数封装到了一个类中,以下我将用简短的代码来演示一下这个过程:

class CWnd

{

public:

HWND m_hWnd;

BOOL Create();

BOOL ShowWindow();

};

BOOL CWnd::Create()

{

WNDCLASS wndClass;

wndClass.style=CS_HREDRAW;

wndClass.lpfnWndProc=(WNDPROC)DefWndProc;

wndClass.cbClsExtra=0;

wndClass.cbWndExtra=0;

wndClass.hInstance=hInstance;

wndClass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));

wndClass.hCursor=LoadCursor(hInstance,MAKEINTRESOURCE(IDC_CURSOR1));

LOGBRUSH lgbr;

lgbr.lbStyle=BS_SOLID;

lgbr.lbColor=RGB(192,192,0);

lgbr.lbHatch=0;

wndClass.hbrBackground=CreateBrushIndirect(&lgbr);

wndClass.lpszMenuName=NULL;

wndClass.lpszClassName="mycls";

RegisterClass(&wndClass);

HWND hWnd;

m_hWnd=CreateWindow("mycls","窗口标题",

WS_OVERLAPPEDWINDOW,0,NULL,NULL,hInstance,NULL);

if(m_hWnd!=NULL)

return true;

else

return false;

}

BOOL CWnd::ShowWindow()

{

return ShowWindow(hWnd,nCmdShow);

}

为了保证代码和以前的执行方式一样,Winmain()函数可以写成如下形式:

int WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)

{

CMyWnd m_wnd;

m_wnd.Create();

m_wnd.ShowWindow();

MSG msg;

while(GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return true;

}

此时,如果再写一个新的类来对剩下的代码进行封装,代码如下:

class CWinApp

{

public:

CWnd * m_pMainWnd;

BOOL InitInstance();

BOOL Run();

CWinApp ();

};

CWinApp:: CWinApp ()

{

if(InitInstance())

Run();

}

BOOL CWinApp::InitInstance()

{

CWnd m_wnd;

m_pMainWnd=&m_wnd;

m_pMainWnd->Create();

m_pMainWnd->ShowWindow();

return true;

}

BOOL CWinApp::Run()

{

MSG msg;

while(GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return true;

}

CWinApp theApp;

int PASCAL WinMain() {}

Windows消息的产生:

1用户按键或者鼠标操作可以产生消息,如WM_KEYDOWN,WM_LBUTTONDOWN等;2系统可以自己产生消息,如,创建窗口的时候会产生WM_CREATE,WM_TIMER等;3应用程序间可以定义自己的消息,在应用程序间进行消息通讯;

Windows消息的分类:

1窗口消息(Windows Message):通常跟窗口的移动、创建,关闭等操作有关。窗口为消息的接收对象。如以上的WM_LBUTTONDOWN,WM_CREATE等。

2命令消息(Command Message):由用户操作菜单、按钮等资源是触发,以WM_COMMAND 形式出现。wparam

3控件通知消息(Control Notification Message):该消息是在控件相关内容或者状态改变时由控件本身通知父窗口。

4用户自定义消息:有时候用户自己需要定义自己的消息进行处理,为了跟系统消息区分,系统专门划分一段消息编号区间来让用户定义自己的消息。

#define MY_MESSAGE WM_USER + 1 // 用户自定义消息

Windows32消息的结构:

MSG 结构的定义如下:

typedef struct tagMSG

{

HWND hwnd; //接收消息的窗口句柄

UINT message; //消息标识(ID)

WPARAM wParam; //第一个消息参数

LPARAM lParam; //第二个消息参数

DWORD time; //消息产生的时间

POINT pt; //消息产生时鼠标的位置

} MSG;

回忆窗口处理函数首部,主消息循环相关重要代码。

MFC消息处理机制:

所谓消息映射,简单地讲,就是让程序员指定要某个MFC类(有消息处理能力的类)处理某个消息。MFC提供了工具ClassWizard来帮助实现消息映射,在处理消息的类中添加一些有关消息映射的内容和处理消息的成员函数。程序员将完成消息处理函数,实现所希望的消息处理能力。

通过几个重要的宏来实现MFC消息映射,这些宏功能强大,其实现相对也比较复杂。这里只要求我们会用就可以。

DECLARE_MESSAGE_MAP:初始化消息映射表,实际上是给所在类添加几个用于消息处理的静态成员变量和静态或虚拟函数。

相关文档
最新文档