カーソルについて

Windows には、アプリケーションで使用できる一連の標準カーソルが用意されています。 WinUser.h には次のカーソル識別子が定義されています。

Value 意味
IDC_ARROW
MAKEINTRESOURCE(32512)
通常の選択
IDC_IBEAM
MAKEINTRESOURCE(32513)
テキストの選択
IDC_WAIT
MAKEINTRESOURCE(32514)
ビジー
IDC_CROSS
MAKEINTRESOURCE(32515)
精密な選択
IDC_UPARROW
MAKEINTRESOURCE(32516)
代替選択
IDC_SIZENWSE
MAKEINTRESOURCE(32642)
斜めサイズ変更 1
IDC_SIZENESW
MAKEINTRESOURCE(32643)
斜めサイズ変更 2
IDC_SIZEWE
MAKEINTRESOURCE(32644)
水平方向のサイズ変更
IDC_SIZENS
MAKEINTRESOURCE(32645)
垂直方向のサイズ変更
IDC_SIZEALL
MAKEINTRESOURCE(32646)
移動
IDC_NO
MAKEINTRESOURCE(32648)
利用不可
IDC_HAND
MAKEINTRESOURCE(32649)
リンクの選択
IDC_APPSTARTING
MAKEINTRESOURCE(32650)
バックグラウンドでの作業
IDC_HELP
MAKEINTRESOURCE(32651)
ヘルプの選択
IDC_PIN
MAKEINTRESOURCE(32671)
場所の選択
IDC_PERSON
MAKEINTRESOURCE(32672)
人の選択

識別子が WinUser.h に定義されていない (または廃止された) その他のカーソルも多数使用できます。

Value 意味
MAKEINTRESOURCE(32631) ペン カーソル。
MAKEINTRESOURCE(32652) 矢印が北と南を指しているスクロール カーソル。
MAKEINTRESOURCE(32653) 矢印が西と東を指しているスクロール カーソル。
MAKEINTRESOURCE(32654) 矢印が北、南、東、西を指しているスクロール カーソル。
MAKEINTRESOURCE(32655) 矢印が北を指しているスクロール カーソル。
MAKEINTRESOURCE(32656) 矢印が南を指しているスクロール カーソル。
MAKEINTRESOURCE(32657) 矢印が西を指しているスクロール カーソル。
MAKEINTRESOURCE(32658) 矢印が東を指しているスクロール カーソル。
MAKEINTRESOURCE(32659) 矢印が北と西を指しているスクロール カーソル。
MAKEINTRESOURCE(32660) 矢印が北と東を指しているスクロール カーソル。
MAKEINTRESOURCE(32661) 矢印が南と西を指しているスクロール カーソル。
MAKEINTRESOURCE(32662) 矢印が南と東を指しているスクロール カーソル。
MAKEINTRESOURCE(32663) 矢印 cd カーソル。

標準カーソルの使用については、ガイドラインを参照してください。

各標準カーソルには、対応する既定のイメージが関連付けられています。 ユーザーまたはアプリケーションはいつでも、任意の標準カーソルに関連付けられている既定のイメージを置き換えることができます。 アプリケーションは、SetSystemCursor 関数を使用して既定のイメージを置き換えます。

アプリケーションでは、GetIconInfo 関数を使用してカーソルの現在のイメージを取得し、DrawIconEx 関数を使用してカーソルを描画できます。

カスタム カーソルは、特定のアプリケーションで使用するために設計されており、開発者が任意の設計に定義することができます。 次の図は、いくつかのカスタム カーソルを示しています。

custom cursors, including hand, banana, drum, wristwatch on hand, metronome

カーソルは、モノクロまたはカラー、静的またはアニメーションのどれでもかまいません。 特定のコンピューター システムで使用されるカーソルの種類は、システムのディスプレイによって異なります。 VGA など旧型のディスプレイでは、カラーのカーソルやアニメーションのカーソルはサポートされていません。 ディスプレイ ドライバーがデバイスに依存しないビットマップ (DIB) エンジンを使用している新型のディスプレイは、それらをサポートしています。

カーソルとアイコンは類似しており、多くの場面で同じように使用することができます。 両者の唯一の違いは、カーソルとして指定されるイメージは、ディスプレイがサポートできる形式でなければならないことです。 たとえば、VGA ディスプレイの場合、カーソルはモノクロである必要があります。

この概要では、以下のトピックに関する情報を示します。

ホット スポット

カーソル内のホット スポットと呼ばれるピクセルは、マウス ボタンのクリックなど、マウス イベントの影響を受ける正確な画面位置を示します。 通常、ホット スポットはカーソルの焦点です。 システムはこのポイントを追跡し、カーソルの位置として認識します。 たとえば、一般的なホット スポットは、矢印型カーソルの先端のピクセルと、十字型カーソルの中央のピクセルです。 次のイメージは、描画プログラムの 2 つのカーソルを示しており、ホット スポットはブラシの先端とペイント缶の十字線に関連付けられています。

hot spots on two cursors

マウス入力イベントが発生すると、マウス ドライバーはそのイベントを、ホット スポットの座標を含む適切なマウス メッセージに変換します。 システムは、ホット スポットを含むウィンドウまたはマウス入力をキャプチャしているウィンドウにマウス メッセージを送信します。 詳細については、マウス入力に関するページをご覧ください。

マウスとカーソル

システムは、マウスの動きに応じて画面上のカーソルを動かすことによって、マウスの動きを反映します。 カーソルがウィンドウの異なる部分または異なるウィンドウに移動すると、システム (またはアプリケーション) によりカーソルの外観が変更されます。 たとえば、カーソルがハイパーリンクの上を横切ると、カーソルは矢印から手の形に変更されます。

standard cursor changing to a hand when over a hyperlink

システムにマウスがない場合、ユーザーが特定のシステム コマンド (ウィンドウのサイズ変更や移動に使用されるコマンドなど) を選択した場合にのみ、カーソルが表示され、移動します。 マウスが使用できない場合にカーソルを表示および移動する方法をユーザーに提供するために、アプリケーションはカーソル関数を使用してマウスの動きをシミュレートすることができます。 このシミュレーション機能を使用すると、ユーザーは方向キーでカーソルを移動できます。

カーソルの作成

標準カーソルはあらかじめ定義されているため、作成する必要はありません。 標準カーソルを使用するために、アプリケーションは LoadCursor または LoadImage 関数を使用してカーソル ハンドルを取得します。 カーソル ハンドルは、標準カーソルまたはカスタム カーソルを識別する HCURSOR タイプの一意の値です。

アプリケーション用にカスタム カーソルを作成するには、通常、グラフィックス アプリケーションを使用し、アプリケーションのリソース定義ファイルにリソースとしてカーソルを含めます。 実行時に、LoadCursor を呼び出してカーソル ハンドルを取得します。 カーソル リソースには、複数の異なるディスプレイ デバイス用のデータが含まれています。 LoadCursor 関数は、現在のディスプレイ デバイスに最適なデータを自動的に選択します。 .CUR または .ANI ファイから直接カーソルを読み込むには、LoadCursorFromFile 関数を使用します。

また、ICONINFO 構造体の内容に基づいてカーソルを作成する CreateIconIndirect 関数を使用して、実行時にカスタム カーソルを作成することもでできます。 GetIconInfo 関数は、この構造体にホット スポット座標と、関連付けられているマスクおよび色に関する情報を格納します。

アプリケーションでは、カスタム カーソルをリソースとして実装し、実行時にカーソルを作成するのではなく、LoadCursorLoadCursorFromFile、または LoadImage を使用する必要があります。 カーソル リソースを使用すると、デバイスへの依存回避、ローカライズの簡略化、アプリケーションでのカーソル デザインの共有が可能になります。

CreateIconFromResourceEx 関数を使用すると、アプリケーションはリソース データに基づいてアイコンとカーソルを作成できます。 CreateIconFromResourceEx は、他の実行可能ファイル (.exe) ファイルまたは DLL からのバイナリ リソース データに基づいてカーソルを作成します。 その前に LookupIconIdFromDirectoryEx 関数と、複数のリソース関数を呼び出す必要があります。 LookupIconIdFromDirectoryEx は、現在のディスプレイ デバイスに最適なカーソル データを識別します。 リソース関数の詳細については、リソースに関する記事を参照してください。

カーソルの位置と外観

マウスのカーソルの表示と画面上の位置の更新は自動的に行われます。 GetCursorPos 関数と SetCursorPos 関数をそれぞれ使用することで、カーソルの現在の画面座標を取得したり、画面上の任意の場所にカーソルを移動させたりすることができます。

また、GetCursor 関数を使用すれば、現在のカーソルのハンドルを取得でき、SetCursor 関数を使用すればカーソルを設定することができます。 SetCursor を呼び出した後、マウスが移動するか、カーソルが明示的に別のカーソルに設定されるか、システム コマンドが実行されるまで、カーソルの外観は変わりません。

ユーザーがマウスを動かすと、システムは新しい場所にカーソルを再描画します。 カーソルが指しているウィンドウに関連付けられているカーソル デザインが自動的に再描画されます。

ShowCursor 関数を使用すると、カーソルのデザインを変更することなく、カーソルを非表示または再表示にすることができます。 この関数は、内部カウンターを使用して、カーソルを表示または非表示にするタイミングを決定します。 カーソルを表示しようとすると、カウンターがインクリメントされ、カーソルを非表示にしようとすると、カウンターがデクリメントされます。 カーソルは、このカウンターが 0 以上の場合にのみ表示されます。

GetCursorInfo 関数は、グローバル カーソルに関して以下の情報を取得します: カーソルが表示されているか非表示か、カーソルのハンドル、カーソルの座標。

カーソルの制限

ClipCursor 関数を使用すると、画面上の四角形の領域にカーソルを閉じ込めることができます。 これは、ユーザーが四角形で区切られた限定領域内で特定のイベントに応答する必要がある場合に便利です。 たとえば、ClipCursor を使用してカーソルの移動をモーダル ダイアログ ボックスに限定し、ダイアログ ボックスが閉じられるまでユーザーが他のウィンドウを操作できないようにすることができます。

GetClipCursor 関数は、カーソルが一時的に閉じ込められている四角形領域の画面座標を取得します。 カーソルを閉じ込める必要がある場合は、この関数を使用して、カーソルが移動できる元の領域の座標を保存することもできます。 その後、新しい閉じ込めが不要になったときに、カーソルを元の領域に復元できます。

カーソルの破棄

DestroyCursor 関数を呼び出すことで、カーソル ハンドルを破棄し、カーソルが使用するメモリを解放できます。 ただし、この関数は共有カーソルには影響を及ぼしません。 共有カーソルは、それが読み込まれたモジュールがメモリに残っている間のみ有効です。 次の関数は、共有カーソルを取得します。

CreateIconIndirect 関数を使用して作成したカーソルが不要になったら、カーソルを破棄する必要があります。 DestroyIcon 関数は、カーソル ハンドルを破棄し、カーソルが使用するメモリを解放します。 この関数は、CreateIconIndirect で作成されたカーソルでのみ使用します。

カーソルの重複

CopyCursor 関数は、カーソル ハンドルをコピーします。 これにより、アプリケーションまたは DLL コードは、別のモジュールが所有するカーソルへのハンドルを取得できます。 その後、他のモジュールが解放された場合でも、カーソルをコピーしたモジュールはカーソル デザインを使用できます。

実行可能ファイル内のカーソル リソースを追加、削除、または置換する方法については、「リソース」を参照してください。

ウィンドウ クラスのカーソル

RegisterClass 関数を使用してウィンドウ クラスを登録するときに、クラス カーソルと呼ばれる既定のカーソルを割り当てることができます。 アプリケーションがウィンドウ クラスを登録した後、そのクラスの各ウィンドウは、指定されたクラス カーソルを持つようになります。

クラス カーソルをオーバーライドするには、WM_SETCURSOR メッセージを処理します。 SetClassLong 関数を使用してクラス カーソルを置き換えることもできます。 この関数は、指定したクラスのすべてのウィンドウの既定のウィンドウ設定を変更します。 詳しくは、「クラス カーソル」をご覧ください。