当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 如何enable/disable菜单项

VC++
在类VC的界面实现中加入目录树
软件换肤技术在 BCB 中的实现
利用非模窗口生成MDI介面
报表输出轻松搞定
Windows 中不规则窗体的编程实现
解说Win32的窗口子类化
使用测试优先方法开发用户界面
一个简单的登录对话框的实现
一个简单的日记本程序
从资源中加载皮肤
一个在RichEdit中添加表情图象的类
ActiveSkin 4.3 软件换肤在VC中的实现
一种另类“关于(About)”对话框的动态显示方法
对话框打印预览及打印
关于如何换肤、子类化的解决方案
制作 MSN、QQ 的消息提示窗口
如何对 BCGControlBarPro 进行换肤
定制个性化的对话框窗口类
改变窗口中的光标形状
更新MFC中的视图,跟踪.NET Framework中的事件

VC++ 中的 如何enable/disable菜单项


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 222 ::
收藏到网摘: n/a

如何enable/disable菜单项
VCKBASE
    这个问题在以前的知识库中出现过多次,许多人问及在MFC应用程序中enable或disable菜单的问题,在主菜单中调用 CMenu::EnableMenuItem不起作用......如何disable菜单项?
    根据以往的经验,要解决这种问题,似乎应该有一个象EnableMenuItem之类的API函数,它的功能就是enable或disable菜单项。Windows中确实有这样的函数-但不是在MFC的应用中。实际上,在MFC里enable或disable菜单项是通过使用ON_ UPDATE_COMMAND_UI实现的。首先让我解释一下为什么MFC的实现方法不同于标准的C和Windows API,以及MFC的实现方法的好处。
    一般情况下,用户界面的状态指的是按钮,状态格,菜单项等任何反映程序状态的东西。例如,如果程序处于只读模式,那么编辑(Edit)命令应该是disable的,并且在程序的某个地方可能有一个小指示器向用户提示这个状态。另一个例子是如果剪贴板没有内容(一种状态),那么菜单中的粘贴(Paste)命令应该是disable的。所以说通常的用户界面(UI)指的就是程序表现的状态,同时,程序状态的改变应该在程序的菜单中反映出来。
如何随时获得反映程序状态的用户界面呢?我自己的方法有两种:
    第一种是神经过敏型,也就是说无论何时只要程序状态改变,都不要忘记同时更新用户界面,如果用户调用只读模式命令,这个命令要disable所由编辑控制。同样,如果用户调用Cut或者Copy,处理器立刻enable Paste命令。在程序的任何地方对程序状态的任何改变,都必须要更新相应的UI。
    第二种方法是放松型,也就是说,不要试图去维护所有的状态信息,只根据需要更新用户界面。对于菜单来说,不用保持菜单的状态的更新,只在显示的时候进行更新。
    这个方法较容易,也十分简单。更重要的是,它使数据从用户界面中分离出来。每个对象只存储它自己的状态-例如,文档知道什么时候处于只读模式。UI能解释出现的各种状态,你不想低级对象调用类似EnableMenu的UI函数!MFC提供一个UI更新机制来实现后一种方法,详细的方法描述因为内容太多,将在另文中讨论,其基本思路是这样的:当用户调用一个菜单的时候,Windows发送一个WM_INITMENUPOPUP消息。MFC创建一个暂时的CCmdUI对象处理这个消息,为每一个菜单项做连续初始化并将它传递到应用程序中的对象。MFC为此调用ON_UPDATE_COMMAND_UI消息处理器更新用户界面:
ON_UPDATE_COMMAND_UI(ID_FOO, OnUpdateFoo)
    只要用户进入包含Foo的菜单项,MFC就会调用OnUpdateFoo函数。你不必担心必须调用::EnableMenuItem(第一种方法)的所有地方;要做的只是从程序状态确定菜单状态。典型的处理方法如下:
void CMainFrame::OnUpdateFoo(CCmdUI* pCmdUI) { pCmdUI->Enable(pObj->GetFoo()); } 
    GetFoo()是个假设的函数,它获得某个对象的foo状态-例如,m_pDocument->GetReadOnly()。可能有20函数来修改foo状态(自然是通过方法SetFoo),但更新菜单的地方只有一处。当然有可能是更复杂的情形,如:
pCmdUI->Enable(m_bFoo && (GetStatusX(...) || GetStatusY(...)));