CWinApp:Run——程序生命的活水源头
当程序窗口类注册好了,窗口诞生并显示出来了,UpdateWindow被调用,使得消息队列中出现一个WM_PAINT,等待被处理。执行到pApp->Run
要知道,CMyWinApp继承自CWinApp,而Run又是CWinApp的一个虚函数。我们并没有改写它(大部分情况下不需改写它),所以上述操作相当于调用:
CwinApp::Run();其程序代码出现在APPCORE.CPP中:
32位MFC与16位MFC的巨大差异在于CWinApp与CCmdTarget之间多出了一个CWinThread,事情变得稍微复杂一些。CWinThread定义于THRDCORE.CPP:
SDK程序的做法是调用DispatchMessage,把消息丢给窗口函数;MFC也是如此。在AfxEndDeferRegisterClass程序代码,它在注册四种窗口类之前已经指定窗口函数为:
wndcls.lpfnWndProc=DefWindowProc;
MFC应用程序对消息的识别与判断是采用所谓的“Message Map机制”。
把消息与处理函数连接在一起:Message Map机制
MFC提供给应用程序使用的“很方便的接口”是两组宏。以Hello的窗口为例,第一个操作是在HELLO.H的CMyFrameWnd加上DECLARE_MESSAGE_MAP:
第二个操作是在HELLO.CPP的任何位置(当然不能在函数之内)使用宏如下:
BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)
ON_WM_PAINT()//导到OnPaint函数
ON_COMMAND(IDM_ABOUT,OnAbout)//导到OnAbout函数去了。
END_MESSAGE_MAP()
MFC把消息主要分为三大类,Message Map机制中对于消息与函数间的对应关系也有以下三种:
一、标准Windows消息(WM_xxx)的对应规则:
命令消息(WM_COMMAND)的一般性对应规则是:
“Notification消息”(由控件产生,例如BN_xxx)的对应机制的宏分为好几种(因为控件本就分为好几种),以下各举一例做代表:
各个消息处理函数均应以afx_msg void 为函数类型。
如果某个消息在Message Map中找不到对应记录会在基类流窜。称作Message Routing(第九章)
总结如下:
当程序窗口类注册好了,窗口诞生并显示出来了,UpdateWindow被调用,使得消息队列中出现一个WM_PAINT,等待被处理。执行到pApp->Run
要知道,CMyWinApp继承自CWinApp,而Run又是CWinApp的一个虚函数。我们并没有改写它(大部分情况下不需改写它),所以上述操作相当于调用:
CwinApp::Run();其程序代码出现在APPCORE.CPP中:
32位MFC与16位MFC的巨大差异在于CWinApp与CCmdTarget之间多出了一个CWinThread,事情变得稍微复杂一些。CWinThread定义于THRDCORE.CPP:
SDK程序的做法是调用DispatchMessage,把消息丢给窗口函数;MFC也是如此。在AfxEndDeferRegisterClass程序代码,它在注册四种窗口类之前已经指定窗口函数为:
wndcls.lpfnWndProc=DefWindowProc;
MFC应用程序对消息的识别与判断是采用所谓的“Message Map机制”。
把消息与处理函数连接在一起:Message Map机制
MFC提供给应用程序使用的“很方便的接口”是两组宏。以Hello的窗口为例,第一个操作是在HELLO.H的CMyFrameWnd加上DECLARE_MESSAGE_MAP:
第二个操作是在HELLO.CPP的任何位置(当然不能在函数之内)使用宏如下:
BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd)
ON_WM_PAINT()//导到OnPaint函数
ON_COMMAND(IDM_ABOUT,OnAbout)//导到OnAbout函数去了。
END_MESSAGE_MAP()
MFC把消息主要分为三大类,Message Map机制中对于消息与函数间的对应关系也有以下三种:
一、标准Windows消息(WM_xxx)的对应规则:
命令消息(WM_COMMAND)的一般性对应规则是:
“Notification消息”(由控件产生,例如BN_xxx)的对应机制的宏分为好几种(因为控件本就分为好几种),以下各举一例做代表:
各个消息处理函数均应以afx_msg void 为函数类型。
如果某个消息在Message Map中找不到对应记录会在基类流窜。称作Message Routing(第九章)
总结如下: