2012-04-28 13 views
3

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

私はウィンドウ用にOnInitMenu()ハンドラを作成しました。サブメニューを表示するにはpMenu->GetMenuItemInfo()を使用する予定でした。

ただし、これは動作するようには見えません。私が望むメニューを見つけるために、私はメニューコマンドIDを供給しなければなりません(私はそれをハードコード項目位置に満足いくものとは考えていません)。しかし、サブメニューを開くメニュー項目にはコマンドIDがありません。私はそのサブメニューの中に存在するメニューコマンドを得ることができますが、それでもメニュー自体はありません。

MF_BYPOSITIONに頼ることなく、メインメニューにネストされたサブメニューを見つけるにはどうすればよいですか?

答えて

2

答えは、あなたができないことです表示されます。コマンドIDを使用してメニューコマンドを検索することは、そのようなコードがメニュー項目を再配置するときに引き続き機能するため、理にかなっています。しかし、サブメニューであるメニュー項目は単にコマンドIDを持たない。

既知のメニューコマンドを使用してIDで検索し、そのコマンドの横に新しい項目を挿入する方法があります。しかし、まだメニューが必要です。

最後に、ファイルメニューのファイルリストにというファイルリストを埋め込むためにMFCが使用するコードを調べた結果、使用方法が終了しました。一般的な技術は、幾分日付が付けられたPaul DiLascia's Q & A column from Microsoft Systems Journalに記載されている。

1

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

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

+1

残念ながら、私はサブメニューの位置を指定する必要があります。つまり、メニュー項目を並べ替えるたびに、私が書いたコードが壊れることになります。だから私はそれを避けようとしているのです。 –

+0

新しいメニューを追加するたびに列挙型を作成してみてください。列挙型に追加するだけです。 そして、渡すべきインデックスは、サブメニューのインデックスです。パラメータは、メニューの実際のインデックスです。サブメニューの1つにアイテムを追加すると、メニューの順序は変更されません。 – jonathanrz

1

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

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

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

4

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

関連する問題