- /*
- 更新UI对象
- 常规情况下,菜单和工具栏按钮可以有多种状态。例如,菜单不可用时可以置灰,菜单
- 正在被使用时可以设定为选中状态。同样工具栏也有这些状态。
- 谁来更新这些可变状态项的状态?从逻辑上讲,如果一个菜单项产生了一个命令消息,
- 此消息会被文档处理,那么由文档去更新可变状态项的状态更有意义,文档中应该包括
- 可变状态项的状态信息。
- 如果一个命令对应多个UI对象,比如一个菜单项和一个工具栏项,那么这两处的发出的
- 命令将会被路由到同一个处理函数。这样就会在一处为多个同等的UI对象封装一份
- UI更新代码。
- 编程框架提供了一个自动更新UI对象的快捷方法,你可以选择自己的更新方法,但框架
- 提供的方法更有效且易于使用。
- 1:更新函数何时被调用?
- 假设用户通过鼠标点击了“文件”菜单,此操作会产生WM_INITMENUPOPUP消息,在菜单
- 弹出之前,编程框架的更新机制会更新“文件”菜单下的所有菜单项,这样我们就可以
- 看到各个菜单项的状态了。
- 为了做到这一点,编程框架会以标准的命令路由方式路由弹出菜单的所有菜单项命令。
- 在路由的过程中,通过检查消息映射入口,命令目标有机会更新任意的菜单项及调用
- 更新函数。比如,一个菜单有六个菜单项,那个弹出之前,这六个更新命令都会被发送
- 出去。如果存在与其相关的更新函数,则其会被更新状态。如果没有,编程框架会检查
- 与命令ID相关的处理函数是否存在,并依据其更新菜单项的状态。
- 如果在命令路由的过程中找不到相应的状态更新项,编程框架会自动去检查针对此命令
- ID的响应函数是否存在,如果存在则UI对象可用,如果不存在则不可用。
- 所以,为了使一个UI对象可用,可以为其提供一个命令响应函数或者一个UI对象更新
- 函数。二者存在一个即可。
- 禁用UI对象的默认不可用属性是可以做到的,具体可以参照CFrameWnd的成员变量
- m_bAutoMenuEnable。
- 编程框架中的菜单初始化是自动完成的,它发生在程序接收到消息WM_INITMENUPOPUP
- 的时候。在IDLE时间内,编程框架会像查找菜单的更新函数一样为按钮也查找更新函数。
- 2:宏ON_UPDATE_COMMAND_UI
- 通过属性窗口可以自动地将UI对象的ID与其相应的更新函数联系起来。UI对象的更新
- 函数的原型如下:
- */
- /*
- 像所有的消息处理函数一样,更新函数的声明需要关键字afx_msg的支持
- 所像所有的更新函数一样,它也需要一个参数,类型为CCmdUI*
- */
- afx_msg void OnUpdateEditClearAll(CCmdUI *pCmdUI);
- /*
- 3:类CCmdUI
- 在路由更新命令的过程中,编程框架会为更新函数提供一个CCmdUI*类型的参数,它代表
- 了产生更新命令的UI对象。更新函数会调用CCmdUI的成员函数去更新其代表的UI对象。
- 示例代码如下:
- */
- void CMyWinApp::OnUpdateEditClearAll(CCmdUI *pCmdUI)
- {
- pCmdUI->Enable(m_bClearAllAvailable);
- }
- /*
- CCmdUI的成员函数可操作的UI对象包括:
- Menu item,菜单项
- Enables or disables
- Checks (×) or unchecks
- Checks using dot (•)
- Sets item text
- Toolbar button,工具栏项
- Enables or disables
- Selects, unselects, or indeterminate
- Same as SetCheck
- Status-bar pane,状态栏项
- Makes text visible or invisible
- Sets pop-out or normal border
- Same as SetCheck
- Sets pane text
- Normal button in CDialogBar
- Enables or disables
- Checks or unchecks check box
- Same as SetCheck
- Sets button text
- Normal control in CDialogBar
- Enables or disables
- Sets window text
- 成员函数有下面的五人:
- ContinueRouting
- Enable
- SetCheck
- SetRadio
- SetText
- */