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