ボタンメッセージ
ボタンを操作する
子ウィンドウが親ウィンドウにメッセージを送るように
親ウィンドウから娘ウィンドウに対してメッセージを送ることも可能です
子ウィンドウへ送れるメッセージに、多くのウィンドウメッセージが含まれますが
一般にボタン操作には、ボタンメッセージ を使います
ボタンをプログラムからクリックするには 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 をプロシージャに送ります
しかし、ボタンの表示は変わりません