レガシー Windows API(概要)について

ここで紹介しているAPIは、Windows95、Windows NT3.5時代のAPI群であり、最新のAPIは含まれていないことに注しして欲しい。なお、当時の解説書は現在よりもより詳細に解説しているため、参考になるはずである。

  • レイアウトを変換する際、崩れているページがあります。
  • 概要およびSampleコードはありますが、APIの解説はありません。

ご要望があれば旧版のWin32 API(HELP形式)をお譲りします。問い合わせフォームより申し込みください。

Windows API カーソルの概要

「カーソル」(マウス カーソル、 ポインタともいう) は、 マウス、 ペン、 トラックボールなどのポインティング デバイスによって画面の位置を制御する小さなビットマップです (このトピックでは、 ポインティング デバイスのことを「マウス」と呼びます)。ユーザーがマウスを動かしたとき、 Microsoft(R) Windows(TM) はその動きに応じてカーソルを移動します。アプリケーションは、 Microsoft(R) Win32(R) カーソル関数を使って、 カーソルの作成、 ロード、 表示、 移動、 制限、 破壊などを行うことができます。

次のトピックは、 Win32カーソルについて説明します。

  • ホットスポット
  • マウスとカーソル
  • カーソルの作成
  • カーソルの位置と外観
  • カーソルの移動の制限
  • カーソルの破棄
  • カーソルの複製
  • カーソルの作成
  • カーソルの表示
  • カーソルの移動の制限
  • マウストラップの作成
  • キーボードによるカーソルの移動

カーソル関数

Windowsは、 標準とカスタムの2種類のカーソルをサポートします。 「標準カーソル」はウィンドウやアイコンの移動、 ウィンドウのサイズ変更、 処理の停止などを自動的に表示する、 Windowsにあらかじめ定義されたカーソルです。Win32ディスプレイ ドライバ ファイルは、 矢印、 砂時計、 十字など、 13の標準カーソルを提供します。WindowsとWindows対応アプリケーションは、 これらのカーソルを使うことができます。次の図にこれらの標準カーソルと識別子を示します。

「カスタム カーソル」は、 特定のアプリケーションで使うために作成され、 開発者によってどのような形のカーソルでも作成できます。

 

ホットスポット

カーソルには、 マウス ボタンのクリックなどのマウス イベントの基準となる正確な画面上の位置を示す「ホットスポット」と呼ばれるピクセルがあります。通常、 ホットスポットは、 カーソルの注視点です。システムは、 ホットスポットをカーソルの位置として認識し、 追跡します。たとえば、 矢印型のカーソルではホットスポットは矢印の先端のピクセルで、 十字型のカーソルでは十字の交点のピクセルです。

マウス入力イベントが発生すると、 Windowsマウス ドライバは、 ホットスポットの座標を示す適切なマウス メッセージにそのイベントを変換します。Windowsは、 ホットスポットを含むウィンドウか、 マウス入力をキャプチャしているウィンドウにマウス メッセージを送ります。マウス入力について詳しくは、 マウス入力の概要を参照してください。

 

マウスとカーソル

システムにマウスがあるときは、 Windowsは、 マウスの移動に従って画面上のカーソル (マウス カーソル、 ポインタともいう) を移動します。カーソルがウィンドウの各部分やほかのウィンドウに移動すると、 Windowsは、 カーソルの外観を変更します。たとえば、 カーソルがウィンドウの境界線の上に移動すると、 Windowsは、 カーソルを両方向矢印に変更します。

システムにマウスがなければ、 Windowsは、 ウィンドウのサイズ変更や移動などの特定のシステム コマンドをユーザーが選択したときだけカーソルを表示、 移動します。マウスが利用可能でないときにもカーソルを表示、 移動できるようにするため、 カーソル関数を使ってマウスの移動をシミュレートしてください。このシミュレーション機能により、 ユーザーは方向キーでカーソルを移動できます。

 

カーソルの作成

標準カーソルはすでに定義されているため、 作成する必要はありません。標準カーソルを使うには、 LoadCursor関数を使ってカーソル ハンドルを取得します。「カーソル ハンドル」とは、 標準カーソルやカスタム カーソルを識別するHCURSOR型の一意な値です。

通常、 アプリケーション用のカスタム カーソルを作成するには、 グラフィック アプリケーションを使ってカーソルを作り、 そのカーソルをアプリケーションのリソース定義ファイルでリソースとしてインクルードします。実行時には、 LoadCursorを呼び出してカーソル ハンドルを取得します。カーソル リソースには、 数種類のディスプレイ デバイスのためのデータを含めることができます。LoadCursorは、 現在のディスプレイ デバイスに最適なデータを自動的に選択します。

また、 実行時にカスタム カーソルを作成するには、 CreateCursor関数を使います。この関数は、 指定されたサイズ、 デザイン、 ホットスポットを持つカーソルを作成します。

カスタム カーソルは実行時に作成せずに、 リソースとして実現し、 LoadCursorでロードしてください。カーソル リソースを使うことによって、 デバイスに依存しなくなり、 ローカライズが簡単になります。また、 複数のアプリケーションで同じカーソルのデザインを使うことができます。

 

カーソルを作成するそのほかの方法

上記の関数以外に、 実行時にカーソルを作成する関数が2つ (CreateIconFromResourceCreateIconIndirect) あります。これらの関数によって、 システムのリソースを調べて、 リソース データからアイコンやカーソルを作成できます。CreateIconFromResourceは、 ほかの実行可能ファイルやダイナミック リンク ライブラリのバイナリ リソース データからカーソルを作成します。この関数は、 LookupIconIDFromDirectory関数などのリソース関数をいくつか呼び出してから呼び出さなければなりません。LookupIconIDFromDirectoryは、 現在のディスプレイ デバイスに最適なカーソル データを識別します。リソース関数について詳しくは、 リソースの概要を参照してください。

CreateIconIndirectは、 ICONINFO構造体の内容に基づいてカーソルを作成します。GetIconInfo関数は、 ホットスポットの座標と関連するビットマスクや色の情報をこの構造体に設定します。

 

カーソルの位置と外観

システムにマウスがあるときは、 Windowsはカーソルを自動的に表示し、 位置を更新します。カーソルの現在のスクリーン座標を取得したり、 画面上の任意の位置にカーソルを移動するには、 それぞれ、 GetCursorPos関数とSetCursorPos関数を使います。

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

ユーザーがマウスを移動すると、 システムは、 マウスで指定された新しい位置にカーソルを再描画します。システムは、 カーソルがあるウィンドウに関連付けられているカーソル デザインに従って、 カーソルを自動的に再描画します。

カーソルのデザインを変更せずにカーソルを表示または非表示するには、 ShowCursor関数を使います。この関数は、 内部的なカウンタを使って、 カーソルを実際に表示するか非表示するかを判断します。カーソルを表示しようとすると、 カウントが1つ増やされます。また、 カーソルを非表示にしようとすると、 カウンタが1つ減らされます。カーソルは、 このカウンタが0以上のときだけ表示されます。

 

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

ウィンドウ クラスを登録するときには、 「クラス カーソル」と呼ばれるデフォルトのカーソルをクラスに設定することができます。ウィンドウ クラスを登録すると、 そのクラスのウィンドウには指定されたクラス カーソルが設定されます。

クラス カーソルを変更するには、 WM_SETCURSORメッセージを処理します。また、 SetClassLong関数を使ってクラス カーソルを置き換えることもできます。この関数は、 そのクラスのすべてのウィンドウのデフォルト ウィンドウ設定を変更します。ウィンドウ クラスについて詳しくは、 ウィンドウ クラスの概要を参照してください。

 

カーソルの移動の制限

カーソルの移動を長方形領域内に制限するには、 ClipCursor関数を使います。特定の長方形領域内のイベントにユーザーを応答させるには、 この関数が役立ちます。たとえば、 ClipCursorを使ってカーソルの移動をモーダル ダイアログ ボックス内に制限することによって、 そのダイアログ ボックスをクローズするまでほかのウィンドウにアクセスできないようにすることができます。

GetClipCursor関数は、 カーソルの移動を一時的に制限している長方形領域のスクリーン座標を取得します。カーソルの移動を制限しなければならないときは、 この関数を使って、 元のカーソル移動制限領域の座標を保存してください。カーソルの移動制限が不要になったら、 移動制限領域を元の領域に戻してください。

 

カーソルの破棄

CreateCursor関数を使って作成したカーソルが不要になったら、 破棄してください。DestroyCursor関数は、 カーソル ハンドルを破棄し、 カーソルに使われていたメモリを解放します。この関数は、 CreateCursorで作成したカーソルに対してだけ使ってください。それ以外のカーソルは破棄する必要はありません。

 

カーソルの複製

CopyCursor関数は、 カーソル ハンドルをコピーします。カーソルをコピーすることによって、 ほかのモジュールが所有するカーソルのハンドルを取得できます。カーソルを所有するモジュールが解放されても、 カーソルをコピーしたモジュールはそのカーソルを使い続けることができます。実行可能ファイル内のカーソル リスースの追加、 削除、 置き換え方法について、 詳しくはリソースの概要を参照してください。

 

カーソルの作成

次に示すコード例は、 2つのカーソル ハンドルを作成します。1つは標準の砂時計カーソルで、 もう1つは、 アプリケーションのリソース定義ファイルでリソースとしてインクルードするカスタム カーソルです。

 

HINSTANCE hinst; /* handle of current instance */
HCURSOR hCurs1, hCurs2; /* cursor handles */

/* Create a standard hourglass cursor. */

hCurs1 = LoadCursor(NULL, IDC_WAIT);

/* Create a custom cursor based on a resource. */

hCurs2 = LoadCursor(hinst, MAKEINTRESOURCE(240));

カスタム カーソルは、 リソースとして実現してください。カーソルを実行時に作成せずにLoadCursor関数を使うことによって、 デバイスに依存せず、 ローカライズが簡単になります。また、 複数のアプリケーションで同じカーソル デザインを共有できます。

次に示す例は、 システムがカーソルのビットマスクを解釈する方法を示しています。実行時にカーソル ビットマスクからカスタム カーソルを作成するには、 CreateCursor関数を使ってください。

 

HINSTANCE hinst; /* handle of current instance */
HCURSOR hCurs1, hCurs2; /* cursor handles */

HCURSOR hCurs3; /* cursor handle */

/* Yin cursor AND bitmask */

BYTE ANDmaskCursor[] = {0xFF, 0xFC, 0x3F, 0xFF, /* line 1 */
0xFF, 0xC0, 0x1F, 0xFF, /* line 2 */
0xFF, 0x00, 0x3F, 0xFF, /* line 3 */
0xFE, 0x00, 0xFF, 0xFF, /* line 4 */

0xF7, 0x01, 0xFF, 0xFF, /* line 5 */
0xF0, 0x03, 0xFF, 0xFF, /* line 6 */
0xF0, 0x03, 0xFF, 0xFF, /* line 7 */
0xE0, 0x07, 0xFF, 0xFF, /* line 8 */

0xC0, 0x07, 0xFF, 0xFF, /* line 9 */
0xC0, 0x0F, 0xFF, 0xFF, /* line 10 */
0x80, 0x0F, 0xFF, 0xFF, /* line 11 */
0x80, 0x0F, 0xFF, 0xFF, /* line 12 */

0x80, 0x07, 0xFF, 0xFF, /* line 13 */
0x00, 0x07, 0xFF, 0xFF, /* line 14 */
0x00, 0x03, 0xFF, 0xFF, /* line 15 */
0x00, 0x00, 0xFF, 0xFF, /* line 16 */

0x00, 0x00, 0x7F, 0xFF, /* line 17 */
0x00, 0x00, 0x1F, 0xFF, /* line 18 */
0x00, 0x00, 0x0F, 0xFF, /* line 19 */
0x80, 0x00, 0x0F, 0xFF, /* line 20 */

0x80, 0x00, 0x07, 0xFF, /* line 21 */
0x80, 0x00, 0x07, 0xFF, /* line 22 */
0xC0, 0x00, 0x07, 0xFF, /* line 23 */
0xC0, 0x00, 0x0F, 0xFF, /* line 24 */

0xE0, 0x00, 0x0F, 0xFF, /* line 25 */
0xF0, 0x00, 0x1F, 0xFF, /* line 26 */
0xF0, 0x00, 0x1F, 0xFF, /* line 27 */
0xF8, 0x00, 0x3F, 0xFF, /* line 28 */

0xFE, 0x00, 0x7F, 0xFF, /* line 29 */
0xFF, 0x00, 0xFF, 0xFF, /* line 30 */
0xFF, 0xC3, 0xFF, 0xFF, /* line 31 */
0xFF, 0xFF, 0xFF, 0xFF}; /* line 32 */

/* Yin cursor XOR bitmask */

BYTE XORmaskCursor[] = {0x00, 0x00, 0x00, 0x00, /* line 1 */
0x00, 0x03, 0xC0, 0x00, /* line 2 */
0x00, 0x3F, 0x00, 0x00, /* line 3 */
0x00, 0xFE, 0x00, 0x00, /* line 4 */

0x0E, 0xFC, 0x00, 0x00, /* line 5 */
0x07, 0xF8, 0x00, 0x00, /* line 6 */
0x07, 0xF8, 0x00, 0x00, /* line 7 */
0x0F, 0xF0, 0x00, 0x00, /* line 8 */

0x1F, 0xF0, 0x00, 0x00, /* line 9 */
0x1F, 0xE0, 0x00, 0x00, /* line 10 */
0x3F, 0xE0, 0x00, 0x00, /* line 11 */
0x3F, 0xE0, 0x00, 0x00, /* line 12 */

0x3F, 0xF0, 0x00, 0x00, /* line 13 */
0x7F, 0xF0, 0x00, 0x00, /* line 14 */
0x7F, 0xF8, 0x00, 0x00, /* line 15 */
0x7F, 0xFC, 0x00, 0x00, /* line 16 */

0x7F, 0xFF, 0x00, 0x00, /* line 17 */
0x7F, 0xFF, 0x80, 0x00, /* line 18 */
0x7F, 0xFF, 0xE0, 0x00, /* line 19 */
0x3F, 0xFF, 0xE0, 0x00, /* line 20 */

0x3F, 0xC7, 0xF0, 0x00, /* line 21 */
0x3F, 0x83, 0xF0, 0x00, /* line 22 */
0x1F, 0x83, 0xF0, 0x00, /* line 23 */
0x1F, 0x83, 0xE0, 0x00, /* line 24 */

0x0F, 0xC7, 0xE0, 0x00, /* line 25 */
0x07, 0xFF, 0xC0, 0x00, /* line 26 */
0x07, 0xFF, 0xC0, 0x00, /* line 27 */
0x01, 0xFF, 0x80, 0x00, /* line 28 */

0x00, 0xFF, 0x00, 0x00, /* line 29 */
0x00, 0x3C, 0x00, 0x00, /* line 30 */
0x00, 0x00, 0x00, 0x00, /* line 31 */
0x00, 0x00, 0x00, 0x00}; /* line 32 */

/* Create a custom cursor at run time. */

hCurs3 = CreateCursor(hinst, /* app instance */
19, /* horiz pos of hot spot */
2, /* vert pos of hot spot */
32, /* cursor width */
32, /* cursor height */
ANDmaskCursor, /* AND bitmask */
XORmaskCursor); /* XOR bitmask */

CreateCursorは、 カーソルを作成するとき、 次に示す真理値表をANDビットマスクとXORビットマスクに適用します。

AND XOR 表示

0 0 黒

0 1 白

1 0 画面

1 1 反転表示

ビットマップについて詳しくは、 ビットマップの概要を参照してください。

アプリケーションをクローズする前に、 CreateCursorを使って作成したカーソルをDestroyCursor関数を使って破棄してください。そのほかの関数で作成したカーソルは破棄する必要はありません。

  

カーソルの表示

システムにマウスがあれば、 Windowsは、 クラス カーソル (カーソルがあるウィンドウに関連付けられているカーソル) を自動的に表示します。クラス カーソルは、 ウィンドウ クラスを登録するときに設定できます。次の例は、 wcパラメータが識別するWNDCLASS構造体のhCursorメンバにカーソル ハンドルを設定します。

 

WNDCLASS wc;

/*
* Fill the window class structure with parameters that describe
* the main window.
*/

wc.style = NULL; /* class style(s) */
wc.lpfnWndProc = (WNDPROC) MainWndProc; /* window procedure */
wc.cbClsExtra = 0; /* no per-class extra data */
wc.cbWndExtra = 0; /* no per-window extra data */
wc.hInstance = hinstance; /* app that owns the class */
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); /* class icon */
wc.hCursor = LoadCursor(hinstance, MAKEINTRESOURCE(230));
/* class cursor */
wc.hbrBackground = GetStockObject(WHITE_BRUSH);
/* class background */
wc.lpszMenuName = "GenericMenu"; /* class menu */
wc.lpszClassName = "GenericWClass"; /* class name */

/* Register the window class. */

return RegisterClass(&wc);

ウィンドウ クラスを登録すると、 アプリケーションのリソース定義ファイル内で230で参照されるカーソルがそのクラスの全ウィンドウのデフォルト カーソルになります。

カーソルのデザインを変更するには、 別のカーソル ハンドルを指定してSetCursor関数を呼び出します。Windowsは、 新しい位置にクラス カーソルを再描画します。クラス カーソルが再描画されないようにするには、 WM_SETCURSORメッセージを処理してください。マウス入力がキャプチャされていないときにカーソルが移動すると、 Windowsは、 カーソルがあるウィンドウにこのメッセージを送ります。

WM_SETCURSORを処理するとき、 状況に応じて異なるカーソルを設定できます。たとえば、 次のコードは、 アイコン化状態のアプリケーションのアイコンにカーソルが移動するとhCurs3カーソルを表示します。

case WM_SETCURSOR:

/*
* If the window is minimized, draw the hCurs3 cursor.
* If the window is not minimized, draw the default
* cursor (class cursor).
*/

if (IsIconic(hwnd)) {
SetCursor(hCurs3);
break;
}

ウィンドウがアイコン化されていなければ、 Windowsがクラス カーソルを表示します。

クラス カーソルを置き換えるには、 SetClassLong関数を使います。この関数は、 特定のクラスに属するすべてのウィンドウのデフォルトのウィンドウ設定を変更します。次の例は、 既存のクラス カーソルをhCurs2カーソルで置き換えます。

 

/* Change the cursor for hwnd's window class. */

SetClassLong(hwnd, /* window handle */
GCL_HCURSOR, /* change cursor */
(LONG) hCurs2); /* new cursor */

ウィンドウ クラスとマウス入力について、 詳しくはウィンドウ クラスの概要を参照してください。

 

カーソルの移動の制限

次の例は、 カーソルの移動をアプリケーションのウィンドウ内に制限し、 処理が終ったら、 移動制限領域を元のウィンドウに戻します。この例では、 GetClipCursor関数を使ってカーソルの移動制限領域を取得し、 ClipCursor関数を使ってカーソルの移動制限と元の制限領域の復元を行っています。

 

RECT rcClip; /* new ClipCursor area */
RECT rcOldClip; /* previous ClipCursor area */

/* Record the area in which the cursor can move. */

GetClipCursor(&rcOldClip);

/* Get the dimensions of the application's window. */

GetWindowRect(hwnd, &rcClip);

/* Confine the cursor to the application's window. */

ClipCursor(&rcClip);

.
. /* Process input from the confined cursor. */
.

/* Restore the cursor to its previous area. */

ClipCursor(&rcOldClip);

システムで一度に利用可能なカーソルは1つしかないため、 カーソルの移動を制限したら、 ほかのウィンドウに制御を渡す前に、 カーソル移動制限領域を元に戻してください。

 

マウストラップの作成

次の例は、 SetCursorPos関数、 GetCursorPos関数、 CreateCursor関数、 LoadCursor関数、 SetCursor関数を使って、 簡単なマウストラップを作成します。また、 カーソル関数とタイマ関数を使って、 カーソルの位置を10秒間隔で監視します。カーソルの位置が最近10秒間に変化しておらず、 アプリケーションのメイン ウィンドウがアイコン化されていれば、 カーソルを変更してマウストラップ アイコンの所に移動します。

同様のマウス トラップの例が、 アイコンの概要に含まれています。例では、 CreateCursor関数とCreateIcon関数の代わりにLoadCursor関数とLoadIcon関数を使っています。CreateCursor関数とCreateIcon関数のほうが、 よりデバイスに依存する関数です。

 

HICON hIcon1; /* icon handles */
POINT ptOld; /* previous cursor location */
HCURSOR hCurs1; /* cursor handle */


/*
* The following cursor bitmasks are defined in a code example
* that appears earlier in this chapter.
*/

/* Yin cursor AND and XOR bitmasks */

BYTE ANDmaskCursor[] = ...
BYTE XORmaskCursor[] = ...

/* Yang icon AND bitmask */

BYTE ANDmaskIcon[] = {0xFF, 0xFF, 0xFF, 0xFF, /* line 1 */
0xFF, 0xFF, 0xC3, 0xFF, /* line 2 */
0xFF, 0xFF, 0x00, 0xFF, /* line 3 */
0xFF, 0xFE, 0x00, 0x7F, /* line 4 */

0xFF, 0xFC, 0x00, 0x1F, /* line 5 */
0xFF, 0xF8, 0x00, 0x0F, /* line 6 */
0xFF, 0xF8, 0x00, 0x0F, /* line 7 */
0xFF, 0xF0, 0x00, 0x07, /* line 8 */

0xFF, 0xF0, 0x00, 0x03, /* line 9 */
0xFF, 0xE0, 0x00, 0x03, /* line 10 */
0xFF, 0xE0, 0x00, 0x01, /* line 11 */
0xFF, 0xE0, 0x00, 0x01, /* line 12 */

0xFF, 0xF0, 0x00, 0x01, /* line 13 */
0xFF, 0xF0, 0x00, 0x00, /* line 14 */
0xFF, 0xF8, 0x00, 0x00, /* line 15 */
0xFF, 0xFC, 0x00, 0x00, /* line 16 */

0xFF, 0xFF, 0x00, 0x00, /* line 17 */
0xFF, 0xFF, 0x80, 0x00, /* line 18 */
0xFF, 0xFF, 0xE0, 0x00, /* line 19 */
0xFF, 0xFF, 0xE0, 0x01, /* line 20 */

0xFF, 0xFF, 0xF0, 0x01, /* line 21 */
0xFF, 0xFF, 0xF0, 0x01, /* line 22 */
0xFF, 0xFF, 0xF0, 0x03, /* line 23 */
0xFF, 0xFF, 0xE0, 0x03, /* line 24 */

0xFF, 0xFF, 0xE0, 0x07, /* line 25 */
0xFF, 0xFF, 0xC0, 0x0F, /* line 26 */
0xFF, 0xFF, 0xC0, 0x0F, /* line 27 */
0xFF, 0xFF, 0x80, 0x1F, /* line 28 */

0xFF, 0xFF, 0x00, 0x7F, /* line 29 */
0xFF, 0xFC, 0x00, 0xFF, /* line 30 */
0xFF, 0xF8, 0x03, 0xFF, /* line 31 */
0xFF, 0xFC, 0x3F, 0xFF}; /* line 32 */

/* Yang icon XOR bitmask */

BYTE XORmaskIcon[] = {0x00, 0x00, 0x00, 0x00, /* line 1 */
0x00, 0x00, 0x00, 0x00, /* line 2 */
0x00, 0x00, 0x00, 0x00, /* line 3 */
0x00, 0x00, 0x00, 0x00, /* line 4 */

0x00, 0x00, 0x00, 0x00, /* line 5 */
0x00, 0x00, 0x00, 0x00, /* line 6 */
0x00, 0x00, 0x00, 0x00, /* line 7 */
0x00, 0x00, 0x38, 0x00, /* line 8 */

0x00, 0x00, 0x7C, 0x00, /* line 9 */
0x00, 0x00, 0x7C, 0x00, /* line 10 */
0x00, 0x00, 0x7C, 0x00, /* line 11 */
0x00, 0x00, 0x38, 0x00, /* line 12 */

0x00, 0x00, 0x00, 0x00, /* line 13 */
0x00, 0x00, 0x00, 0x00, /* line 14 */
0x00, 0x00, 0x00, 0x00, /* line 15 */
0x00, 0x00, 0x00, 0x00, /* line 16 */

0x00, 0x00, 0x00, 0x00, /* line 17 */
0x00, 0x00, 0x00, 0x00, /* line 18 */
0x00, 0x00, 0x00, 0x00, /* line 19 */
0x00, 0x00, 0x00, 0x00, /* line 20 */

0x00, 0x00, 0x00, 0x00, /* line 21 */
0x00, 0x00, 0x00, 0x00, /* line 22 */
0x00, 0x00, 0x00, 0x00, /* line 23 */
0x00, 0x00, 0x00, 0x00, /* line 24 */

0x00, 0x00, 0x00, 0x00, /* line 25 */
0x00, 0x00, 0x00, 0x00, /* line 26 */
0x00, 0x00, 0x00, 0x00, /* line 27 */
0x00, 0x00, 0x00, 0x00, /* line 28 */

0x00, 0x00, 0x00, 0x00, /* line 29 */
0x00, 0x00, 0x00, 0x00, /* line 30 */
0x00, 0x00, 0x00, 0x00, /* line 31 */
0x00, 0x00, 0x00, 0x00}; /* line 32 */

hIcon1 = CreateIcon(hinstance, /* handle of app instance */
32, /* icon width */
32, /* icon height */
1, /* number of XOR planes */
1, /* number of bits per pixel */
ANDmaskIcon, /* AND bitmask */
XORmaskIcon); /* XOR bitmask */

hCurs1 = CreateCursor(hinstance, /* handle of app instance */
19, /* horiz. position of hot spot */
2, /* vert. position of hot spot */
32, /* cursor width */
32, /* cursor height */
ANDmaskCursor, /* AND bitmask */
XORmaskCursor); /* XOR bitmask */


.
. /* Fill in the window class structure. */
.

WNDCLASS wc;

wc.hIcon = hIcon1; /* class icon */
wc.hCursor = LoadCursor(NULL, IDC_ARROW); /* class cursor */

.
. /*
. * Register the window class and perform
. * other application initialization.
. */
.

/* Set a timer for the mousetrap. */

GetCursorPos(&ptOld);

SetTimer(hwnd, IDT_CURSOR, 10000, (TIMERPROC) NULL);

LONG APIENTRY MainWndProc(
HWND hwnd, /* window handle */
UINT message, /* type of message */
UINT wParam, /* additional information */
LONG lParam) /* additional information */
{

HDC hdc; /* handle of device context */
POINT pt; /* current cursor location */
RECT rc; /* iconized window location */

switch (message) {
.
. /* Process other messages. */
.

case WM_TIMER:

/*
* If the window is minimized, compare the current
* cursor position with the one 10 seconds before.
* If the cursor position has not changed, move the
* cursor to the icon.
*/

if (IsIconic(hwnd)) {
GetCursorPos(&pt);

if ((pt.x == ptOld.x) && (pt.y == ptOld.y)) {
GetWindowRect(hwnd, &rc);
SetCursorPos(rc.left + 20, rc.top + 4);

/*
* Note that the additional constants
* (20 and 4) are application-specific
* values to align the yin-shaped cursor
* and the yang-shaped icon.
*/

}
else {
ptOld.x = pt.x;
ptOld.y = pt.y;
}
}

return 0;

case WM_SETCURSOR:

/*
* If the window is minimized, draw hCurs1.
* If the window is not minimized, draw the default
* cursor (class cursor).
*/

if (IsIconic(hwnd)) {
SetCursor(hCurs1);
break;
}

case WM_DESTROY:

/* Destroy timer. */

KillTimer(hwnd, IDT_CURSOR);

PostQuitMessage(0);
break;

.
. /* Process other messages. */
.

} /* ends switch (message) */

キーボードによるカーソルの移動

Windowsにはマウスは必須ではないため、 アプリケーションは、 キーボードでマウスの動作をシミュレートできなければなりません。次の例は、 マウスのシミュレートを行う方法を示しています。この例では、 GetCursorPos関数とSetCursorPos関数を使ってカーソルの位置を管理し、 方向キーの入力を処理しています。

HCURSOR hCurs1, hCurs2; /* cursor handles */

POINT pt; /* cursor location */
RECT rc; /* client area coordinates */
static int repeat = 1; /* repeat key counter */

.
. /* Other declarations and initialization. */
.

switch (message) {

.
. /* Process other messages. */
.

case WM_KEYDOWN:

if (wParam != VK_LEFT && wParam != VK_RIGHT &&
wParam != VK_UP && wParam != VK_DOWN) {
break;
}

GetCursorPos(&pt);

/* Convert screen coordinates to client coordinates. */

ScreenToClient(hwnd, &pt);

switch (wParam) {

/*
* Move the cursor to reflect which
* arrow keys are pressed.
*/

case VK_LEFT: /* left arrow */
pt.x -= repeat;
break;

case VK_RIGHT: /* right arrow */
pt.x += repeat;
break;

case VK_UP: /* up arrow */
pt.y -= repeat;
break;

case VK_DOWN: /* down arrow */
pt.y += repeat;
break;

default:
return NULL;

}

repeat++; /* increments repeat count */

/* Keep the cursor in the client area. */

GetClientRect(hwnd, &rc);

if (pt.x >= rc.right) {
pt.x = rc.right - 1;
}
else {
if (pt.x < rc.left) {
pt.x = rc.left;
}
}

if (pt.y >= rc.bottom) {
pt.y = rc.bottom - 1;
}
else {
if (pt.y < rc.top) {
pt.y = rc.top;
}
}

/* Convert client coordinates to screen coordinates. */

ClientToScreen(hwnd, &pt);
SetCursorPos(pt.x, pt.y);
break;

case WM_KEYUP:

repeat = 1; /* clears repeat count */
break;

.
.
.

} /* ends switch (message) */

 

 

カーソル関数とメッセージ

カーソルに関する関数とメッセージを次に示します。

 

関数

ClipCursor

CopyCursor

CreateCursor

DestroyCursor

GetClipCursor

GetCursor

GetCursorPos

LoadCursor

LoadCursorFromFile

SetCursor

SetCursorPos

SetSystemCursor

ShowCursor

 

メッセージ

WM_SETCURSOR

 

▲ページトップに戻る

【本を読んでもよくらからない】 … 個別指導でわかりやすくお教えします