InsertMenuで追加したメニューの選択メッセージを受け取るには?

解決


どら  2007-11-28 17:19:15  No: 67012

いつもくだらない質問でスミマセン。

VC2005.NET Team Edition + Win XP Pro SP2で開発しています(SDKです)。

InsertMenu関数で追加されたメニューについてなのですが、条件により動的に不
特定数のメニューが作成されるような場合、これをウインドウ/ダイアログプロシ
ージャで、

switch( uMsg )
{
    ・・・
    case WM_COMMAND:
  switch(LOWORD(wParam))
        {
            case メニューのID:
        }
}

と言う形でメニュー選択のメッセージを受け取ると思うのですが、不特定数のメ
ニューをInsertMenu関数で作成(例えばID = 50000 から1ずつインクリメントし
て登録)されたメニューが選択されたときにどの様にしてメッセージを受け取れば
いいのか思いつかず・・・

私が思いついたのが(50000 から n個のメニューを作成したとして)

    case WM_COMMAND:
        for(WORD i = 50000; i < 50000 + n; i++)
        {
             if(LOWORD(wParam) = i)
             {
                   //やりたい処理
             }
        }
  switch(LOWORD(wParam))
        {
            case メニューのID:
        }

と言うように、ループでひっかけるくらいしか思い浮かばなかったのですが・・・

これで本当によいのか、他にもっと理想的な方法がないのかをアドバイスいただ
きたく・・・

よろしくお願いいたします!!


どら  2007-11-28 17:20:41  No: 67013

あ、訂正を一つ

    ×LOWORD(wParam) = i
    →LOWORD(wParam) == i


maru  2007-11-28 18:50:05  No: 67014

メニュー項目とIDの対応関係が固定化されているのであれば、メッセージループ
を変更する必要はない。通常のメニューIDと同じようにswitch-caseで処理すれ
ばよい。
メッセージループで受け取るIDはInsertMenu関数で挿入されたものか、
LoadMenu関数で作成したものであるか関係しない。

InsertMenu関数で挿入するメニュー項目とIDの対応関係が固定化されていない
(納入する順序でIDが変わる)のであれは、メニュー項目とIDの対応関係のテ
ーブルをメニューの挿入時に作成しているはず。
対応としてはメニュー項目とIDの対応関係のテーブルにさらに処理を行なう関
数のアドレスを追加しておき、メッセージループではIDの範囲をチェックし、
そのIDに応じて表引きを行ない、関数呼び出しを行なう方法が高速に処理でき
ると思う。
# 具体例は関数ポインタの宣言方法がチョット出てこないので省略。


夏みかん  2007-11-29 01:38:45  No: 67015

> # 具体例は関数ポインタの宣言方法がチョット出てこないので省略。
IDが不連続なら表引きのテーブルが無駄になり、メモリ効率を悪くするかも。

でもその場合はIDと関数ポインタを関連付けたテーブル(構造体)を用意して
バイナリ探索などでテーブルを探して関数ポインタの関数を呼び出せばよい。

また、この方法ならば動的にメニューを作成/変更したときにテーブルごと
切り替えればより管理しやすかったり、検索もリニア探索でも可能となる。

まぁ、こんな感じかな。
あとは自由に実装すればいいと思うよ。


maru  2007-11-29 02:54:41  No: 67016

> IDが不連続なら表引きのテーブルが無駄になり、メモリ効率を悪くするかも。
「例えばID = 50000 から1ずつインクリメントして登録」って書いてあるでしょ。

> でもその場合はIDと関数ポインタを関連付けたテーブル(構造体)を用意して
> バイナリ探索などでテーブルを探して関数ポインタの関数を呼び出せばよい。
ということを後半に書いたつもりだったが、書き方が悪かったかな。

単純な関数ポインタの表引きにするか、構造体テーブルの検索にするかはメモリ/
速度のトレードオフ。どっちにしたって今回の場合たいした違いは出ないけどね。


maru  2007-11-29 03:01:00  No: 67017

自分>
> ということを後半に書いたつもりだったが、書き方が悪かったかな。
どのへんが後半なんだか。ここは読み飛ばして下さい。


どら  2007-12-22 03:05:41  No: 67018

maruさん、夏みかんさん

ありがとうございました。
結局switch分の前にループを使ってリニアに検索するコトにしました。


どら  2007-12-22 03:05:45  No: 67019

maruさん、夏みかんさん

ありがとうございました。
結局switch分の前にループを使ってリニアに検索するコトにしました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加