2017-09-05 3 views
0
私はこのラインで私のMFCアプリケーションのビューをintialize

ためMFCメニューをカスタムドロー:ハウツーDocTemplate

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

IDR_MAINFRAMEは私MAINMENUの識別子です。 このメニューをカスタムで作成する最も良い方法は何ですか?私は既にコンテキストメニューのための素晴らしい仕事をするCMenuから派生するクラスを持っています。違いは、このメニューはフレームワークによって作成されますが、自分でコンテキストメニュを作成することです。

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

を、何とか(ポップアップしている)最初の項目について、MeasureItemをクリックし、小さな広場で、その結果、customMenuクラスのインスタンスで焼成されていない:MAINMENUを上書きする

は、私が試しました異なるボタンのテキストが互いに重なって表示されます。

MENUITEMは期待通りに表示されますが、すべてのPOPUPがサブメニュー(サブサブサブサブメニュー)に間違っている(読み込み:MeasureItemは呼び出されません)。 sub、subsub、およびsubsubsubmenusのMENUITEMSでは、フレームワークからMeasureItem呼び出しを受け取ります。

+0

私はMFCがDoc(サブ)メニューを動的に作成すると思います。 WM_INITMENUPOPUPをインターセプトしてそこからカスタム描画を作成しようとするかもしれません。 – VuVirt

+0

あなたの 'CMainFrame'はどのクラスから派生していますか?それが 'CFrameWndEx' |' CMDIFrameWndEx'で、 'CMFCMenubar'を使用しているのであれば、通常のメニューの動作がMFC Feature Packによってオーバーライドされるので、あなたが望むように動作しない可能性が高いでしょう。 – sergiol

答えて

0

ありがとうございます。私のCMenu派生クラスにバグがありました。私はcodeguruのコード例を使用しました。 ModifyMenuは、POPUPメニューの実際のIDではなく、POPUPメニューのID 0を送信します。 void CWnd::OnMeasureItem(...)は、測定するメニューを検索しますが、何も見つけません(ModifyMenuがそうするように指示したので0を探しますが、実際のP​​OPUPメニューには他のIDがあります)、NULLを返します。

  • 代わりに0を送信するのでは、IDとしてreinterpret_cast<UINT>(menu.GetSubMenu(i)->GetSafeHmenu())を送信する:あなたはメニューのセパレータを持っている場合、それは次のようにセパレータがID 0

    ソリューションがありましたので、測定するためのメニューがあります(wincore.cppのAFX_STATIC CMenu* AFXAPI _AfxFindPopupMenuFromID(CMenu* pMenu, UINT nID)はIDと同じ方法でチェックします)。

  • また、フラグMF_POPUPを追加します。
関連する問題