ホームに戻る
 マウスカーソルの変更

/*

 マウスカーソルの絵の変更

注意:幅、高さは 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;
}

inserted by FC2 system