いつもくだらない質問でスミマセン。
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:
}
と言うように、ループでひっかけるくらいしか思い浮かばなかったのですが・・・
これで本当によいのか、他にもっと理想的な方法がないのかをアドバイスいただ
きたく・・・
よろしくお願いいたします!!
あ、訂正を一つ
×LOWORD(wParam) = i
→LOWORD(wParam) == i
メニュー項目とIDの対応関係が固定化されているのであれば、メッセージループ
を変更する必要はない。通常のメニューIDと同じようにswitch-caseで処理すれ
ばよい。
メッセージループで受け取るIDはInsertMenu関数で挿入されたものか、
LoadMenu関数で作成したものであるか関係しない。
InsertMenu関数で挿入するメニュー項目とIDの対応関係が固定化されていない
(納入する順序でIDが変わる)のであれは、メニュー項目とIDの対応関係のテ
ーブルをメニューの挿入時に作成しているはず。
対応としてはメニュー項目とIDの対応関係のテーブルにさらに処理を行なう関
数のアドレスを追加しておき、メッセージループではIDの範囲をチェックし、
そのIDに応じて表引きを行ない、関数呼び出しを行なう方法が高速に処理でき
ると思う。
# 具体例は関数ポインタの宣言方法がチョット出てこないので省略。
> # 具体例は関数ポインタの宣言方法がチョット出てこないので省略。
IDが不連続なら表引きのテーブルが無駄になり、メモリ効率を悪くするかも。
でもその場合はIDと関数ポインタを関連付けたテーブル(構造体)を用意して
バイナリ探索などでテーブルを探して関数ポインタの関数を呼び出せばよい。
また、この方法ならば動的にメニューを作成/変更したときにテーブルごと
切り替えればより管理しやすかったり、検索もリニア探索でも可能となる。
まぁ、こんな感じかな。
あとは自由に実装すればいいと思うよ。
> IDが不連続なら表引きのテーブルが無駄になり、メモリ効率を悪くするかも。
「例えばID = 50000 から1ずつインクリメントして登録」って書いてあるでしょ。
> でもその場合はIDと関数ポインタを関連付けたテーブル(構造体)を用意して
> バイナリ探索などでテーブルを探して関数ポインタの関数を呼び出せばよい。
ということを後半に書いたつもりだったが、書き方が悪かったかな。
単純な関数ポインタの表引きにするか、構造体テーブルの検索にするかはメモリ/
速度のトレードオフ。どっちにしたって今回の場合たいした違いは出ないけどね。
自分>
> ということを後半に書いたつもりだったが、書き方が悪かったかな。
どのへんが後半なんだか。ここは読み飛ばして下さい。
maruさん、夏みかんさん
ありがとうございました。
結局switch分の前にループを使ってリニアに検索するコトにしました。
maruさん、夏みかんさん
ありがとうございました。
結局switch分の前にループを使ってリニアに検索するコトにしました。
ツイート | ![]() |