• /*
  •     更新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
  • */