登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

守望

路越远,心越近。有多远,走多远!

 
 
 

日志

 
 

MFC消息及MFC程序的生存  

2009-07-11 11:04:51|  分类: 资料 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

以下摘自侯捷《深入浅出MFC》

MFC 把消息主要分为三大类,Message Map 机制中对于消息与函数间的对映关系也明定

以下三种:

     标准Windows 消息(WM_xxx)的对映规则:

宏名称 对映消息 消息处理函数(名称已由系统预设)

ON_WM_CHAR WM_CHAR OnChar

ON_WM_CLOSE WM_CLOSE OnClose

ON_WM_CREATE WM_CREATE OnCreate

ON_WM_DESTROY WM_DESTROY OnDestroy

ON_WM_LBUTTONDOWN WM_LBUTTONDOWN OnLButtonDown

ON_WM_LBUTTONUP WM_LBUTTONUP OnLButtonUp

ON_WM_MOUSEMOVE WM_MOUSEMOVE OnMouseMove

ON_WM_PAINT WM_PAINT OnPaint

■ 命令消息(WM_COMMAND)的一般性对映规则是:

ON_COMMAND(<id>,<memberFxn>)

例如:

ON_COMMAND(IDM_ABOUT, OnAbout)

ON_COMMAND(IDM_FILENEW, OnFileNew)

ON_COMMAND(IDM_FILEOPEN, OnFileOpen)

ON_COMMAND(IDM_FILESAVE, OnFileSave)

■ 「Notification 消息」(由控制组件产生,例如BN_xxx)的对映机制的宏分

为好几种(因为控制组件本就分为好几种),以下各举一例做代表:

控制组件 宏名称 消息处理函数

Button ON_BN_CLICKED(<id>,<memberFxn>) memberFxn

ComboBox ON_CBN_DBLCLK(<id>,<memberFxn>) memberFxn

Edit ON_EN_SETFOCUS(<id>,<memberFxn>) memberFxn

ListBox ON_LBN_DBLCLK(<id>,<memberFxn>) memberFxn


程序的诞生:

Application object 产生,内存于是获得配置,初值亦设立了。

Afx WinMain 执行AfxWinInit,后者又调用AfxInitThread,把消息队列尽量加大到96

Afx WinMain 执行InitApplication。这是CWinApp 的虚拟函数,但我们通常不改写它。

AfxWinMain 执行InitInstance。这是CWinApp 的虚拟函数,我们必须改写它。

CMyWinApp::InitInstance 'new' 了一个CMyFrameWnd 对象。

CMyFrameWnd 构造式调用Create,产生主窗口。我们在Create 参数中指定的

窗口类别是NULL, 于是MFC 根据窗口种类, 自行为我们注册一个名为

"AfxFrameOrView42d" 的窗口类别。

■ 回到InitInstance 中继续执行ShowWindow,显示窗口。

■ 执行UpdateWindow,于是发出WM_PAINT

■ 回到AfxWinMain,执行Run,进入消息循环。

程序开始运作:

■ 程序获得WM_PAINT 消息(藉由CWinApp::Run 中的::GetMessage 循环)。

WM_PAINT 经由::DispatchMessage 送到窗口函数CWnd::DefWindowProc 中。

CWnd::DefWindowProc 将消息绕行过消息映射表格(Message Map)。

■ 绕行过程中发现有吻合项目,于是调用项目中对应的函数。此函数是应用程序

利用BEGIN_MESSAGE_MAP END_MESSAGE_MAP 之间的宏设立起来的。

■ 标准消息的处理例程亦有标准命名,例如WM_PAINT 必然由OnPaint 处理。

以下是程序的死亡:

■ 使用者选按【File/Close】,于是发出WM_CLOSE

CMyFrameWnd 并没有设置WM_CLOSE 处理例程,于是交给预设之处理例程。

■ 预设函数对于WM_CLOSE 的处理方式是调用::DestroyWindow, 并因而发出

WM_DESTROY

■ 预设之WM_DESTROY 处理方式是调用::PostQuitMessage,因此发出WM_QUIT

CWinApp::Run 收到WM_QUIT 后会结束其内部之消息循环, 然后调用

ExitInstance,这是CWinApp 的一个虚拟函数。

■ 如果CMyWinApp 改写了ExitInstance , 那么CWinApp::Run 所调用的就是

CMyWinApp::ExitInstance,否则就是CWinApp::ExitInstance

      最后回到AfxWinMain,执行AfxWinTerm,结束程序。


  评论这张
 
阅读(495)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018