>> WINAPI入門トップに戻る
今回はリストボックスの作成について説明します。
CreateWindowの第一引数に「listbox」を指定します。
ウィンドウスタイルにも専用のスタイルががあり、
LBS_SORTを指定するとリストアイテムが自動的にソートされます。
またリストボックスはデフォルトでリストを選択してもWM_COMMANDメッセージが送信されません。
LBS_NOTIFYスタイルを適用することでWM_COMMANDメッセージが発行されるようになります。
また、リストボックスの縦幅よりも沢山のアイテムを登録した場合、
WS_VSCROLLスタイルを適用しておくと、自動的にスクロールバーが表示されるようになります。
WS_BORDER、WS_VSCROLL、LBS_SORT、LBS_NOTIFYがセットになった
LBS_STANDARD というスタイルも用意されています。
下記のコードをご覧下さい。
これを実行すると下記のような画面が表示されます。
リストボックスにアイテムを追加するには、SendMessage関数を使い、
LB_ADDSTRINGメッセージを送信します。
追加する文字は上記のコードの通り、第四引数に指定します。
この方法を使った場合LBS_SORTスタイルを適用していた場合は、
追加したアイテムの文字に応じて適切に並び替えが行われます。
ちなみにLBS_SORTスタイルを適用していない場合は、
LB_INSERTSTRINGメッセージを送信してアイテムを追加します。
この場合は第三引数にインデックス番号を指定します。一つ目のアイテムのインデックス番号は0です。
他にも以下のメッセージがあります。
上記のコードでは、WM_COMMANDメッセージが発生した際に、
子ウィンドウIDを調べてリストボックスから発生したメッセージなのかどうかを確認し、
LB_GETCURSELで現在選択されているアイテムのインデックスを取得した後、
LB_GETTEXTでそのアイテムの文字列を取得しています。
その後、SetWindowTextを使って、ウィンドウのタイトルにアイテムの文字列を表示させています。
以上がリストボックスの作成についての説明になります。
次回はリストビューの作成について説明します。
>> 【リストビューの作成】に進む
>> WINAPI入門トップに戻る
リストボックスの作成
CreateWindowの第一引数に「listbox」を指定します。
ウィンドウスタイルにも専用のスタイルががあり、
LBS_SORTを指定するとリストアイテムが自動的にソートされます。
またリストボックスはデフォルトでリストを選択してもWM_COMMANDメッセージが送信されません。
LBS_NOTIFYスタイルを適用することでWM_COMMANDメッセージが発行されるようになります。
また、リストボックスの縦幅よりも沢山のアイテムを登録した場合、
WS_VSCROLLスタイルを適用しておくと、自動的にスクロールバーが表示されるようになります。
WS_BORDER、WS_VSCROLL、LBS_SORT、LBS_NOTIFYがセットになった
LBS_STANDARD というスタイルも用意されています。
下記のコードをご覧下さい。
#include <windows.h> #include <commctrl.h> #define MSG(m) {\ MessageBoxA(NULL,m,NULL,MB_OK);} //ウィンドウハンドル HWND hwnd; //インスタンスハンドル HINSTANCE hinst; //ウィンドウ横幅 #define WIDTH 500 #define HEIGHT 300 //ボタンウィンドウハンドル HWND hwnd_child; enum{ CHILD_ID=1 }; LRESULT CALLBACK WinProc(HWND hwnd,UINT msg,WPARAM wp,LPARAM lp) { char buf[50]; int index; switch(msg){ case WM_DESTROY: PostQuitMessage(0); return 0; case WM_COMMAND: //選択したボックスをウィンドウタイトルに設定 if(LOWORD(wp)==CHILD_ID){ memset(buf,0,sizeof(buf)); index=SendMessage(hwnd_child,LB_GETCURSEL,NULL,NULL); SendMessage(hwnd_child,LB_GETTEXT,index,(WPARAM)buf); SetWindowText(hwnd,buf); } } return DefWindowProc(hwnd,msg,wp,lp); } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) { MSG msg; WNDCLASS wc; wc.style=CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc=WinProc; wc.cbClsExtra=wc.cbWndExtra=0; wc.hInstance=hInstance; wc.hCursor=wc.hIcon=NULL; wc.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH); wc.lpszClassName="test"; wc.lpszMenuName=NULL; if(!RegisterClass(&wc)){ MSG("クラスの登録失敗"); return -1; } hwnd=CreateWindowA("test","テストウィンドウ",WS_VISIBLE | WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX, 0,0,WIDTH,HEIGHT,NULL,NULL,hinst,NULL); hwnd_child=CreateWindowA("listbox",NULL,WS_VISIBLE | WS_CHILD | LBS_SORT | LBS_NOTIFY | WS_VSCROLL, 20,20,200,50,hwnd,(HMENU)CHILD_ID,hInstance,NULL); //リストボックス追加 SendMessage(hwnd_child,LB_ADDSTRING,NULL,(WPARAM)"リスト1"); SendMessage(hwnd_child,LB_ADDSTRING,NULL,(WPARAM)"リスト2"); SendMessage(hwnd_child,LB_ADDSTRING,NULL,(WPARAM)"リスト3"); //インスタンスハンドル hinst=hInstance; //エラーチェック用変数 int check; while(check=GetMessage(&msg,NULL,0,0)){ if(check==-1){ break; } TranslateMessage(&msg); DispatchMessage(&msg); } //クラス解放 UnregisterClass("test",hinst); return 0; }
これを実行すると下記のような画面が表示されます。
リストボックスにアイテムを追加するには、SendMessage関数を使い、
LB_ADDSTRINGメッセージを送信します。
追加する文字は上記のコードの通り、第四引数に指定します。
この方法を使った場合LBS_SORTスタイルを適用していた場合は、
追加したアイテムの文字に応じて適切に並び替えが行われます。
ちなみにLBS_SORTスタイルを適用していない場合は、
LB_INSERTSTRINGメッセージを送信してアイテムを追加します。
この場合は第三引数にインデックス番号を指定します。一つ目のアイテムのインデックス番号は0です。
他にも以下のメッセージがあります。
メッセージ | 説明 |
---|---|
LB_GETTEXT | 指定したアイテムの文字列を取得する 第三引数に取得したいアイテムのインデックスを指定 |
LB_DELETESTRING | 選択したアイテムを削除する 第三引数に削除したいアイテムのインデックスを指定 |
LB_GETCURSEL | 現在選択されているアイテムのインデックスを取得 |
LB_SETCURSEL | 特定のアイテムを選択状態にする。 第三引数の選択したいアイテムのインデックスを指定 |
LB_GETCOUNT | 現在のアイテム数を取得 |
LB_GETTEXTLEN | 特定のアイテムの文字の長さを取得。 第三引数に該当アイテムのインデックスを指定 |
LB_RESETCONTENT | リストボックスを全て消去する |
上記のコードでは、WM_COMMANDメッセージが発生した際に、
子ウィンドウIDを調べてリストボックスから発生したメッセージなのかどうかを確認し、
LB_GETCURSELで現在選択されているアイテムのインデックスを取得した後、
LB_GETTEXTでそのアイテムの文字列を取得しています。
その後、SetWindowTextを使って、ウィンドウのタイトルにアイテムの文字列を表示させています。
以上がリストボックスの作成についての説明になります。
次回はリストビューの作成について説明します。
>> 【リストビューの作成】に進む
>> WINAPI入門トップに戻る