MFC程序的来龙去脉二(摘自《深入浅出MFC——侯捷》)

本文详细解析了MFC(Microsoft Foundation Classes)中的消息处理机制,包括CWinApp类的Run方法如何启动消息循环,以及MFC如何通过MessageMap机制将Windows消息映射到相应的处理函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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(第九章)
总结如下:


转载于:https://www.cnblogs.com/yelinpalace/archive/2009/10/06/1578420.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值