夜雨竹林
落叶无声
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(第九章)
总结如下:


posted on 2009-10-06 12:20  夜雨竹林  阅读(455)  评论(0编辑  收藏  举报