2016-10-24 6 views
1

のポップアップメニューだったツールバーボタンから呼び出されたときにOnInitMenuPopupが正しくinitをしません:、短い長い歴史を作る私のメインメニューがで定義されているメニューCMFCMenuBarで想像するアプリケーションのメインメニューバー

IDR_MAINFRAME MENU 
BEGIN 
    POPUP "&File" 
    BEGIN 
     MENUITEM "New",    ID_FILE_NEW 
     MENUITEM "Open",    ID_FILE_OPEN 
     MENUITEM "Save",    ID_FILE_SAVE 
     POPUP "Save As" 
     BEGIN 
      MENUITEM "Format XXX",     ID_FILE_SAVEAS_XXX 
      MENUITEM SEPARATOR 
      MENUITEM "Format YYY",     ID_FILE_SAVEAS_YYY 
      MENUITEM SEPARATOR 
      MENUITEM "Format ZZZ",     ID_FILE_SAVEAS_ZZZ 
      MENUITEM "Format WWW",     ID_FILE_SAVEAS_WWW 
     END 
     MENUITEM "Close",    ID_FILE_CLOSE 
    END 
    POPUP "&Object" 
    BEGIN 
     POPUP "Create object" 
     BEGIN 
      MENUITEM "Create object...",   ID_CREATE_OBJECT 
      MENUITEM "Create object as...",   ID_CREATE_OBJECTAS 
     END 
     POPUP "Save object" 
     BEGIN 
      MENUITEM "Save object...",    ID_SAVE_AS_XXX 
      MENUITEM "Save object copy",   ID_SAVE_OBJECT_COPY 
     END 
    END 
    MENUITEM "Delete",      ID_DELETE_OBJECT 
    END 
END 
ポップアップメニューは、私が初期化をやっているものをメニューに知るために、(それらすべてが値-1を持つ)はIDを持っていないので

は、私がhttps://stackoverflow.com/a/3910405/383779にアプローチを踏襲し、

bool CMainFrame::IsFileMenu(CMenu* pPopupMenu) const 
{ 
    if(!pPopupMenu);  
     return false; 
    return (pPopupMenu->GetMenuItemCount() > 0) && (pPopupMenu->GetMenuItemID(0) == ID_FILE_NEW); 
} 

bool CMainFrame::IsObjectMenu(CMenu* pPopupMenu) const 
{ 
    if(!pPopupMenu);  
     return false; 
    return (pPopupMenu->GetMenuItemCount() > 0) && (pPopupMenu->GetMenuItemID(2) == ID_DELETE_OBJECT); 
} 

メニューの初期化などの機能を実装しましたのようなもの:

void CMainFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) 
{ 
    if(!license.supports("SaveAsFile")) 
    { 
     if(IsFileMenu()) 
     { 
       //code to find ID_FILE_SAVEAS_XXX parent menu ("Save As"), then recursively delete all its descendants and itself 
     } 

     if(IsObjectMenu()) 
     { 
      for(int i = 0; i < pPopupMenu->GetMenuItemCount();i++) 
      { 
       MENUITEMINFO MenuItemInfo; 
       memset(&MenuItemInfo, 0, sizeof(MENUITEMINFO)); 
       MenuItemInfo.cbSize = sizeof (MENUITEMINFO); // must fill up this field 
       MenuItemInfo.fMask = MIIM_SUBMENU; 

       if (!pPopupMenu->GetMenuItemInfo(i, &MenuItemInfo, TRUE)) 
        continue; 

       CMenu* SubMenu = pPopupMenu->GetSubMenu(i); 

       if (SubMenu != NULL) 
       { 
        memset(&MenuItemInfo, 0, sizeof(MENUITEMINFO)); 
        MenuItemInfo.cbSize = sizeof (MENUITEMINFO); 
        MenuItemInfo.fMask = MIIM_ID | MIIM_TYPE; 

        for(int j=0; j<SubMenu->GetMenuItemCount() ;j++) 
        { 
         SubMenu->GetMenuItemInfo(j, &MenuItemInfo, TRUE); 

         if (MenuItemInfo.wID == ID_CREATE_OBJECTAS) 
         { 
          for (int i=0; i<m_custom_objects.GetSize(); i++) 
           pPopup->AppendMenu(MF_STRING | MF_ENABLED, WM_MENU_CUSTOM_OBJECTS_BEGIN + i, (LPCTSTR) m_custom_objects[i].GetName()); 

          found= true; 
          break; 
         } 
        } 

        if(found) 
         break; 
       } 
      }  
     } 
    } 

    __super::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu); 
} 

ID_FILE_SAVEAS_XXX MENUITEM識別子が繰り返されています。 "SaveAsFile"をサポートするライセンスがない場合、 "Save Object" POPUPを削除したくないので、現在処理中のメニューを特定することが絶対必要です。

ユーザーは、MFCの[カスタマイズ]ダイアログボックスを使用してツールバーを作成し、[オブジェクトの作成] POPUPを新しいツールバーにドラッグしました。ツールバーのこの新しいボタンをクリックすると、 "オブジェクトの作成"と "オブジェクトの作成"オプションが表示されますが、IsObjectMenu()の条件が満たされていないためカスタムオブジェクトが追加されませんでした。彼がメインメニューから来たときの行動は全く異なっていた。追加が完了しました!

ユーザーがツールバーのボタンをクリックしたときにカスタムオブジェクトを追加する方法でコードを作成するにはどうすればよいですか?

+0

[mcve]のポイントは、エラー条件を示す**最小**コードの例です。 – IInspectable

+0

@IInspectable:私の投稿は必須です。 – sergiol

+0

メニューリソースのコードは最小限ではありません。 – IInspectable

答えて

0

自分のコードは誇りではありませんが、「オブジェクト」のコードと「オブジェクトの作成」メニューを分けて解決しました。

bool CMainFrame::IsCreateObjectMenu(CMenu* pPopupMenu) const 
{ 
    if(!pPopupMenu);  
     return false; 
    return (pPopupMenu->GetMenuItemCount() > 0) && (pPopupMenu->GetMenuItemID(0) == ID_CREATE_OBJECT); 
} 


void CMainFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu) 
{ 
    if(!license.supports("SaveAsFile")) 
    { 
     if(IsFileMenu()) 
     { 
       //code to find ID_FILE_SAVEAS_XXX parent menu ("Save As"), then recursively delete all its descendants and itself 
     } 

     if(IsObjectMenu()) 
     { 
       // Do things 
     } 

     if(IsCreateObjectMenu()) 
     { 
      for (int i=0; i<m_custom_objects.GetSize(); i++) 
       pPopupMenu->AppendMenu(MF_STRING | MF_ENABLED, WM_MENU_CUSTOM_OBJECTS_BEGIN + i, (LPCTSTR) m_custom_objects[i].GetName()); 
     } 
    } 

    __super::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu); 
} 
関連する問題