2017-09-05 70 views
0

我intialize我的MFC應用程序的視圖這一行:HOWTO自定義繪製一個MFC菜單的DocTemplate

CSingleDocTemplate pDocTemplate(
    new CSingleDocTemplate(
     IDR_MAINFRAME, 
     RUNTIME_CLASS(CMyDoc), 
     RUNTIME_CLASS(CMainFrame), 
     RUNTIME_CLASS(CMyDataView) 
    ) 
); 
AddDocTemplate(pDocTemplate); 

IDR_MAINFRAME是我的MainMenu標識符。 使這個菜單自定義繪製的最佳方式是什麼?我已經有了一門來自CMenu的課程,它對於contextmenus來說非常棒。不同之處在於我自己創建了我的contextmenus,而這個菜單是由框架創建的。

要覆蓋MainMenu的,我想:

customMenu.LoadMenu(IDR_MAINFRAME); 
customMenu.ChangeToOwnerDraw(customMenu, *m_MenuProperties); 
m_pMainWnd->SetMenu(&customMenu); 

,但不知何故,第一個項目(這是彈出窗口)時,MeasureItem沒有在customMenu類實例化解僱,導致在一個小廣場上點擊開啓和不同按鈕的文字相互重疊。

MENUITEMs按預期方式顯示,但對於每個子菜單(以及subsub和sububsubmenus)的POPUP,樣式錯誤(讀取:MeasureItem未調用)。對於sub,subsub和sububsubmenus中的MENUITEMS,我從框架接收一個MeasureItem調用。

+0

我想MFC會動態地創建Doc(子)菜單。你可以嘗試攔截WM_INITMENUPOPUP並從那裏自定義繪製它們。 – VuVirt

+0

你的'CMainFrame'派生自哪一類?如果它是'CFrameWndEx' |'CMDIFrameWndEx',並且您正在使用'CMFCMenubar',那麼您很可能無法按照您想要的方式工作,因爲MFC Feature Pack會覆蓋正常菜單的行爲。 – sergiol

回答

0

感謝您的評論。原來我在我的CMenu派生類中有一個錯誤。我使用了codeguru的代碼示例。 在那裏,ModifyMenu發送POPUP菜單的ID 0,而不是POPUP菜單的真實ID。 void CWnd::OnMeasureItem(...)搜索要測量的菜單,但找不到任何東西(它看起來是0,因爲ModifyMenu告訴他這樣做,但實際的POPUP菜單有一些其他ID),並返回NULL。如果你在你的菜單中分離器,它會找到衡量一個菜單,因爲隔板具有ID爲0

的解決方案如下:

  • 而不是發送0,發送reinterpret_cast<UINT>(menu.GetSubMenu(i)->GetSafeHmenu())作爲ID (wincore.cpp中的AFX_STATIC CMenu* AFXAPI _AfxFindPopupMenuFromID(CMenu* pMenu, UINT nID)以相同方式檢查ID)。
  • 另外,添加標誌MF_POPUP。