リストボックス


アイテムの列挙

ファイルや何らかの選択項目の列挙は
リストボックスコントロールを用いると便利です

リストボックスコントロールの生成には、CreateWindow() 関数の
ウィンドウクラスの指定で定義済みウィンドウクラス LISTBOX を指定します

リストボックスはデフォルトで WM_COMMAND を親ウィンドウに送りません
そこで、LBS_NOTIFY をスタイルとして指定するのが一般的です
また、LBS_SORT を指定することで、リストアイテムの表示時
アイテムは自動的にソートされて表示されるので便利です

デフォルトの状態で、リストボックスに枠線は描画されません
枠が必要な場合は WS_BORDER を指定します
WS_VSCROLL を指定すれば、リストボックスのサイズよりアイテム数が多い時
マウスでリストボックスをスクロールできるようになります

これらのリストボックスの基本動作となるスタイル
(WS_BORDER | WS_VSCROLL | LBS_SORT | LBS_NOTIFY) の組み合わせは
LBS_STANDARD という定数にまとめて定義されています

リストボックスを生成すると、最初はからの状態です
これに、選択対象となるアイテムを挿入するには LB_ADDSTRING メッセージを使い
特定の文字列をリストボックスに追加します
WPARAM には 0 を、LPARAM に追加する項目の文字列へのポインタを指定します

このメッセージは、LBS_SORT スタイルが使用されているリストボックスに便利で
LPARAM に、文字列へのポインタを渡すだけで自動的に適切な位置に挿入されます

LBS_SORT が指定されていない場合などで
特定の位置を明示して選択アイテムを挿入したい場合
LB_INSERTSTRING メッセージを送信します

このメッセージは WPARAM に挿入する位置を示すインデックスを
LPARAM に、挿入する文字列へのポインタを指定します

リストボックスの全てのアイテムはインデックスとして管理されます
最上段のアイテムのインデックスを 0 として、1ずつ増えていきます
選択されているアイテムや、削除などの操作もインデックスで指定するので
文字配列と照らし合わせるような処理には非常に便利です

これらのメッセージの戻り値は、文字列が挿入されたインデックスになります
失敗すると LB_ERR
保存スペースを確保できなかった場合は LB_ERRSPACE が返ります
#include <windows.h>

LPCTSTR strText[] = {
	TEXT("Kitty on your lap") ,
	TEXT("Tokyo mew mew") ,
	TEXT("Magical nyan nyan TARUTO") ,
	TEXT("Di Gi Charat") ,
	TEXT("Nekoneko Zoo")
};

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
	static HWND sortList , nonSortList;
	int i;

	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		sortList = CreateWindow(
			TEXT("LISTBOX") , NULL , 
			WS_CHILD | WS_VISIBLE | LBS_STANDARD , 
			0 , 0 , 200 , 100 , hwnd , (HMENU)1 ,
			((LPCREATESTRUCT)(lp))->hInstance , NULL
		);
		for (i = 0 ; i < 5 ; i++)
			SendMessage(sortList , LB_ADDSTRING , 0 , (LPARAM)strText[i]);

		nonSortList = CreateWindow(
			TEXT("LISTBOX") , NULL , 
			WS_CHILD | WS_VISIBLE | WS_BORDER , 
			200 , 0 , 200 , 100 , hwnd , (HMENU)1 ,
			((LPCREATESTRUCT)(lp))->hInstance , NULL
		);
		for (i = 0 ; i < 5 ; i++)
			SendMessage(nonSortList ,
				LB_INSERTSTRING , i , (LPARAM)strText[i]
			);
		return 0;
	}
	return DefWindowProc(hwnd , msg , wp , lp);
}

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow ) {
	HWND hwnd;
	MSG msg;
	WNDCLASS winc;

	winc.style		= CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc	= WndProc;
	winc.cbClsExtra	= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("KITTY");

	if (!RegisterClass(&winc)) return -1;

	hwnd = CreateWindow(
			TEXT("KITTY") , TEXT("Kitty on your lap") ,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			NULL , NULL , hInstance , NULL
	);

	if (hwnd == NULL) return -1;

	while(GetMessage(&msg , NULL , 0 , 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}


これがリストボックスです
色が反転している部分が、現在選択されているアイテムです

左側のリストボックスは、自動的にソートされます
実際に挿入した順番と異なり、アイテムがソートされています
逆に、右側はソートされないリストボックスです
さらに、LB_INSERTSTRING によってアイテムを配列準に挿入しています

選択されているアイテムのインデックスを得るには LB_GETCURSEL メッセージを送ります
パラメータには両方とも 0 を指定します
現在選択されているインデックスが返りますが、選択されていない場合は LB_ERR になります

リストに追加したアイテムを削除するには LB_DELETESTRING を使います
これは、WPARAM に削除するインデックスを指定し、LPARAM は 0 を指定します
指定した値が有効でなかった場合 LB_ERR が返ります

リストボックスの内容をクリアするには LB_RESETCONTENT メッセージを送ります
パラメータは両方とも 0 を指定してください。戻り値はありません
#include <windows.h>

LPCTSTR strText[] = {
	TEXT("Kitty on your lap") ,
	TEXT("Tokyo mew mew") ,
	TEXT("Magical nyan nyan TARUTO") ,
	TEXT("Di Gi Charat") ,
	TEXT("Nekoneko Zoo")
};

enum 	{ BID_DEL = 2 , BID_RESET };

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
	static HWND list;
	int i;

	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		list = CreateWindow(
			TEXT("LISTBOX") , NULL , 
			WS_CHILD | WS_VISIBLE | LBS_STANDARD , 
			0 , 0 , 200 , 100 , hwnd , (HMENU)1 ,
			((LPCREATESTRUCT)(lp))->hInstance , NULL
		);
		for (i = 0 ; i < 5 ; i++)
			SendMessage(list , LB_ADDSTRING , 0 , (LPARAM)strText[i]);

		CreateWindow(
			TEXT("BUTTON") , TEXT("削除") , 
			WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 
			200 , 0 , 100 , 30 , hwnd , (HMENU)BID_DEL ,
			((LPCREATESTRUCT)(lp))->hInstance , NULL
		);
		CreateWindow(
			TEXT("BUTTON") , TEXT("リセット") , 
			WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON , 
			200 , 30 , 100 , 30 , hwnd , (HMENU)BID_RESET ,
			((LPCREATESTRUCT)(lp))->hInstance , NULL
		);
		return 0;
	case WM_COMMAND:
		switch(LOWORD(wp)) {
		case BID_DEL:
			SendMessage(list , LB_DELETESTRING ,
				SendMessage(list , LB_GETCURSEL , 0 , 0) , 0);
			break;
		case BID_RESET:
			SendMessage(list , LB_RESETCONTENT , 0 , 0);
			break;
		}
		return 0;
	}
	return DefWindowProc(hwnd , msg , wp , lp);
}

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow ) {
	HWND hwnd;
	MSG msg;
	WNDCLASS winc;

	winc.style		= CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc	= WndProc;
	winc.cbClsExtra	= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("KITTY");

	if (!RegisterClass(&winc)) return -1;

	hwnd = CreateWindow(
			TEXT("KITTY") , TEXT("Kitty on your lap") ,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			NULL , NULL , hInstance , NULL
	);

	if (hwnd == NULL) return -1;

	while(GetMessage(&msg , NULL , 0 , 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
「削除」ボタンを押すと、選択されているアイテムがリストから削除されます
「リセット」ボタンを押せば、リスト内が空の状態になります

また、プログラムによっては大量のデータを一度に追加したり
または削除したりすることがあると思います
リストボックスは、追加や削除があると即座にリスト内を再描画します
しかし、大量のデータを追加/削除する時は全ての動作が終わってから再描画したほうが合理的です

その場合は WM_SETREDRAW メッセージを送ります
WPARAM に FALSE を指定すると、その後リストボックスは再描画処理をしません
WPARAM に TRUE を指定すれば、再び描画されるようになります
LPARAM には 0 を、戻り値は 0 になります

リストボックスのアイテム数を調べるには LB_GETCOUNT を使います
パラメータは両方とも 0 を指定します
戻り値は、アイテム数です。失敗した場合は LB_ERR です

リストボックス内の文字列の長さを知るには LB_GETTEXTLEN を使います
例えば、リストの文字列をファイルに保存する場合などで
リストボックス内の文字列分のメモリを確保するのに用いたりすることがあります
ただし、ヌル文字は含まれないので注意してほしい

WPARAM には文字数を取得したいインデックスを指定します
LPARAM には 0 を指定します
戻り値に文字数が返りますが、不正なインデックス指定であれば LB_ERR が返ります

また、プログラムからアイテムを選択することもできるので
デフォルトの状態で選択するアイテムを生成したい場合などにも対応できます
アイテムを選択するには LB_SETCURSEL を送ります
WPARAM に選択するインデックスを指定します。LPARAM は 0 です
戻り値は、エラーが発生すれば LB_ERR が返ります
#include <windows.h>

LPCTSTR strItem[] = {
	TEXT("Kitty on your lap") ,
	TEXT("Tokyo mew mew") ,
	TEXT("Magical nyan nyan TARUTO") ,
	TEXT("Di Gi Charat") ,
	TEXT("Nekoneko Zoo")
};

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
	static HWND list , label;
	TCHAR strText[1024];
	int i;

	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		list = CreateWindow(
			TEXT("LISTBOX") , NULL , 
			WS_CHILD | WS_VISIBLE | LBS_STANDARD , 
			0 , 0 , 200 , 100 , hwnd , (HMENU)1 ,
			((LPCREATESTRUCT)(lp))->hInstance , NULL
		);
		for (i = 0 ; i < 5 ; i++)
			SendMessage(list , LB_ADDSTRING , 0 , (LPARAM)strItem[i]);

		label = CreateWindow(
			TEXT("STATIC") , NULL , 
			WS_CHILD | WS_VISIBLE , 
			200 , 0 , 150 , 80 , hwnd , (HMENU)2 ,
			((LPCREATESTRUCT)(lp))->hInstance , NULL
		);
		SendMessage(list , LB_SETCURSEL , 0 , 0);
		return 0;
	case WM_COMMAND:
		wsprintf(strText , TEXT("項目数 = %d\n項目文字数 = %d") ,
			SendMessage(list , LB_GETCOUNT , 0 , 0) ,
			SendMessage(list , LB_GETTEXTLEN ,
				SendMessage(list , LB_GETCURSEL , 0 , 0) , 0
			)
		);
		SetWindowText(label , strText);
		return 0;
	}
	return DefWindowProc(hwnd , msg , wp , lp);
}

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow ) {
	HWND hwnd;
	MSG msg;
	WNDCLASS winc;

	winc.style		= CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc	= WndProc;
	winc.cbClsExtra	= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("KITTY");

	if (!RegisterClass(&winc)) return -1;

	hwnd = CreateWindow(
			TEXT("KITTY") , TEXT("Kitty on your lap") ,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			NULL , NULL , hInstance , NULL
	);

	if (hwnd == NULL) return -1;

	while(GetMessage(&msg , NULL , 0 , 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}


選択されている項目の文字数を表示するプログラムです
また、リストの項目数も表示しています

プログラムから項目を選択する場合、インデックス以外に文字でも指定できます
文字列で項目を選択する場合は LB_SELECTSTRING を用います
WPARAM には検索を開始する視点となるインデックスを指定します
先頭のアイテムから検索させる場合は -1 を指定します

LPARAM には検索する文字列を指定します
検索は前方一致で行われるため、先頭文字に該当するものがあれば選択されます
戻り値は、選択されたインデックスです。該当文字が存在しない場合は LB_ERR が返ります
#include <windows.h>

LPCTSTR strItem[] = {
	TEXT("AAABBB") ,
	TEXT("AABBBB") ,
	TEXT("AAAACC") ,
	TEXT("aaaCCC") ,
	TEXT("ABBCCC")
};

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
	static HWND list , edit;
	TCHAR strText[1024];
	int i;

	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		list = CreateWindow(
			TEXT("LISTBOX") , NULL , 
			WS_CHILD | WS_VISIBLE | LBS_STANDARD , 
			0 , 30 , 200 , 100 , hwnd , (HMENU)1 ,
			((LPCREATESTRUCT)(lp))->hInstance , NULL
		);
		for (i = 0 ; i < 5 ; i++)
			SendMessage(list , LB_ADDSTRING , 0 , (LPARAM)strItem[i]);

		edit = CreateWindow(
			TEXT("EDIT") , NULL , 
			WS_CHILD | WS_VISIBLE | WS_BORDER ,
			0 , 0 , 200 , 30 , hwnd , (HMENU)2 ,
			((LPCREATESTRUCT)(lp))->hInstance , NULL
		);
		SendMessage(list , LB_SETCURSEL , 0 , 0);
		return 0;
	case WM_COMMAND:
		if (LOWORD(wp) == 2) {
			GetWindowText(edit , strText , 1024);
			SendMessage(list , LB_SELECTSTRING , -1 , (LPARAM)strText);
		}
		return 0;
	}
	return DefWindowProc(hwnd , msg , wp , lp);
}

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow ) {
	HWND hwnd;
	MSG msg;
	WNDCLASS winc;

	winc.style		= CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc	= WndProc;
	winc.cbClsExtra	= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("KITTY");

	if (!RegisterClass(&winc)) return -1;

	hwnd = CreateWindow(
			TEXT("KITTY") , TEXT("Kitty on your lap") ,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			NULL , NULL , hInstance , NULL
	);

	if (hwnd == NULL) return -1;

	while(GetMessage(&msg , NULL , 0 , 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}


上のエディットコントロールに文字を記述すると
リストボックスから前方検索され、一致したものが選択されます

リストボックスの項目の文字列をバッファに取得したい場合
LB_GETTEXT メッセージを用います
WPARAM に取得したいアイテムのインデックスを指定し
LPARAM に文字列を格納するバッファへのポインタを指定します

戻り値は、実際にバッファに格納された文字数が返ります(終端文字を除く)
有効なインデックスでなかった場合は LB_ERR が返ります
この時、バッファは十分なメモリを確保しておく必要があります
#include <windows.h>

LPCTSTR strItem[] = {
	TEXT("Kitty on your lap") ,
	TEXT("Tokyo mew mew") ,
	TEXT("Magical nyan nyan TARUTO") ,
	TEXT("Di Gi Charat") ,
	TEXT("Nekoneko Zoo")
};

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
	static HWND list , edit;
	PSTR strText;
	int i;

	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		list = CreateWindow(
			TEXT("LISTBOX") , NULL , 
			WS_CHILD | WS_VISIBLE | LBS_STANDARD , 
			0 , 30 , 200 , 100 , hwnd , (HMENU)1 ,
			((LPCREATESTRUCT)(lp))->hInstance , NULL
		);
		for (i = 0 ; i < 5 ; i++)
			SendMessage(list , LB_ADDSTRING , 0 , (LPARAM)strItem[i]);

		edit = CreateWindow(
			TEXT("EDIT") , NULL , 
			WS_CHILD | WS_VISIBLE | WS_BORDER ,
			0 , 0 , 200 , 30 , hwnd , (HMENU)2 ,
			((LPCREATESTRUCT)(lp))->hInstance , NULL
		);
		SendMessage(list , LB_SETCURSEL , 0 , 0);
		return 0;
	case WM_COMMAND:
		if (LOWORD(wp) == 1) {
			strText = (PSTR)malloc(
				SendMessage(list ,LB_GETTEXTLEN ,
				SendMessage(list , LB_GETCURSEL , 0 , 0) , 0
				) + 1
			);
			SendMessage(list , LB_GETTEXT , 
				SendMessage(list , LB_GETCURSEL , 0 , 0) ,
				(LPARAM)strText
			);
			SetWindowText(edit , strText);
			free(strText);
		}
		return 0;
	}
	return DefWindowProc(hwnd , msg , wp , lp);
}

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow ) {
	HWND hwnd;
	MSG msg;
	WNDCLASS winc;

	winc.style		= CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc	= WndProc;
	winc.cbClsExtra	= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("KITTY");

	if (!RegisterClass(&winc)) return -1;

	hwnd = CreateWindow(
			TEXT("KITTY") , TEXT("Kitty on your lap") ,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			NULL , NULL , hInstance , NULL
	);

	if (hwnd == NULL) return -1;

	while(GetMessage(&msg , NULL , 0 , 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
リストボックスの何らかの項目を選択すると
上のエディットコントロールに選択された項目の文字列が表示されます

LB_GETTEXTLEN メッセージを使って、文字数を取得してバッファを割り当てています


リストボックスの通知コード

LBS_NOTIFY スタイルを指定したリストボックスは
親ウィンドウに WM_COMMAND を送ることは先に説明しました

WM_COMMAND の WPARAM の上位ワードの通知コードは
リストボックスの場合、次のようなものがあります

通知コード解説
LBN_DBLCLK 項目をダブルクリック
LBN_ERRSPACE リストボックスがメモリを使いきり
メモリを取得できない
LBN_KILLFOCUS キーボードフォーカスを失った
LBN_SELCANCEL 選択項目をキャンセル
LBN_SELCHANGE 選択項目に、何らかの変更があった
(選択項目をクリックしたときなど)
LBN_SETFOCUS キーボードフォーカスを得た

例えば、ユーザーが項目を選択するとファイル情報を表示し
ダブルクリックすると項目が示すファイルを開くという動作が可能となります
#include <windows.h>

LPCTSTR strItem[] = {
	TEXT("Kitty on your lap") ,
	TEXT("Tokyo mew mew") ,
	TEXT("Magical nyan nyan TARUTO") ,
	TEXT("Di Gi Charat") ,
	TEXT("Nekoneko Zoo")
};

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
	static HWND list;
	int i;

	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		list = CreateWindow(
			TEXT("LISTBOX") , NULL , 
			WS_CHILD | WS_VISIBLE | LBS_STANDARD , 
			0 , 0 , 200 , 100 , hwnd , (HMENU)1 ,
			((LPCREATESTRUCT)(lp))->hInstance , NULL
		);
		for (i = 0 ; i < 5 ; i++)
			SendMessage(list , LB_ADDSTRING , 0 , (LPARAM)strItem[i]);
		return 0;
	case WM_COMMAND:
		if (HIWORD(wp) == LBN_DBLCLK)
			MessageBox(hwnd , TEXT("ダブルクリック") , TEXT("") , MB_OK);		
		return 0;
	}
	return DefWindowProc(hwnd , msg , wp , lp);
}

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow ) {
	HWND hwnd;
	MSG msg;
	WNDCLASS winc;

	winc.style		= CS_HREDRAW | CS_VREDRAW;
	winc.lpfnWndProc	= WndProc;
	winc.cbClsExtra	= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("KITTY");

	if (!RegisterClass(&winc)) return -1;

	hwnd = CreateWindow(
			TEXT("KITTY") , TEXT("Kitty on your lap") ,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			NULL , NULL , hInstance , NULL
	);

	if (hwnd == NULL) return -1;

	while(GetMessage(&msg , NULL , 0 , 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
項目をダブルクリックすると、メッセージボックスが表示されます
通知コードを調べることで、リストボックスでどのような操作が行われたか知ることができます



前のページへ戻る次のページへ