2010-08-04 166 views
2

我有一個包含子菜單的菜單。如何在具有子菜單項的菜單項上打上覆選標記。 (Visual Studio 2008 C++/MFC)

例如:

  • 的Item1
  • 項目2
  • 項目3
    • 項目A
    • 項B

Item3在其下有項目。

在任何給定的時間1,2或應該檢查3下的項目。由於我沒有Item3的ID,所以當我嘗試設置對Item3的檢查以指示其子女中有一個複選標記時,我不得不使用MF_BYPOSITION指示符。如果選中A或B,Item3應該有複選標記。我能夠檢查項目1和2以及A和B - 但無法確定項目3。

我無法成功使用::CheckMenuItem()ModifyMenu()來設置複選標記。

有人可以指出一個成功的例子嗎?文件似乎表明它可以完成,但我一直無法做到。

編輯

這對於被設定爲一個DLG箱菜單中的菜單。菜單欄有三個項目 - 其中一個下降到上面顯示的內容。

請注意,它被用作右鍵單擊的彈出窗口,但我會採取任何建議以在任何情況下工作。

+0

這是一個彈出菜單或菜單欄的一部分? – flashk 2010-08-04 17:50:29

+0

@flashk查看編輯 – Tim 2010-08-04 18:09:47

回答

2

我以前做過這個彈出菜單。您需要按位置訪問子菜單,而不是ID。使用上述(三)項的例子是在位置2:

CMenu popupMenu; 
popupMenu.LoadMenu(IDR_MYMENU); 
popupMenu.GetSubMenu(0)->CheckMenuItem(2,MF_BYPOSITION|MF_CHECKED); 
. 
. 
. 
popupMenu.GetSubMenu(0)->TrackPopupMenu(...); 

不過,我還沒有在菜單欄的項目做到了這一點。

編輯由Tim的OP:

爲了完整

爲了得到它與菜單項工作,你必須得到HMENU

// MENU_POSITION is the zero based location of the menu you want to use. (file, edit, view, help... etc) 
HMENU mainMenu = ::GetMenu(m_hWnd); 
HMENU subMenu = GetSubMenu(mainMenu, MENU_POSITION); 
SetMenuState(subMenu); 
+0

那麼,它適用於我的彈出菜單/上下文菜單,但不適用於菜單欄之一。真是麻煩。有一種方法可以做到這一點,我還沒有嘗試過。 – Tim 2010-08-04 19:18:43

+0

我得到它的工作。問題在於我一直在通過HMENUs來採用一種常用的方法。根據它被調用的位置,它可以是右鍵單擊彈出菜單或框架的hmenu。按位置使用時不能對待相同的東西。所有其他設置都通過id工作。 – Tim 2010-08-04 20:05:51

1

幾分鐘前我也有類似問題 - 一個包含至少一個子菜單的標準MFC菜單欄,並且需要能夠向子菜單添加複選標記,當子菜單中的任一子項它EMS檢查。

最簡單的解決方案(對我來說)很簡單,就像在標準的OnUpdateMenuItem(CCmdUI * pCmdUI)調用中執行更新一樣簡單。在我的情況下,我使用ON_UPDATE_COMMAND_UI_RANGE()將一堆菜單ID提供給同一個更新調用,但主體對於單個ON_UPDATE_COMMAND_UI()映射是相同的。

我使用的代碼(編輯更加容易地插入到其他人的工作)是:

void CMyApp::OnUpdateMenu(CCmdUI* pCmdUI) 
{ 
    // Note, a submenu parent (which has no editable ID in the resource editor) has the SAME ID as the first child item 
    if (pCmdUI->m_nID == ID_FIRST_CHILD_MENU && pCmdUI->m_pSubMenu != NULL) { 
     // Get the child menu so we can see if any child items are checked 
     CMenu* pSubMenu = pCmdUI->m_pSubMenu; 
     BOOL fChildChecked = FALSE; 
     for (UINT i = 0; !fChildChecked && i < pSubMenu->GetMenuItemCount(); ++i) { 
     // Do something to decide if this child item should be checked... 
     UINT nChildID = pSubMenu->GetMenuItemID(i); 
     fChildChecked = IsThisChildChecked(nChildID); 
     } 

     // The POSITION of the current menu item is stored in pCmdUI->m_nIndex 
     CMenu* pMenu = pCmdUI->m_pMenu; 
     UINT flags = MF_BYPOSITION; 
     if (fActiveChild) flags |= MF_CHECKED; 
     pMenu->CheckMenuItem(pCmdUI->m_nIndex, flags); 
    } 

    // Set the enabled state of the menu item as you see fit... 
    pCmdUI->Enable(TRUE); 
} 

的Et瞧子菜單項自動地獲得複選標記,當任何其子菜單項有複選標記。

希望這可以幫助其他人尋找類似的解決方案!

約翰

+0

太好了 - 謝謝。我會試試看。 – Tim 2012-08-07 15:59:02

相關問題