|
3.7 更新命令用户接口(UI)消息 一般情况下,菜单项和工具条按钮都不止一种状态,我们经常需要根据应用的内部状态来对菜单项和工具条按钮作相应的改变。例如,在我们没有选择任何内容时,编辑菜单下的“复制”、“剪切”等菜单是无效的(灰色显示)。有时,我们还会看到,在菜单项旁边可能还会有检查标记,表示它是选中的还是不选中的。比如,在Word的视图菜单下,根据用户所选的显示模式,在“普通”、“大纲”、“页面”“主控文档”前会出现一个点符号,标识当前所选的视图方式。工具条也有类似的情形,如果按钮不可用也可以被置成无效,或者可以被选中。 COMMAND UPDATE_COMMAND_UI 其中UPDATE_COMMAND_UI就是更新命令用户接口消息,专门用于处理菜单项和工具条按钮的更新。每一个菜单命令都对应于一个更新命令用户接口消息。可以为更新命令用户接口消息编写消息处理函数来处理用户接口(包括菜单和工具条按钮)的更新。如果一条命令有多个用户接口对象(比如一个菜单项和一个工具条按钮),两者都被发送给同一个处理函数。这样,对于所有等价的用户接口对象来说,可以把用户接口更新代码封装在同一地方。 3.7.1用户接口更新原理 为了理解用户接口更新机制,我们来看一下应用框架是如何实现用户接口更新的。当我们选择Edit菜单时,将产生一条WM_INITMENUPOPUP消息。框架的更新机制将在菜单拉下之前集体更新所有的项,然后再显示该菜单。 3.7.2 用户接口更新机制编程 当框架给处理函数发送更新命令时,它给处理函数传递一个指向CCmdUI对象的指针。这个对象包含了相应的菜单项或工具条按钮的指针。更新处理函数利用该指针调用菜单项或工具条的命令接口函数来更新用户接口对象(包括灰化,使,使能,选中菜单项和工具条按钮等)。下面我们使用前面的例子演示如何使用用户接口更新机制: 1.按Ctrl+W激活ClassWizard,选择Message Map选项页。 清单3.5 void CMainFrame::OnUpdateSelectBlue(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_nColor==BLUE); } void CMainFrame::OnUpdateSelectRed(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_nColor==RED); } void CMainFrame::OnUpdateSelectYellow(CCmdUI* pCmdUI) { // TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_nColor==YELLOW); } 现在编译运行Hello程序。当我们打开Test菜单时,如图3-14所示,在Red菜单项前已经有了一个对号。因为前面在CMainFrame构造函数中,我们已经将颜色初始化为RED。如果选择Blue,下次打开Test菜单时,在Blue菜单前就会有一个对号,而Red前面的对号则没有了。
图3-14 类似的,要根据某个状态开关菜单,也可以为菜单生成命令接口更新成员函数。比如,在Edit菜单中,如果当前剪贴板没有内容,Paste(粘贴)菜单应当设为无效,程序可以这么写: void CMainFrame::OnUpdateEditPaste(CCmdUI* pCmdUI) { pCmdUI->Enable(!IsClipboardEmpty()); } 其中IsClipboardEmtpy()是读者自己编写的函数,用于判断剪贴板中是否有内容
作者: 不详, 来源: Visual C++王朝 |