ボタンメッセージ


ボタンを操作する

子ウィンドウが親ウィンドウにメッセージを送るように
親ウィンドウから娘ウィンドウに対してメッセージを送ることも可能です

子ウィンドウへ送れるメッセージに、多くのウィンドウメッセージが含まれますが
一般にボタン操作には、ボタンメッセージ を使います

ボタンをプログラムからクリックするには BM_CLICK を使います
これをボタンに送れば、ボタンは WM_LBUTTONDOWN と
WM_LBUTTONUP メッセージを受け取ります

BM_CLICK のパラメータは両方とも 0 です
また、このメッセージに戻り値はありません

また、プッシュボタンが押された時の強調表示をシュミレーションする場合
BM_SETSTATE メッセージを使います

このメッセージは、WPARAM に TRUE 設定するとボタンを押した状態に描画し
FALSE に設定して送ると、ボタンを元の状態に戻します
LPARAM の値は 0 を指定し、戻り値も常に 0 です
#include <windows.h>

HWND button;

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_COMMAND:
		MessageBox(hwnd , TEXT("Kitty on you lap") , TEXT("") , MB_OK);
		return 0;
	case WM_RBUTTONDOWN:
		SendMessage(button , BM_CLICK , 0 , 0);
		return 0;
	case WM_KEYDOWN:
		SendMessage(button , BM_SETSTATE , TRUE , 0);
		return 0;
	case WM_KEYUP:
		SendMessage(button , BM_SETSTATE , FALSE , 0);
		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
	);

	button = CreateWindow(
			TEXT("BUTTON") , TEXT("Kitty") ,
			WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON ,
			0 , 0 , 100 , 30 ,
			hwnd , NULL , hInstance , NULL
	);

	if (hwnd == NULL) return -1;

	while(GetMessage(&msg , NULL , 0 , 0)) DispatchMessage(&msg);
	return msg.wParam;
}
このプログラムを実行し、ウィンドウをアクティブにした状態で
何らかの非システムキーを押すとボタンが押され、キーを離すとボタンも戻ります
しかし、キーを押してもボタンの表示が変更されているだけで
WM_COMMAND は発生しません、ただ単純に表示を変更しているだけです

マウスの右ボタンを押すと、今度は BM_CLICK がボタンに渡されます
ボタンはクリックされたと判断し、WM_COMMAND をプロシージャに送ります
しかし、ボタンの表示は変わりません



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