电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

动态菜单项、状态条提示、工具条提示问题


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

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

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

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

使用动态菜单的另一场合是当你想设置某个布尔状态时例如隐藏或显示工具条当工具条可见时显示隐藏工具条反之显示显示工具条更为普通的方法是用单个命令以校验标记来实现当工具条可见时显示标记(如下图) GUI的高手们常常争论哪种方法更好可能它没有什么差别但是即使你决定使用动态提示(如隐藏/显示工具条)你也能使用单个的命令IDID_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

上一篇:使用VC6.0实现窗口的任意分割

下一篇:椭圆窗体的实现