ホームに戻る
マウスカーソルの変更
/*
マウスカーソルの絵の変更
注意:幅、高さは GetSystemMetrics で得たものであること
グラフィックデータの表現
and xor 表示
0 0 黒
0 1 白
1 0 透明
1 1 反転
関連関数
CreateCursor
SetCursor
DestroyCursor
WM_SETCURSOR で送られるメッセージ
wParam
マウスのあるウィンドウのハンドル
lParam
HTBORDER 18 可変枠を持たない境界線上にある
HTBOTTOM 15 可変枠の下辺境界線上にある
HTBOTTOMLEFT 16 同、左下隅にある
HTBOTTOMRIGHT 17 同、右下隅にある
HTCAPTION 2 キャプションバー上にある
HTCLIENT 1 クライアント領域内にある
HTERROR (-2) デスクトップ上にあり、警告音を鳴らす
HTGROWBOX 4 = HTSIZE
HTHSCROOL 6 水平スクロールバーないある
HTLEFT 10 可変枠の左辺境界線上にある
HTMENU 5 メニューバー内にある
HTMINBUTTON 8 アイコン化ボタン上にある
HTMAXBUTTON 9 最大化ボタン上にある
HTNOWHERE 0 デスクトップ上にある
HTREDUCE = HTMINBUTTON
HTRIGHT 11 可変枠の右辺境界線上にある
HTSIZE 4 サイズボックス内にある
HTSYSMENU 3 システムメニュー内にある
HTTOP 12 可変枠の上辺境界線上にある
HTTOPLEFT 13 可変枠の左上隅にある
HTTOPRIGHT 14 可変枠の右上隅にある
HTTRANSPARENT (-1) 同じスレッドの別のウィンドウの下にある
HTVSCROLL 7 垂直スクロールバー内にある
HTZOOM = HTMAXBUTTON
*/
#include <windows.h>
#include <stdio.h>
// ウィンドウプロシージャの宣言(ウィンドウの動作を規定)
LRESULT CALLBACK WndProc(
HWND hwnd, //ウィンドウハンドル(void型ポインタ)
UINT message, //メッセージ識別番号(unsigned int)
WPARAM wParam, //(32ビットlong)
LPARAM lParam); //(32ビットlong)
//表示する文字列
char s[256];
int cur_width;
int cur_height;
int cur_size;
char *cur_and;
char *cur_xor;
//メイン関数
int APIENTRY WinMain(
HINSTANCE hInstance, //インスタンスのハンドル
HINSTANCE hPreInstance, //以前のインスタンスハンドル
LPSTR cmdLine, //コマンド行の文字列
int cmdShow) //ウィンドウの表示状態
{
//ウィンドウクラスの宣言
WNDCLASS wd;
//ウィンドウクラス名
char *wdName = "window00";
//ウィンドウ登録のためのループ
if (!hPreInstance) {
//ウィンドウスタイル
wd.style = CS_HREDRAW | CS_VREDRAW; //幅、高さの変化に対し再描画する
//ウィンドウプロシージャ
wd.lpfnWndProc = (WNDPROC)WndProc;
//クラスの予備のメモリ領域
wd.cbClsExtra = 0;
//ウィンドウの予備のメモリ領域
wd.cbWndExtra = 0;
//プログラムのインスタンスハンドル
wd.hInstance = hInstance;
//アイコンのハンドル
wd.hIcon = NULL;
//カーソルのハンドル
wd.hCursor = LoadCursor(NULL, IDC_ARROW);
//バックグラウンドのブラシのハンドル
wd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
//メニュー名
wd.lpszMenuName = NULL;
//クラス名
wd.lpszClassName = wdName;
//ウィンドウの登録(成功 非0、失敗 0)
if (!RegisterClass(&wd))
return FALSE;
}
//ウィンドウの生成(ハンドルを form00 とする)
HWND form00 = CreateWindowEx(
NULL, //拡張スタイル(なし)
wdName, //ウィンドウクラス名
"window", //ウィンドウの名前
WS_OVERLAPPEDWINDOW, //ウィンドウスタイル(オーバーラップ型)
CW_USEDEFAULT, //ウィンドウのX座標(ディフォルト)
CW_USEDEFAULT, //ウィンドウのY座標(ディフォルト)
200, //ウィンドウの幅(200に設定)
50, //ウィンドウの高さ(50に設定)
NULL, //親ウィンドウ(この場合自身が親)
NULL, //メニュー(なし)
hInstance, //プログラムのハンドル
NULL); //予備パラメータ
//ウィンドウの表示
ShowWindow(form00, cmdShow);
//ウィンドウの更新
UpdateWindow(form00);
//イベントのループ
MSG msg;
while (GetMessage(&msg, NULL, NULL, NULL))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
// ウィンドウプロシージャ(ウィンドウの動作を規定)
LRESULT CALLBACK WndProc(
HWND hwnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
static HCURSOR hCursor = NULL;
HINSTANCE hInst;
hInst = (HINSTANCE)GetWindowLong(hwnd, GWL_HINSTANCE);
switch (message) {
//ウィンドウ作成時
case WM_CREATE:
{
int i;
cur_width = GetSystemMetrics(SM_CXCURSOR);
cur_height = GetSystemMetrics(SM_CYCURSOR);
cur_size = cur_width / 8 * cur_height;
cur_and = (char *)malloc(cur_size);
cur_xor = (char *)malloc(cur_size);
for(i = 0; i < cur_size; i++){
if(i % (cur_width / 8) < (cur_width / 16)){
cur_and[i] = 0x00;
}
else{
cur_and[i] = 0xFF;
}
if(i < (cur_size / 2)){
cur_xor[i] = 0x00;
}
else{
cur_xor[i] = 0xFF;
}
}
SetCursor(NULL);
DestroyCursor(hCursor);
hCursor = CreateCursor(hInst, cur_width / 2, cur_height / 2, cur_width, cur_height, cur_and, cur_xor);
SetCursor(hCursor);
}
break;
//ウィンドウ内でカーソルが移動
case WM_SETCURSOR:
{
if(hCursor){
SetCursor(hCursor);
}
}
break;
//マウス左ボタンに対する処理
case WM_LBUTTONDOWN:
{
int xPos, yPos;
char *zahyou = "左クリック X座標 %d Y座標 %d";
xPos = LOWORD(lParam);
yPos = HIWORD(lParam);
sprintf(s, zahyou, xPos, yPos);
//再描画
InvalidateRect(hwnd, //ウィンドウハンドル
NULL, //再描画領域の指定(Rect)NULL 全体
TRUE); //背景消去フラグ
}
break;
//マウス右ボタンに対する処理
case WM_RBUTTONDOWN:
{
int xPos, yPos;
char *zahyou = "右クリック X座標 %d Y座標 %d";
xPos = LOWORD(lParam);
yPos = HIWORD(lParam);
sprintf(s, zahyou, xPos, yPos);
//再描画
InvalidateRect(hwnd, //ウィンドウハンドル
NULL, //再描画領域の指定(Rect)NULL 全体
TRUE); //背景消去フラグ
}
break;
//ウィンドウを描画するとき処理
case WM_PAINT:
{
//描画の準備
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
//文字列の描画
TextOut(hdc, 0, 0, s, strlen(s));
//描画の終了
EndPaint(hwnd, &ps);
}
break;
//ウィンドウを破壊する時の処理
case WM_DESTROY:
free(cur_and);
free(cur_xor);
//カーソルの破棄
DestroyCursor(hCursor);
//メイン関数のループを終了
PostQuitMessage(0);
break;
//デフォルトの処理に対してデフォルトの処理を返す
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return NULL;
}