0

オーナー描画メニュー クラスを定義しました。このクラスでは、この記事MeasureItemで定義されているシステム メニューの問題が考慮されます(つまり、メニューがシステム メニューであるかどうかに基づいてカスタム測定値を調整します)。しかし、私が抱えている問題は、システム メニューを正しいタイミングでサブクラス化することです。

現時点では、次のコード スニペットの両方を使用して、(overriden でCFrameWnd::LoadFrame)サブクラス化を試みました。

  1. 試行 1:mSysMenuは のサブクラスであり、メニューをオーナー描画に自動的に設定するようにCMenuオーバーライドさAttachれています (bool パラメータは、システム メニューかどうかを通知するために渡されるだけです)。

    mSysMenu.Attach(GetSystemMenu(FALSE)->GetSafeHmenu(), true);
    

    これは、タスクバー ボタンを右クリックすると失敗し、wincore.cpp(のCWnd::OnMeasureItem) に 3 つのアサーションが生成され、所有者が描画した醜い変形したメニューが生成されます_AFX_THREAD_STATE。ただし、タスクバーを右クリックする前に呼び出すTrackPopupMenuと、すべてうまくいきます。OnLButtonDown

  2. 試行 2: これは同様に変形したメニュー測定を作成するだけですが、所有者が描いた試行の兆候はありません

    CVSPMenu* sysMenu = (CVSPMenu*)CMenu::FromHandle(GetSystemMenu(FALSE)->GetSafeHmenu());
    sysMenu->SetOwnderDrawn(true);
    

私も何かをしようとしましたOnInitMenuPopupが、渡されたメニューポインターは使用されていないようです(アサーションを引き起こし、失敗するだけです)。

だから私の質問は、システムメニューをどこでどのようにサブクラス化するのですか?

4

1 に答える 1