5

表示される前にサブメニューを変更できるように、サブメニューを取得しようとしています。

そこでOnInitMenu()、ウィンドウのハンドラーを作成しました。pMenu->GetMenuItemInfo()そして、私はサブメニューを取得するために使用することを計画していました。

ただし、これが機能するようには見えません。必要なメニューを見つけるには、メニューコマンドIDを指定する必要があります(アイテムの位置をハードコーディングするのに十分だとは思いません)。ただし、サブメニューを開くメニュー項目にはコマンドIDがありません。そのサブメニュー内に存在するメニューコマンドを取得できますが、それでもメニュー自体がありません。

に依存せずに、メインメニューにネストされたサブメニューを見つけるにはどうすればよいMF_BYPOSITIONですか?

4

4 に答える 4

9

この同じ問題に対する私の解決策は、メニューを検索し、メニューの名前に基づいて位置を返すヘルパー関数を作成することでした。

int CEnviroView::FindMenuItem(CMenu* Menu, LPCTSTR MenuName) {
    int count = Menu->GetMenuItemCount();
    for (int i = 0; i < count; i++) {
        CString str;
        if (Menu->GetMenuString(i, str, MF_BYPOSITION) &&
            str.Compare(MenuName) == 0)
            return i;
    }
    return -1;
}
于 2016-02-18T14:23:39.770 に答える
3

答えはあなたができないということのようです。コマンドIDを使用してメニューコマンドを見つけることは、メニュー項目を再配置するときにそのようなコードが引き続き機能するため、非常に理にかなっています。ただし、サブメニューであるメニュー項目には、コマンドIDがありません。

1つの方法は、IDで検索できる既知のメニューコマンドを用意し、そのコマンドの横に新しい項目を挿入することです。ただし、それでも含まれているメニューが必要です。

私が最終的に使用したアプローチは、MFCが[ファイル]メニューの最近使用したファイルリストに入力するために使用するコードを調査した結果です。一般的な手法は、Microsoft SystemsJournalのPaulDiLasciaのQ&Aコラムに記載されています。

于 2012-04-29T01:28:55.350 に答える
2

メニュー項目を更新できるMFCコマンドルーティングを使用する方がはるかに簡単でしょうか。これがMDI/SDIアプリケーションの場合、無料で入手できます。そうでない場合は、更新メカニズムを実装する必要があります。

取り扱わないでくださいWM_INITMENU。を処理する必要がありWM_INITMENUPOPUPます。WM_INITMENUPOPUPポップアップしようとしているメニューへのポインタを配信します。

ハンドラーでは、すべてのメニューのUI更新メカニズムを使用して特定のメニュー項目をダイアログで更新できるようにするコードを記述できます。または、ハンドラーで変更する必要がある特定のメニュー項目への変更のみを処理できます。

于 2012-04-29T16:57:07.120 に答える
1

GetSubMenuクラスのメソッドを使用できますCMenu

http://msdn.microsoft.com/en-us/library/dtfc356x(v=vs.80).aspx

于 2012-04-28T16:39:38.933 に答える