有効/無効


可視と不可視

ボタンコントロールなど、コントロールが入力を受けるには条件があります
その一つが、コントロールが可視状態であるということです

ウィンドウには、可視状態と不可視状態のプロパティが存在します
ウィンドウ生成時は、ウィンドウスタイルに 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



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