EternalWindows
コンボボックス / コンボボックスの作成

コンボボックスとは、ドロップダウンリストから項目を選択できるコントールのことです。

矢印のボタンを押すことでドロップダウンリストが表示されるため、 そこから適切な文字列を選択することになります。 予め追加されている文字列を選択することで、ユーザーが明示的に文字列を入力する必要がなくなります。

今回のプログラムは、コンボボックスを作成する例を示しています。

#include <windows.h>

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
	TCHAR      szAppName[] = TEXT("sample");
	HWND       hwnd;
	MSG        msg;
	WNDCLASSEX wc;

	wc.cbSize        = sizeof(WNDCLASSEX);
	wc.style         = 0;
	wc.lpfnWndProc   = WindowProc;
	wc.cbClsExtra    = 0;
	wc.cbWndExtra    = 0;
	wc.hInstance     = hinst;
	wc.hIcon         = (HICON)LoadImage(NULL, IDI_APPLICATION, IMAGE_ICON, 0, 0, LR_SHARED);
	wc.hCursor       = (HCURSOR)LoadImage(NULL, IDC_ARROW, IMAGE_CURSOR, 0, 0, LR_SHARED);
	wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	wc.lpszMenuName  = NULL;
	wc.lpszClassName = szAppName;
	wc.hIconSm       = (HICON)LoadImage(NULL, IDI_APPLICATION, IMAGE_ICON, 0, 0, LR_SHARED);
	
	if (RegisterClassEx(&wc) == 0)
		return 0;

	hwnd = CreateWindowEx(0, szAppName, szAppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hinst, NULL);
	if (hwnd == NULL)
		return 0;

	ShowWindow(hwnd, nCmdShow);
	UpdateWindow(hwnd);
	
	while (GetMessage(&msg, NULL, 0, 0) > 0) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	return (int)msg.wParam;
}

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
	static HWND hwndComboBox = NULL;

	switch (uMsg) {
		
	case WM_CREATE:
		hwndComboBox = CreateWindowEx(0, TEXT("COMBOBOX"), TEXT(""), WS_CHILD | WS_VISIBLE | CBS_DROPDOWNLIST, 30, 30, 120, 140, hwnd, (HMENU)1, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
		SendMessage(hwndComboBox, CB_ADDSTRING, 0, (LPARAM)TEXT("item1"));
		SendMessage(hwndComboBox, CB_ADDSTRING, 0, (LPARAM)TEXT("item2"));
		
		SendMessage(hwndComboBox, CB_SETCURSEL, 0, 0);
		return 0;

	case WM_COMMAND:
		if (HIWORD(wParam) == CBN_SELCHANGE) {
			int   nIndex;
			TCHAR szBuf[256];

			nIndex = (int)SendMessage(hwndComboBox, CB_GETCURSEL, 0, 0);
			SendMessage(hwndComboBox, CB_GETLBTEXT, nIndex, (LPARAM)szBuf);
			MessageBox(NULL, szBuf, TEXT("OK"), MB_OK);
		}
		return 0;

	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;

	default:
		break;

	}

	return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

コンボボックスの作成は、通常のコントロールと同じようにCreateWindowExで行います。 ウインドウクラスにはCOMBOBOXという文字列を指定し、 ウインドウスタイルには子ウインドウを示すWS_CHILDと表示状態を示すWS_VISIBLEを指定します。 また、ドロップダウン表示になるようにCBS_DROPDOWNLISTを指定します。 コンボボックスにアイテムを追加するには、CB_ADDSTRINGをコンボボックスに送信します。 WPARAMは0を指定し、LPARAMにアイテムのテキストを指定します。 CB_SETCURSELを送信すると、WPARAMのインデックスで表されるアイテムが選択状態になります。

ドロップダウンを表示してアイテムを選択した場合は、WM_COMMANDとしてCBN_SELCHANGEが通知されます。 選択されたアイテムのインデックスはCB_GETCURSELで取得することができ、 このインデックスをCB_GETLBTEXTのWPARAMに指定すれば、 アイテムのテキストを取得することができます。


戻る