カーソル


カスタムカーソルを使う

さて、前回に引き続き今回はカーソルを解説します
想像できると思いますが、カーソルもリソースの一つです

カーソルファイルは .CUR という拡張子を持つファイルです
一般に 32×32 ピクセルのモノクロです
VC++ を使っている人は、新規作成のファイルタグからカーソルファイルを選んで作ってください

カーソルには ホットスポット と呼ばれる一点を持ちます
カーソルは全体のうち、入力されるのは1ピクセルの一点だけです
この一点をホットスポットと呼びます(矢印カーソルならば、矢印の先がホットスポット)

リソーススクリプトでは、CURSOR 文を用います

nameID CURSOR filename

形式は ICON 文とまったく同じです
nameID には識別子、filename にはファイル名を指定します

アイコンの時と同様に、カーソルリソースを読みこむには LoadCursor() を使います
こうすることで、ウィンドウのクライアント領域のカーソルが指定したカーソルになります
一般的には、Windows が用意する定義済みカーソルで十分とされますが
ゲームなど、個性を求められるアプリケーションではカーソルも重要な存在です
//リソーススクリプト
KITTY CURSOR "test.cur"
#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(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(hInstance , TEXT("KITTY"));
	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)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}


あの、猫の足跡っぽいのが今回使ったカスタムカーソルです

もし、ウィンドウクラス以外の場所で動的にマウスカーソルを変化させる場合
SetClassLong() を使って構造体の内容を変更しても良いですが
より安全な方法として SetCursor() を使います

HCURSOR SetCursor(HCURSOR hCursor);

hCursor には、設定するカーソルのハンドルを
戻り値は以前のマウスカーソルを、存在しなければ NULL を返します

この関数は WM_MOUSEMOVE が発生するたびに呼び出すのが一般的です
カーソルの変更がなければ、即座に処理を戻す関数なので
実行速度に深刻な問題を与えるようなことはありません


SetCursor

HCURSOR SetCursor(HCURSOR hCursor);

カーソルを設定します
設定されているカーソルが同じものであれば即座に制御を戻します

hCursor - カーソルのハンドルを指定します

戻り値 - 以前のカーソル。なければ NULL



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