EternalWindows
コンボボックス / 文字列の入力

前節で取り上げたコンボボックスは、予め追加されていた文字列を選択するだけでしたが、 今回はコンボボックスに任意の文字列を入力できるようにします。

#include <windows.h>
#include <commctrl.h>

#define ID_BUTTON 100

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:
		CreateWindowEx(0, TEXT("BUTTON"), TEXT("検索"), WS_CHILD | WS_VISIBLE, 220, 30, 60, 25, hwnd, (HMENU)ID_BUTTON, ((LPCREATESTRUCT)lParam)->hInstance, NULL);
		hwndComboBox = CreateWindowEx(0, TEXT("COMBOBOX"), TEXT(""), WS_CHILD | WS_VISIBLE | CBS_DROPDOWN, 30, 30, 170, 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_SETCUEBANNER, 0, (LPARAM)TEXT("検索する文字を入力"));
		return 0;

	case WM_COMMAND:
		if (LOWORD(wParam) == ID_BUTTON) {
			TCHAR szBuf[256];
			
			GetWindowText(hwndComboBox, szBuf, sizeof(szBuf) / sizeof(TCHAR));
			MessageBox(NULL, szBuf, TEXT("OK"), MB_OK);
		}
		return 0;

	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;

	default:
		break;

	}

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

コンボボックスに文字列を入力できるようにするには、ウインドウスタイルにCBS_DROPDOWNを指定します。 この状態でコンボボックスを選択した場合は、コンボボックスがエディットコントロールのように変化するため、 任意の文字列を入力できるようになります。 今回は、この事を強調するために薄い灰色の文字列を表示していますが、 これはWindows Vistaから登場したCB_SETCUEBANNERによって実現されています。 この文字列は、コンボボックスを選択すると消えることになります。 CB_SETCUEBANNERを使用する場合は、commctrl.hのインクルードが必要になります。

検索ボタンが押された場合は、コンボボックスに現在表示されている文字列を取得するためにGetWindowTextを呼び出しています。 CB_GETLBTEXTでは、コンボボックスに追加された文字列しか取得できないため、 入力した文字列も考慮する場合はGetWindowTextを呼び出します。


戻る