目次 - API(機能別) - マウス - SDL_CreateCursor

# SDL_CreateCursor

指定のビットマップデータとマスク(MSB形式)からマウスカーソルを生成する

## 構文

`SDL_Cursor* SDL_CreateCursor(const Uint8* data, const Uint8* mask, int w, int h, int hot_x, int hot_y)`

## 引数

data | カーソルの各ピクセルの色 (詳細を参照すること)
mask | カーソルの書くピクセルのマスク (詳細を参照すること)
w | カーソルの幅 (詳細を参照すること)
h | カーソルの高さ (wと同じ?)
hot_x | カーソルの左上の実際のカーソルからの相対位置のX座標
hot_y | カーソルの左上の実際のカーソルからの相対位置のY座標

## 戻り値

成功のとき指定の引数で新しく生成されたカーソル, 失敗のときNULLを戻す. SDL_GetError()で詳細を知ることができる.

## サンプルコード

``

    /* メーリングリストから拝借 */
    /* XPMから新しいマウスカーソルを生成する */

    /* XPM */
    static const char *arrow[] = {
      /* width height num_colors chars_per_pixel */
      "    32    32        3            1",
      /* colors */
      "X c #000000",
      ". c #ffffff",
      "  c None",
      /* pixels */
      "X                               ",
      "XX                              ",
      "X.X                             ",
      "X..X                            ",
      "X...X                           ",
      "X....X                          ",
      "X.....X                         ",
      "X......X                        ",
      "X.......X                       ",
      "X........X                      ",
      "X.....XXXXX                     ",
      "X..X..X                         ",
      "X.X X..X                        ",
      "XX  X..X                        ",
      "X    X..X                       ",
      "     X..X                       ",
      "      X..X                      ",
      "      X..X                      ",
      "       XX                       ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "                                ",
      "0,0"
    };

    static SDL_Cursor *init_system_cursor(const char *image[])
    {
      int i, row, col;
      Uint8 data[4*32];
      Uint8 mask[4*32];
      int hot_x, hot_y;

      i = -1;
      for (row=0; row<32; ++row) {
        for (col=0; col<32; ++col) {
          if (col % 8) {
            data[i] <<= 1;
            mask[i] <<= 1;
          } else {
            ++i;
            data[i] = mask[i] = 0;
          }
          switch (image[4+row][col]) {
            case 'X':
              data[i] |= 0x01;
              mask[i] |= 0x01;
              break;
            case '.':
              mask[i] |= 0x01;
              break;
            case ' ':
              break;
          }
        }
      }
      sscanf(image[4+row], "%d,%d", &hot_x, &hot_y);
      return SDL_CreateCursor(data, mask, 32, 32, hot_x, hot_y);
    }

## 詳細

カーソルの幅(w)は8の倍数の必要がある.

生成されるカーソルの黒と白は次の表に従う.

data | mask | スクリーン上の結果
--- | --- | ---
0 | 1 | 白
1 | 1 | 黒
0 | 0 | 透明
1 | 0 | 可能なら反転, 不可能なら黒

この関数で生成されたカーソルはSDL_FreeCursor()で解放する必要がある.

色のついたカーソルが必要ならば, この関数は向いていない. 代わりに, 通常のカーソルをSDL_ShowCursor()で隠し, メインループでSDL_Surface()をカーソルの位置に描く必要がある. (訳者注: これは古い説明で, SDL_CreateColorCursor()を使えば可能なはず.)

SDL 2.0.0以降ではSDL_CreateSystemCursor()で既にある11のシステムカーソルが使える.

## 関連項目(関数)

SDL_FreeCursor
SDL_SetCursor
SDL_ShowCursor

## SDL Wikiへのリンク

SDL_CreateCursor - SDL Wiki