有効/無効
可視と不可視
ボタンコントロールなど、コントロールが入力を受けるには条件があります
その一つが、コントロールが可視状態であるということです
ウィンドウには、可視状態と不可視状態のプロパティが存在します
ウィンドウ生成時は、ウィンドウスタイルに WS_VISIBLE を指定していない限り不可視です
ウィンドウの表示状態の変更には ShowWindow() 関数を用いました
もし、コントロールを非表示にしたければ ShowWindow() 関数で
SW_HIDE を指定すれば、コントロールを非表示にすることができます
ウィンドウの現在の状態を得るには IsWindowVisible() 関数を使います
BOOL IsWindowVisible(HWND hWnd);
hWnd には、ウィンドウのハンドルを指定します
指定したウィンドウが表示状態であれば 0 以外
非表示状態であれば 0 を返します (当然、視覚ではなくプログラムの属性での話しである)
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
static HWND button;
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CREATE:
button = CreateWindow(
TEXT("BUTTON") , TEXT("Kitty") ,
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON ,
0 , 0 , 100 , 30 ,
hwnd , (HMENU)1 ,
((LPCREATESTRUCT)(lp))->hInstance , NULL
);
CreateWindow(
TEXT("BUTTON") , TEXT("Hide Button") ,
WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON ,
100 , 0 , 100 , 30 ,
hwnd , (HMENU)2 ,
((LPCREATESTRUCT)(lp))->hInstance , NULL
);
return 0;
case WM_COMMAND:
if(LOWORD(wp) == 2) {
if(IsWindowVisible(button)) ShowWindow(button , SW_HIDE);
else ShowWindow(button , SW_SHOW);
}
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)) DispatchMessage(&msg);
return msg.wParam;
}
Hide Button を押すと、Kitty ボタンの表示状態が変更します
表示状態であれば非表示に、非表示であれば表示されます
有効と無効
コントロールへの入力条件のもう一つは
コントロールが有効な状態でなければならないというものがあります
向こう状態のコントロールは、マウスやキーメッセージを受けません
通常、コントロールが向こうの状態は視覚的に判断することができます
例えば、ボタンコントロールは無効状態だとグレー表示になります
デフォルトでウィンドウは有効状態です
ウィンドウの初期状態を無効にしたければ、CreateWindow() で
WS_DISABLED スタイルを指定すれば無効状態で生成されます
有効や無効状態の設定には EnableWindow() 関数を使います
BOOL EnableWindow(HWND hWnd , BOOL bEnable);
hWnd には、状態を設定するウィンドウのハンドルを
bEnable は、TRUE を選択すれば有効に、FALSE を選択すれば無効になります
ウィンドウがすでに無効の時は 0 以外、それ以外であれば 0 が返ります
現在、ウィンドウやコントロールが有効か無効かを知るには
IsWindowEnabled() 関数を使います
BOOL IsWindowEnabled(HWND hWnd);
hWnd には、状態を調べたいウィンドウのハンドルを指定します
有効状態であれば 0 以外、そうでなければ 0 を返します
子ウィンドウは、有効でありかつ可視状態で入力を受けつけます
#include <windows.h>
LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
static HWND check;
switch (msg) {
case WM_DESTROY:
PostQuitMessage(0);
return 0;
case WM_CREATE:
CreateWindow(
TEXT("BUTTON") , TEXT("Kitty") ,
WS_CHILD | WS_VISIBLE | BS_AUTOCHECKBOX ,
0 , 0 , 100 , 30 ,
hwnd , (HMENU)1 ,
((LPCREATESTRUCT)(lp))->hInstance , NULL
);
check = CreateWindow(
TEXT("BUTTON") , TEXT("TARUTO") ,
WS_CHILD | WS_VISIBLE | WS_DISABLED |
BS_AUTOCHECKBOX ,
100 , 0 , 100 , 30 ,
hwnd , (HMENU)2 ,
((LPCREATESTRUCT)(lp))->hInstance , NULL
);
return 0;
case WM_COMMAND:
if(LOWORD(wp) == 1) {
if(IsWindowEnabled(check)) EnableWindow(check , FALSE);
else EnableWindow(check , TRUE);
}
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)) DispatchMessage(&msg);
return msg.wParam;
}
右のチェックボックスが無効状態のコントロールです
左のチェックボックスをチェックすると有効状態になります
無効状態では、一切の入力を受けつけないのでチェックすることができません
因みに、有効/無効状態が変更されると
そのコントロールには WM_ENABLE メッセージが送られます
WPARAM が TRUE であれば有効、FALSE ならば無効になったことを表します
LPARAM は無く、このメッセージを処理したなら戻り値は 0 になります
これは、現在使うことはありませんが
後記するカスタムコントロールなどを実装する場合に重要になります
IsWindowVisible()
BOOL IsWindowVisible(HWND hWnd);
指定されたウィンドウの表示状態を取得します
hWnd - ウィンドウのハンドルを指定します
戻り値 - 表示状態の時は 0 以外、非表示のときは 0
IsWindowEnabled()
BOOL IsWindowEnabled(HWND hWnd);
指定されたウィンドウが有効か無効を取得します
hWnd - ウィンドウのハンドルを指定します
戻り値 - 有効状態の時は 0 以外、無効状態のときは 0
EnableWindow()
BOOL EnableWindow(HWND hWnd , BOOL bEnable);
ウィンドウを有効化、または無効化します
hWnd - ウィンドウのハンドルを指定します
bEnable - TREU のときは有効化、FALSE のときは無効化します
戻り値 - ウィンドウがすでに無効のときは、0 以外。それ以外の場合は 0