オーナー描画メニュー クラスを定義しました。このクラスでは、この記事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が、渡されたメニューポインターは使用されていないようです(アサーションを引き起こし、失敗するだけです)。
だから私の質問は、システムメニューをどこでどのようにサブクラス化するのですか?