カーソル
カスタムカーソルを使う
さて、前回に引き続き今回はカーソルを解説します
想像できると思いますが、カーソルもリソースの一つです
カーソルファイルは .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;
}
![](img/00.079.jpg)
あの、猫の足跡っぽいのが今回使ったカスタムカーソルです
もし、ウィンドウクラス以外の場所で動的にマウスカーソルを変化させる場合
SetClassLong() を使って構造体の内容を変更しても良いですが
より安全な方法として SetCursor() を使います
HCURSOR SetCursor(HCURSOR hCursor);
hCursor には、設定するカーソルのハンドルを
戻り値は以前のマウスカーソルを、存在しなければ NULL を返します
この関数は WM_MOUSEMOVE が発生するたびに呼び出すのが一般的です
カーソルの変更がなければ、即座に処理を戻す関数なので
実行速度に深刻な問題を与えるようなことはありません
SetCursor
HCURSOR SetCursor(HCURSOR hCursor);
カーソルを設定します
設定されているカーソルが同じものであれば即座に制御を戻します
hCursor - カーソルのハンドルを指定します
戻り値 - 以前のカーソル。なければ NULL