Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1612826
  • 博文数量: 585
  • 博客积分: 14610
  • 博客等级: 上将
  • 技术积分: 7402
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-15 10:52
文章存档

2013年(5)

2012年(214)

2011年(56)

2010年(66)

2009年(44)

2008年(200)

分类: C/C++

2012-01-27 03:18:04

 MFC浅析(5) 命令更新机制
分类: 2.3 VC技巧收集 78人阅读 评论(0) 收藏 举报

MFC框架结构中,可以用ON_UPDATE_COMMAND_UI( id, memberFxn )
宏指定菜单或工具条按钮等对应的状态设置函数
在memberFxn中通过传入的CCmdUI对象指针就可以设置菜单项,
工具钮的使用、禁用、标记等属性。
所有在memberFxn中指定条件的变化,都将实时的反映到界面上去。
其实现机理如下
一 工具条按钮的更新
由于工具条一直可见,故要实时更新,就得不断调用memberFxn检查更新条件
这是通过在CWinApp::OnIdle(),以及WM_IDLEUPDATECMDUI消息实现的.
①在程序空闲时,OnIdle将被调用
在其基类CWinThread 中的OnIdle() 将调用主窗口的消息处理函数处理WM_IDLEUPDATECMDUI消息,
同时给所有下级窗口发送WM_IDLEUPDATECMDUI消息。
②框架窗口相应WM_IDLEUPDATECMDUI消息
void CMDIFrameWnd::OnIdleUpdateCmdUI()
void CFrameWnd::OnIdleUpdateCmdUI()
需要时,将调用OnUpdateFrameMenu,更新菜单各项
③各控制条,对话框接收到WM_IDLEUPDATECMDUI消息
调用CControlBar::OnIdleUpdateCmdUI()进行相应
在其中调用CControlBar::OnUpdateCmdUI进行更新
④OnUpdateCmdUI是控制条类的虚函数,对不同的控制条将有不同实现方式
以工具条为例:
将针对其上各个按钮调用特定窗口的命令处理函数
首先看是否有对反射消息的处理
另外也支持自己处理
一般情况下将调用DoUpdate进行更新。
DoUpdate 将调用宿主窗口的OnCmdMsg进行处理
OnCmdMsg(m_nID, CN_UPDATE_COMMAND_UI, this, NULL);
其nCode参数为CN_UPDATE_COMMAND_UI,表示是界面更新,将调用ON_UPDATE_COMMAND_UI所制定的成员,同时工具条的信息通过
CmdUI传给处理函数。
最后工具条将调用UpdateDialogControls以更新其上的其他控制。

二 菜单的更新
①再空闲时OnUpdateFrameMenu被调用,用来更新菜单。
过程大致与工具条更新类似。
②将菜单被打开时,也作更新。
 CFrameWnd::OnInitMenuPopup()中
其间将调用窗口的OnCmdMsg(m_nID, CN_UPDATE_COMMAND_UI, this, NULL);
对各菜单项进行更新。
三 其他
在窗口接到命令时,将试探性的调用命令的更新函数,测试命令是否被禁止了。
若该命令为激活状态,将交由OnCmdMsg处理。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/FMD/archive/2001/06/16/5527.aspx

阅读(465) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~