オーナー描画メニュー クラスを定義しました。このクラスでは、この記事MeasureItem
で定義されているシステム メニューの問題が考慮されます(つまり、メニューがシステム メニューであるかどうかに基づいてカスタム測定値を調整します)。しかし、私が抱えている問題は、システム メニューを正しいタイミングでサブクラス化することです。
現時点では、次のコード スニペットの両方を使用して、(overriden でCFrameWnd::LoadFrame
)サブクラス化を試みました。
試行 1:
mSysMenu
は のサブクラスであり、メニューをオーナー描画に自動的に設定するようにCMenu
オーバーライドさAttach
れています (bool パラメータは、システム メニューかどうかを通知するために渡されるだけです)。mSysMenu.Attach(GetSystemMenu(FALSE)->GetSafeHmenu(), true);
これは、タスクバー ボタンを右クリックすると失敗し、
wincore.cpp
(のCWnd::OnMeasureItem
) に 3 つのアサーションが生成され、所有者が描画した醜い変形したメニューが生成されます_AFX_THREAD_STATE
。ただし、タスクバーを右クリックする前に呼び出すTrackPopupMenu
と、すべてうまくいきます。OnLButtonDown
試行 2: これは同様に変形したメニュー測定を作成するだけですが、所有者が描いた試行の兆候はありません
CVSPMenu* sysMenu = (CVSPMenu*)CMenu::FromHandle(GetSystemMenu(FALSE)->GetSafeHmenu()); sysMenu->SetOwnderDrawn(true);
私も何かをしようとしましたOnInitMenuPopup
が、渡されたメニューポインターは使用されていないようです(アサーションを引き起こし、失敗するだけです)。
だから私の質問は、システムメニューをどこでどのようにサブクラス化するのですか?