当前位置: 首页 > 图文教程 > 开发语言 > VC++ > 动态菜单项、状态条提示、工具条提示问题

VC++
关于内联汇编的几个技巧
const使用详解
为什么要在operator=中返回*this的引用
如何在派生类中的隐藏基类的虚拟重载函数?
C++指针使用方法解惑
如何用编程获取CD-ROM的驱动器盘符?
声明函数指针并实现回调
定义函数对象
在名字空间中声明类和成员函数
自制性能测试类
为什么operator=操作符返回引用
单实例设计模式的实现
初始化类对象
C++编程杂谈之三:面向对象(续)
C++编程杂谈之二:面向对象
C++编程杂谈之一:编译器
解析动态联编(上篇) - 作者:tingya
解析动态联编(下篇) - 作者:tingya
创建和访问环境变量
在预先定义的内存位置构造一个对象

VC++ 中的 动态菜单项、状态条提示、工具条提示问题


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

动态菜单项、状态条提示、工具条提示问题
赵湘宁
本文例子代码
问题的提出:
一个应用程序想要动态改变菜单项。使用CCmdUI::SetText("Menu Text")可以改变菜单文本,但是如何动态改变工具条和状态条的文本呢?

有几种策略,避免,欺骗,面对......
首先,避免:为什么你非要动态改变菜单项?一般说来,这是个坏主意,动态菜单容易把人搞糊涂。我正在使用你的产品,本来用得好好的突然菜单项变了。不管什么时候,每当我看到一个改变菜单的应用时,都要琢麽为什么他们需要这样的用户界面设计。

然而,每一个规则都有例外,许多例子的动态改变菜单项都很酷。例如,在大多数面向文档的应用程序中“文件”菜单的最后一项MRU(最近使用的文件列表)。但作为一个用户,面对动态菜单项的弊端是显而易见的。我把避免动态菜单提升为设计准则。即便是采用了动态菜单的设计,也要让用户注意不到菜单项是改变,否则,It''s bad design。反之,如果用户注意不到菜单项的改变,It''s OK。

但是动态改变状态条提示又如何呢?在MRU菜单中,无论什么文件,状态条一般都提示“打开选择的文档”。这是另一个要避免的策略。只有特别本位或任性的程序员会操心实现一个动态提示的菜单,如:“打开某某文件”,而不去用完全可行并且有效的提示“打开这个文档”。你完全有权利不遵循这种惯例,也就是说,如果你非要改变状态条提示的话,那就请往下继续看吧,你会明白的。

使用动态菜单的另一场合是当你想设置某个布尔状态时。例如,隐藏或显示工具条,当工具条可见时显示“隐藏工具条”,反之显示“显示工具条”。更为普通的方法是用单个命令以校验标记来实现,当工具条可见时显示标记(如下图)。

GUI的高手们常常争论哪种方法更好。可能它没有什么差别,但是即使你决定使用动态提示(如隐藏/显示工具条),你也能使用单个的命令ID,ID_VIEW_TOOLBAR,和单个的提示“隐藏或显示工具条”。我认为没有必要去实现动态提示。

在所有建议中,你要做的第一件事情是好好重新考虑用户的界面。你确实需要动态菜单项吗?以及你确实需要菜单的动态提示吗?除非两个问题的答案都是“是”。否则就止住,别再浪费时间。

要改变菜单文本是容易的。只要实现ON_UPDATE_COMMAND_UI处理器并调用CCmdUI::SetText即可:

void CFrameWnd::OnUpdateToolbar(CCmdUI* pCmdUI)
{
BOOL bVisible = IsToolbarVisible(...);
// Note same mnemonic (&T) for both cmds!
pCmdUI->SetText(bVisible ? "Hide &Toolbar" : "Show &Toolbar");
}

仅此而已。下一步是提示。当你创建了一个菜单提示,你给它一个ID号。MFC使用这个ID来查找资源串获取命令提示。例如:

STRINGTABLE DISCARDABLE
BEGIN
ID_VIEW_TOOLBAR "Show or hide the toolbar\nToggle ToolBar"
END

如果你的菜单命令也有工具条按钮,MFC用“\n”(新行标记)后的文本作为工具条提示文本。因为MFC允许每个命令只能有一个串,如何动态改变提示呢?最简单的方法是编写一个提示在两种情况下都工作,象前面讨论的隐藏、显示工具条的例子。但这种方法显得很笨拙。

获得动态提示的一个方法是将命令分成几个命令-例如,ID_HIDE_ TOOLBAR 和ID_SHOW_TOOLBAR,只是一种欺骗策略。这些命令的命令处理器最终要做的事情是改变菜单项的ID为其它命令项的ID。具体实现细节我就不讲了,自己做吧。

使用两个ID可能是一种简单的方法,但它不适用于所有情况。例如在MRU文件菜单中,对于每个可能的文件名字你会需要不同的ID。