2011-06-17 59 views
8

我有一個帶有各種菜單項的菜單,就像您通常那樣。每個MenuItem(按鈕)都有一個標題,我想在運行時更改該標題。在一個沒有問題的正常按鈕上,我只是撥打GetDlgItem(ID)->SetWindowText(CString);在運行時更改MenuItem標題

但是我不能在菜單項上這樣做,因爲我無法將ID分配給它們中的任何一個。屬性編輯器中的ID字段實際上顯示「ID無法編輯」。

那麼如何在運行時更改菜單項文本?

編輯:我試過使用CMenu :: ModifyMenu但是我一直不成功。我不知道如何指定按鈕(元素)進行更改。另外,我對CString作爲參數傳遞方式的正確性持懷疑態度。

這是我的(失敗)的嘗試:

CString str = "Foo"; 
CMenu * pMenu = m_wndToolBar.GetMenu(); 
pMenu->ModifyMenu(1, MF_BYPOSITION | MF_STRING, 0 /*Don't know what to pass as nIDNewItem */, str); 

這(在調用ModifyMenu方法)拋出一個調試斷言錯誤。請不要說我不知道​​什麼nIDNewItem。

回答

0

菜單不是窗口,它們是菜單。您不能使用GetDlgItem訪問菜單。

在MFC中,CMenu類可用於創建和/或控制菜單。 CMenu::ModifyMenu可能是你正在尋找的東西。

+0

謝謝你的回答。我之前偶然發現了CMenu :: ModifyMenu,但是我沒有成功更改標題。請看我編輯的問題!謝謝! – 2011-06-22 11:27:20

4

您可以嘗試爲菜單選項添加一個ON_UPDATE_COMMAND_UI處理程序,並在其中調用pCmdUI->SetText()

0

您確定撥打GetMenu正在返回有效的CMenu嗎?請嘗試撥打GetMenu()而不是m_wndToolBar.GetMenu()

您的電話修改菜單似乎是正確的,如果你通過一個MF_BYPOSITION你不需要第三個參數。另請注意,第一個參數(位置)從0開始。

5

您應該首先獲取菜單項的命令ID。試試這個:

tr = L"Foo"; 
CMenu * pMenu = m_wndToolBar.GetMenu(); 
MENUITEMINFO info; 
info.cbSize = sizeof(MENUITEMINFO); 
info.fMask = MIIM_ID; 
VERIFY(pMenu->GetMenuItemInfo(1, &info, TRUE)); 
pMenu->ModifyMenuW(info.wID, MF_BYCOMMAND | MF_STRING, info.wID, tr);