`
isiqi
  • 浏览: 16490010 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

MFC-命令分派

阅读更多

MFC的命令大体上由两类界面元素引发,一种是菜单项,另一种是如按钮,复选框等的通用控件。从消息来看,其实就是处理WM_COMMAND消息。尽管命令消息的进入点仍然是CWnd::OnWndMsg,不过MFC让它走了另一条路,即OnCommand

让命令消息作另外处理是有原因的,比如说菜单命令,往往处理它的并不是FrameWnd,而是ViewDocument或其他的类。所以菜单命令并不是简单的发给拥有菜单的窗口,而是在整个框架绕了一圈。

CWnd::OnCommand调用了OnCmdMsg 这是一个虚函数,不同的类对命令的派发是不一样的,因此各各覆盖OnCmdMsg作具体的处理。

先看看FrameWnd的:

BOOL CFrameWnd::OnCmdMsg(UINT nID, int nCode, void* pExtra,

AFX_CMDHANDLERINFO* pHandlerInfo)

{

// pump through current view FIRST

CView* pView = GetActiveView();

if (pView != NULL && pView->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))

return TRUE;

// then pump through frame

if (CWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))

return TRUE;

// last but not least, pump through app

CWinApp* pApp = AfxGetApp();

if (pApp != NULL && pApp->OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))

return TRUE;

return FALSE;

}

FrameWnd上的命令大多数是菜单命令,为了让框架中的其他类能够处理菜单命令,它在三个地方调用OnCmdMsg,首先得到处理的是View,其次是FrameWnd自己,最后是WinApp。其实View处理的时候会让Document类处理命令,而Document又会让DocTemplate类处理,如果不中断,整个处理顺序大概是这样的:

CView::OnCmdMsg

CDocument::OnCmdMsg

CDocTemplate::OnCmdMsg

CFrameWnd::OnCmdMsg

pApp->OnCmdMsg

无论上面的类怎么处理,最后的分派都归结到CCmdTarget::OnCmdMsg,这个函数可以简化成这两句代码:

BOOL CCmdTarget::OnCmdMsg(UINT nID, int nCode, void* pExtra,

AFX_CMDHANDLERINFO* pHandlerInfo)

{

if (FindMessageEntry(…))

_AfxDispatchCmdMsg(…)

}

_AfxDispatchCmdMsg真正将消息派发到处理函数去,其做法与CWnd::OnWndMsg是很相似的。

对话框的命令要简单得多,去除其他复杂的因素,甚至可以认为CDialog::OnCmdMsg直接分派消息,也就是只有CDialog的具体子类才能处理它上面的按钮命令。

MFC的命令处理可以应付简单的应用程序,但对于复杂如Office这样的程序,则太过于简陋了。举一个简单的例子,一个对话框有非常多的界面元素,并且这些界面元素要根据数据状态实时更新,利用MFC的命令处理会比较麻烦,因为它没有对话框的实时更新机制。一种理想的方法是这样的,在消息处理Idle的时候,每个界面元素向数据查询状态,这种查询可以认为是非常快速的,根据状态实时更新自己的表现形式,比如EnabledVisible等。这就不仅为命令引入了“执行”的行为,还引入了“更新”的行为。执行和更新是命令机制的基础,看看Office的工具条,如果没有Idle的更新机制,每个按钮的更新可以想象有多么的复杂。

这一点在VCL里面做得比较好,它设计了一套Action的框架,与界面元素最大程度的分离开来,更加集中的处理“执行”和“更新”这种两种行为。每一种界面元素,不管是菜单还是按钮,只要与一个Action挂接,那么它的状态和行为完成由Action来掌管。这样做的好处很多,我列出两个:

1. 多个界面元素可以对应一个Action,这种情况经常出现,比如菜单项与工具栏上的某个按钮,如果它们都挂上同一个Action,则它们的行为和状态都会变得一致。

2. 减少命令与界面的依赖,以后若想换一套新的菜单控件,只要这套控件支持Action机制,则可以在不影响程序行为的情况下轻松更换。

如果是MFC,如何来提供这样的命令机制呢?我想这是考验MFC的可扩展性的时候了。

分享到:
评论

相关推荐

    兄弟 MFC-8510DN MFC-8515DN MFC-8520DN 一体机中文维修手册.pdf

    根据提供的文件信息,以下是一份关于兄弟MFC-8510DN、MFC-8515DN和MFC-8520DN一体机的中文维修手册的知识点概述: 1. 维修手册概览 - 维修手册是针对Brother激光多功能设备中的MFC-8510DN、MFC-8515DN和MFC-8520DN...

    兄弟MFC-1810打印机驱动程序A1官方版

    兄弟MFC-1810打印机驱动程序是一款可以有效解决兄弟MFC-1810打印机在使用过程中出现的一些问题的驱动工具,本站提供了兄弟MFC-1810驱动下载地址,有需要的朋友们可以前来下载使用。 兄弟Brother MFC-1810是一款高...

    兄弟MFC-J200

    兄弟MFC-J200是一款集打印、扫描、复印和传真功能于一体的多功能一体机,专为家庭和小型办公室用户设计。这款设备凭借其高效性能和实用特性,成为了许多用户信赖的选择。驱动程序是连接硬件设备与操作系统之间的重要...

    兄弟MFC-9330CDW说明书.pdf

    "兄弟MFC-9330CDW说明书.pdf" Brother MFC-9330CDW是一款多功能打印机,它具有打印、复印、扫描和传真等多种功能。下面是对该设备的详细说明: HARDWARE组件 * 主机:MFC-9330CDW的主机采用了AMD处理器,具有...

    兄弟Brother MFC-J2340DW 驱动下载安装.exe

    兄弟Brother MFC-J2340DW 驱动下载安装 使用中有任何问题可以关注并私信,如果资源对您有帮助记得关注收藏好评哟!

    兄弟MFC-9340CDW一体机驱动程序官方版

    兄弟MFC-9340CDW一体机驱动程序是一款可以有效解决兄弟MFC-9340CDW一体机在使用过程中出现的一些问题的驱动工具,本站提供了兄弟MFC-9340CDW一体机驱动下载地址,有需要的朋友们可以前来下载使用。 兄弟MFC-9340CDW...

    兄弟原厂中文维修手册-DCP-1518-1519-MFC-1813-1816-1818-1819-DCP-1608-1619-MFC-1906-1908

    兄弟原厂中文维修手册-DCP-1518-1519-MFC-1813-1816-1818-1819-DCP-1608-1619-MFC-1906-1908-DCP-1618W-MFC-1919NW-ASC

    兄弟MFC-260C打印机驱动程序

    兄弟MFC-260C打印机驱动程序是一款可以有效解决兄弟MFC-260C打印机在使用过程中出现的一些问题的驱动工具,本站提供了兄弟MFC-260C打印机驱动下载地址,有需要的朋友们欢迎前来下载使用。 兄弟MFC-260C打印机驱动由...

    兄弟MFC-9465CDN一体机驱动程序

    兄弟MFC-9465CDN一体机驱动程序是一款可以有效解决兄弟MFC-9465CDN一体机在使用过程中出现的一些问题的驱动工具,本站提供了兄弟MFC-9465CDN一体机驱动下载地址,有需要的朋友们可以前来下载使用。 兄弟MFC-9465CDN...

    兄弟彩色一体机MFC-J5910DW-ASC中文维修手册

    兄弟彩色一体机MFC-J5910DW-ASC中文维修手册

    兄弟MFC-J6910DW一体机驱动程序

    兄弟MFC-J6910DW一体机驱动程序是一款可以有效解决兄弟MFC-J6910DW一体机在使用过程中出现的一些问题的驱动工具,本站提供了兄弟MFC-J6910DW一体机驱动下载地址,有需要的朋友们可以前来下载使用。 兄弟MFC-J6910DW...

    MFC-7420-inst-win7-A2

    MFC-7420-inst-win7-A2

    兄弟MFC-7470D打印机驱动程序D1官方版

    兄弟MFC-7470D打印机驱动程序是一款可以有效解决兄弟MFC-7470D打印机在使用过程中出现的一些问题的驱动工具,本站提供了兄弟MFC-7470D打印机驱动下载地址,有兴趣的伙伴们可以前来下载使用。 本驱动是官方的兄弟MFC...

    兄弟MFC-8810DW打印机驱动程序64位官方版

    兄弟MFC-8810DW打印机驱动程序是一款可以有效解决兄弟MFC-8810DW打印机在使用过程中出现的一些问题的驱动工具,本站提供了兄弟MFC-8810DW打印机驱动下载地址,有需要的朋友们可以前来下载使用。 兄弟MFC-8810DW是一...

    BROTHER兄弟 MFC-295CN多功能一体机驱动A版For Win7-64.zip

    标题中的“BROTHER兄弟 MFC-295CN多功能一体机驱动A版For Win7-64.zip”指的是Brother公司生产的MFC-295CN型号的多功能一体机的驱动程序,专为Windows 7 64位操作系统设计。这款驱动程序是A版,意味着它是该设备支持...

    深入浅出MFC--侯捷 深入浅出MFC--侯捷 深入浅出MFC--侯捷

    《深入浅出MFC》是侯捷先生撰写的一本关于Microsoft Foundation Classes (MFC) 的经典著作。MFC是微软公司开发的一个C++类库,它封装了Windows API,为开发者提供了一种更加面向对象的方式来编写Windows应用程序。...

    brother兄弟MFC-7220一体机驱动程序

    brother兄弟MFC-7220驱动程序;nbsp;nbsp;Brothernbsp;MFCnbsp;Setupnbsp;File;nbsp;nbsp;Copyrightnbsp;cnbsp;nbsp;2005nbsp;Brothernbsp;Industries,LTD.;nbsp;nbsp;FileNamenbsp;nbsp;nbsp;:nbsp;nbsp;nbsp;...

    Brother兄弟MFC-8510DN一体机驱动 D1官方版

    兄弟8510DN一体机是一款定位于高端商务的全能办公利器,该机支持打印、复印、扫描、传真四合一功能...兄弟 MFC-8510DN一体机驱动安装简介下载解压后,依次通过install--MFC-8510DN找到Setup.exe文件,双击,欢迎下载体验

    兄弟MFC-9060打印机驱动程序64位

    兄弟MFC-9060打印机驱动程序是一款可以有效解决兄弟MFC-9060打印机在使用过程中出现的一些问题的驱动工具,本站提供了兄弟MFC-9060打印机驱动下载地址,有需要的朋友们可以前来下载使用。 兄弟MFC-9060驱动适用于xp...

    兄弟MFC-8810DW打印机驱动程序32位官方版

    兄弟MFC-8810DW打印机驱动程序是一款可以有效解决兄弟MFC-8810DW打印机在使用过程中出现的一些问题的驱动工具,本站提供了兄弟MFC-8810DW打印机驱动下载地址,有需要的朋友们可以前来下载使用。 兄弟MFC-8810DW是一...

Global site tag (gtag.js) - Google Analytics