EternalWindows
エディットコントロール / エディットコントロールの作成

エディットコントロールとは、文字列の入力や編集が可能なコントロールのことです。

エディットコントロールの枠内をクリックすると、キャレットが点滅するようになります。 この状態で何らかのキーを押した場合、その押したキーが現在のキャレットの位置に表示されることになります。

今回のプログラムは、一行入力ができるエディットコントロールを作成しています。

#include <windows.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 hwndEdit = NULL;
	
	switch (uMsg) {
		
	case WM_CREATE:
		hwndEdit = CreateWindowEx(0, TEXT("EDIT"), TEXT(""), WS_CHILD | WS_VISIBLE | WS_BORDER, 30, 30, 150, 30, hwnd, (HMENU)1, ((LPCREATESTRUCT)lParam)->hInstance, NULL);		
		CreateWindowEx(0, TEXT("BUTTON"), TEXT("送信"), WS_CHILD | WS_VISIBLE, 190, 30, 60, 30, hwnd, (HMENU)ID_BUTTON, ((LPCREATESTRUCT)lParam)->hInstance, NULL);

		SetFocus(hwndEdit);
		return 0;

	case WM_COMMAND:
		if (LOWORD(wParam) == ID_BUTTON) {
			TCHAR szBuf[256];

			GetWindowText(hwndEdit, 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);
}

エディットコントロールは、他のコントロールと同じようにCreateWindowExで作成することになります。 ウインドウクラスにはEDITを指定し、ウインドウスタイルには子ウインドウを示すWS_CHILDと表示状態を示すWS_VISIBLEを指定します。 WS_BORDERを指定した場合は、エディットコントロールに枠が表示されるようになります。 SetFocusを呼び出しているのは、エディットコントロールにキーボードフォーカスを割り当てるためです。 フォーカスを割り当てられていれば、エディットコントロールにキャレットが表示されるようになり、 キー入力がエディットコントロールに反映されるようになります。 SetFocusを呼び出さない場合は、ユーザーがエディットコントロールをクリックしてフォーカスを割り当てる必要があります。

ボタンが押された場合は、エディットコントロールに入力された文字列が表示されます。 入力された文字列は、エディットコントロールに対してGetWindowTextを呼び出すことで取得できます。 なお、複数行のエディットコントロールの場合では、特定の行の文字列だけを取得したい場合がありますが、 これにはEM_GETLINEを送信します。

int   nCount;
TCHAR szBuf[256];

*(LPWORD)szBuf = sizeof(szBuf) / sizeof(TCHAR);
nCount = SendMessage(hwndEdit, EM_GETLINE, 0, (LPARAM)szBuf);
szBuf[nCount] = '\0';

EM_GETLINEのWPARAMは、取得する行のインデックスであり、0を指定した場合は最初の行の文字列が取得されます。 LPARAMは文字列を受け取るバッファを指定しますが、予め先頭2バイトにバッファのサイズを指定おく必要があります。 また、取得した文字列の終端にはNULL文字が追加されないため、戻り値の文字数をインデックスとして明示的に追加することになります。


戻る