戻る 第9章 コントロールの使用
(リストボックス)
次へ

ソース 実行ファイル
sdk09.cpp sdk09.exe

コントロールの2回目はリストボックスです。
ボタンについで使用頻度が高いと思います。
しかし今度は結構できる事が多い分複雑です。

ここではその中でも最低限必要な部分を説明します。
それは追加・削除・選択です。
メッセージ 効果
LB_ADDSTRING
wParam = 0;/* 使われません。0でなければなりません*/
lParam = (LPARAM) (LPCSTR) lpsz;/* 追加される文字列のアドレス*/
項目の追加
LB_DELETESTRING
wParam = (WPARAM) index;/* 削除する項目*/
lParam = 0;/* 使われません。0でなければなりません*/
項目の削除
LB_GETCURSEL
wParam = 0;/* 使われません。0でなければなりません*/
lParam = 0;/* 使われません。0でなければなりません*/
選択の取得
LB_SETCURSEL
wParam = (WPARAM) index;/*項目インデックス*/
lParam = 0;/* 使われません。0でなければなりません*/
項目の選択
これだけならかなり簡単に出来そうですね。 しかしなんだかまた変わったものが書いてますね [wParam][lParam]これはメッセージと一緒に渡される値が入っています。 関数の引数みたいなもので,詳細が決まります。 SendMessage(list, LB_ADDSTRING, 0L, (LPARAM)"いちご"); こうすることにより「ハンドルがlistのWindowへ"いちご"と言う項目を追加する」 というメッセージを送ることになります。 #include <windows.h> LRESULT CALLBACK WinProc(HWND hwnd, UINT msg,WPARAM wP, LPARAM lP) { HDC hdc; PAINTSTRUCT ps; char str[40]; switch(msg){ case WM_CREATE: list=CreateWindowEx(0, "LISTBOX", //リストボックスクラスを指定 "",//空白にする WS_CHILD|WS_BORDER|WS_VSCROLL|LBS_NOTIFY,//子Window指定・メッセージ取得指定 24, 8,128, 96,//リストボックスのサイズ hwnd, NULL,//IDはいらない (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE), NULL);//プロシージャ ShowWindow(list,SW_SHOW);//リストボックスを表示 //リストボックスに項目を追加する SendMessage(list, LB_ADDSTRING, 0L, (LPARAM)"いちご"); SendMessage(list, LB_ADDSTRING, 0L, (LPARAM)"バナナ"); SendMessage(list, LB_ADDSTRING, 0L, (LPARAM)"みかん"); SendMessage(list, LB_ADDSTRING, 0L, (LPARAM)"りんご"); SendMessage(list, LB_ADDSTRING, 0L, (LPARAM)"ゆず"); SendMessage(list, LB_ADDSTRING, 0L, (LPARAM)"桃"); //追加・削除・選択のボタンを描画 btn[0]=CreateWindowEx(0,"BUTTON","追加",WS_CHILD, 164, 8,64, 32,hwnd,(HMENU)ID_BTN1, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),NULL); ShowWindow(btn[0],SW_SHOW); btn[1]=CreateWindowEx(0,"BUTTON","削除",WS_CHILD, 164, 40,64, 32,hwnd,(HMENU)ID_BTN2, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),NULL); ShowWindow(btn[1],SW_SHOW); btn[2]=CreateWindowEx(0,"BUTTON","選択",WS_CHILD, 164, 72,64, 32,hwnd,(HMENU)ID_BTN3, (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE),NULL); ShowWindow(btn[2],SW_SHOW); break; case WM_COMMAND: switch ( LOWORD ( wP ) ) { case ID_BTN1://「追加」と言う項目を入れる SendMessage(list, LB_ADDSTRING, 0L, (LPARAM)"追加"); break; case ID_BTN2://最後の項目を削除する。 SendMessage(list, LB_DELETESTRING, SendMessage(list, LB_GETCOUNT, 0L, 0L)-1, 0L); break; case ID_BTN3://現在選択している番号を取得 i=SendMessage(list, LB_GETCURSEL, 0L, 0L); if(i!=LB_ERR){ wsprintf(str,"%dが選択されました。",i); MessageBox(hwnd,str,"BUTTON",MB_OK); } else{ MessageBox(hwnd,"項目を選択してください","BUTTON",MB_OK); } break; } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd, msg, wP, lP); } return 0; } これでリストボックスの操作はとりあえず出来ます。 ボタンと違って応答はハンドルとメッセージですると言うことを注意してください。 復習問題: 1.リストボックスに0~255の数字を入れましょう。(ループを使用して) 2.リストボックスをもう一つ出しましょう