ウィンドウの設定


ウィンドウクラスの内容を変更する

実は、ウィンドウのハンドルさえわかっていれば
そのハンドルが持つウィンドウクラス構造体の内容を変更することができる

ウィンドウの設定を変更するには SetClassLong() 関数を使う
これを用いれば、ウィンドウのウィンドウクラスの設定を変更できる

DWORD SetClassLong(HWND hWnd , int nIndex , LONG dwNewLong);

hWnd には、設定するウィンドウのハンドルを指定します
nIndex には、どのメンバを変更するかを表す定数を指定します
dwNewLong は、設定する値を指定します

戻り値は、変更前の値が返りますが、失敗すると 0 が返ります
nIndex の値は下記のリファレンスを参照してください
次のプログラムでは、hbrBackground メンバを変更するために
GCL_HBRBACKGROUND を用いてます
#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_LBUTTONDOWN:
		SetClassLong(
			hwnd , GCL_HBRBACKGROUND ,
			(LONG)CreateSolidBrush(RGB(0xFF , 0 , 0))
		);
		InvalidateRect(hwnd , NULL , 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;
}
このプログラムを実行し、マウスの左ボタンでクライアント領域を押すと
背景色が赤に変更され、同時に再描画しています

また、GetClassLong() 関数を用いれば
ウィンドウクラスの値を取得することも可能です


SetClassLong()

DWORD SetClassLong(HWND hWnd , int nIndex , LONG dwNewLong);

ウィンドウのウィンドウクラスのデータを変更します

hWnd - 設定するウィンドウのハンドルを指定します
nIndex - どのメンバを変更するかを表す定数を指定します
dwNewLong - 設定する値を指定します

戻り値 - 変更前の値が返りますが、失敗すると 0 が返ります

nIndex には次のいずれかの値を指定します

定数解説
GCW_ATOM ウィンドウクラスを一意的に識別するアトム値を取得します
これは、RegisterClass 関数 (または RegisterClassEx 関数) が返すアトムと同じです
GCL_CBCLSEXTRA 拡張クラスメモリのサイズを、バイト単位で取得します
GCL_CBWNDEXTRA 拡張ウィンドウメモリのサイズを、バイト単位で取得します
このメモリへのアクセス方法については
GetWindowLong 関数や GetWindowWord 関数の説明を参照してください
GCL_HBRBACKGROUND 背景ブラシのハンドルを取得します
GCL_HCURSOR マウスカーソルのハンドルを取得します
GCL_HICON アイコンのハンドルを取得します
GCL_HICONSM 小さいアイコンのハンドルを取得します
GCL_HMODULE クラスを登録したモジュールのハンドルを取得します
GCL_MENUNAME メニュー名が入った文字列へのポインタ (またはメニューの ID) を取得します
GCL_STYLE ウィンドウクラスのスタイルを取得します
GCL_WNDPROC このクラスのウィンドウプロシージャのアドレスを取得します

GetClassLong()

DWORD GetClassLong(HWND hWnd, int nIndex);

ウィンドウに関連付けられたウィンドウクラスの値を取得します

hWnd - 取得するウィンドウのハンドルを指定します
nIndex - どのメンバを取得するかを表す定数を指定します

戻り値 - 成功すれば要求したデータ、失敗すれば 0

nIndex に指定する値は SetClassLong() を参照してください



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