>> 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入門トップに戻る













