フォーカスイベント


フォーカスのチェック

キーボードに関係するプログラムにおいて、フォーカスは重要です
キーボードからの入力は、フォーカスを持つウィンドウに対して行われます

ウィンドウのフォーカスの監視は、メッセージで行えます
フォーカスを得るとWM_SETFOCUS、失うとWM_KILLFOCUSがポストされます
これを処理することで、フォーカスの取得時や消失時に何らかの処理を行えます

wParamは、WM_SETFOCUSの時はフォーカスを失ったウィンドウのハンドル
WM_KILLFOCUSの時は、フォーカスを得たウィンドウのハンドルです
//特別なことがない限り、処理することはないでしょう

戻り値は、0を指定します
#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
	HDC hdc;

	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_SETFOCUS:
		hdc = GetDC(hwnd);
		SelectObject(hdc , GetStockObject(BLACK_BRUSH));
		Rectangle(hdc , 10 , 10 , 100 , 100);
		ReleaseDC(hwnd , hdc);
		return 0;
	case WM_KILLFOCUS:
		hdc = GetDC(hwnd);
		Ellipse(hdc , 10 , 10 , 100 , 100);
		ReleaseDC(hwnd , hdc);
		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;
}


フォーカスを得たり、失ったりするとウィンドウに異なる図を表示するプログラムです
ゲームなどで、フォーカスがない状態ではプログラムを動作させたくないという時には
フォーカスを失った時にプログラムを停止するようにプログラムすればよいのです



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