设为首页 加入收藏

TOP

深入VC++消息映射与命令通知(三)
2012-11-04 15:21:17 来源: 作者: 【 】 浏览:526
Tags:深入 消息 映射 命令 通知
  命令和通知

  命令和通知实际都是一种特殊的消息类型。在SDK编程(www.cppentry.com)中,菜单和控件的动作均会产生一个WM_COMMAND命令消息,通过对消息参数wParam的区分可以识别出具体是哪个控件或菜单发出的命令。在MFC应用程序框架下,菜单和控件产生的消息将有所区分,选取菜单产生的消息被称作命令,而点击控件所产生的消息则被称作通知。由于命令和通知的本质仍是一种消息,因此在基本原理上仍是同消息一致的,即也是通过消息循环进入OnWndMsg()进而为对应的处理函数所响应。但是在使用上,命令和消息还是有区别的,其中一个最主要的区别是消息只有CWnd类的派生类所接收,而命令和通知则可以为所有从CCmdTarget派生出去的类对象所接收,从MFC类的继承关系可以看出,除CWnd外CWinThread、CDocument和CDocItem等也都可以接收命令和通知。除此之外,命令和通知在从消息循环进入到OnWndMsg()后的这段过程也是同消息传递略有出入的,图2(a)和(b)分别给出了命令和通知的传递流程:


图2 命令/通知传递流程

  这里CWnd::OnCommand()在检查完各项细节后、CWnd::OnNotify()在检查完不同条件后都调用了虚函数OnCmdMsg()。这样,对于不同的菜单项和控件就可以有不同的实现。从下面给出的命令传递过程示例代码可以看出命令/通知的传递与消息的映射是非常类似的:

// 头文件
//{{AFX_MSG(CDIP_SystemView)
afx_msg void OnEmboss();
afx_msg void OnUpdateEmboss(CCmdUI* pCmdUI);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
……
// 源文件
BEGIN_MESSAGE_MAP(CDIP_SystemView, CScrollView)
/{{AFX_MSG_MAP(CDIP_SystemView)
ON_COMMAND(IDM_EMBOSS, OnEmboss)
ON_UPDATE_COMMAND_UI(IDM_EMBOSS, OnUpdateEmboss)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
……
void CDIP_SystemView::OnEmboss ()
{
return;
}
……
void CDIP_SystemView::OnUpdateStartPos(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_bCanUse);
}

  这里ON_COMMAND宏将特定命令的处理同一个类成员函数建立了关联。而宏ON_UPDATE_COMMAND_UI则负责对命令的更新,即通过CCmdUI对象控制菜单/控件的是否可用或其他一些状态变化的更新。对命令的更新也可以将其理解为存在一个含有每个菜单入口的大表,各菜单入口含有菜单是否可用的标志。在显示菜单时通过快速检查该表而做出其所对应的每一个菜单项是否可用的决定。如果可用标志发生了变化,该表也将得到及时的更新。

  小结

  消息和命令作为VC++(www.cppentry.com)编程(www.cppentry.com)中很基本的一种机制,在几乎所有的VC++(www.cppentry.com)程序中都有所涉及。在学习VC++(www.cppentry.com)其他编程(www.cppentry.com)技术之前必须首先对消息映射机制是如何运做的有一个清楚的认识。本文所述代码在Windows 2000 Professional下由Microsoft Visual C++(www.cppentry.com) 6.0下调试通过。
首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇VC实现卡拉OK字幕叠加 下一篇VC实现应用程序在线升级

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: