グループボックス


コントロールのグループ化

前回のラジオボタンで、ラジオボタンがグループという単位で扱われることがわかりました
今回は、コントロールをグループ化する特殊なコントロールを説明します

このコントロールは、ボタンコントロールの中でも特殊な存在で
入力を処理したり、メッセージを親ウィンドウの送ることがありません
このコントロールは、イベント処理を目的としていないのです

グループボックスを用いるには、CreateWindow() で WM_GROUPBOX を指定します
グループボックスは上部にテキストを表示し、コントロールを囲みます
#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		CreateWindow(
			TEXT("BUTTON") , TEXT("Kitty") ,
			WS_CHILD | WS_VISIBLE | BS_GROUPBOX ,
			0 , 0 , 200 , 100 ,
			hwnd , NULL , ((LPCREATESTRUCT)(lp))->hInstance , NULL
		);
		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_COMMAND を発生することもありません

他のコントロールを、グループボックスの子ウィンドウに指定することで
グループボックスに含まれるコントロールをグループ化できます
グループボックスは、他のボタンコントロールを囲むためによく用いられます
#include <windows.h>

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

	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_CREATE:
		group = CreateWindow(
			TEXT("BUTTON") , TEXT("Group") ,
			WS_CHILD | WS_VISIBLE | BS_GROUPBOX ,
			0 , 0 , 200 , 100 ,
			hwnd , NULL , ((LPCREATESTRUCT)(lp))->hInstance , NULL
		);

		CreateWindow(
			TEXT("BUTTON") , TEXT("Group radio1") ,
			WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON ,
			10 , 30 , 150 , 30 ,
			group , NULL , ((LPCREATESTRUCT)(lp))->hInstance , NULL
		);
		CreateWindow(
			TEXT("BUTTON") , TEXT("Group radio2") ,
			WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON ,
			10 , 60 , 150 , 30 ,
			group , NULL , ((LPCREATESTRUCT)(lp))->hInstance , NULL
		);

		CreateWindow(
			TEXT("BUTTON") , TEXT("Kitty") ,
			WS_CHILD | WS_VISIBLE | BS_AUTORADIOBUTTON ,
			200 , 0 , 100 , 30 ,
			hwnd , NULL , ((LPCREATESTRUCT)(lp))->hInstance , NULL
		);

		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;
}


グループボックスの中のコントロールは、それで一つのグループです
内部のコントロールは相互排他的に関係していますが
外部のラジオボタンと関係し合うことはありません



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