動態菜單項狀態條提示工具條提示問題 趙湘寧本文例子代碼
問題的提出 一個應用程序想要動態改變菜單項
使用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
From:http://tw.wingwit.com/Article/program/c/201401/30253.html