マウスによる描画
WM_MOUSEMOVE メッセージの処理中にウィンドウ プロシージャを描画することで、ユーザーがマウスで線を描画することを許可できます。 ユーザーがウィンドウ内でカーソルを移動するたびに、WM_MOUSEMOVE メッセージがウィンドウ プロシージャに送信されます。 ウィンドウ プロシージャは、線を描画するために、ディスプレイ デバイス コンテキストを取得し、現在のカーソル位置と前のカーソル位置の間にウィンドウ内の線を描画できます。
次の例では、ウィンドウ プロシージャは、ユーザーがマウスの左ボタンを押したまま (WM_LBUTTONDOWN メッセージを送信する) ときに描画の準備をします。 ユーザーがウィンドウ内でカーソルを移動すると、ウィンドウ プロシージャは一連の WM_MOUSEMOVE メッセージを受け取ります。 各メッセージについて、ウィンドウ プロシージャは前の位置と現在の位置を結ぶ線を描画します。 この手順では、行を描画するために、GetDC を使用してディスプレイ デバイス コンテキストを取得します。その後、描画が完了し、メッセージから戻る前に、プロシージャは ReleaseDC 関数を使用してディスプレイ デバイス コンテキストを解放します。 ユーザーがマウス ボタンを離するとすぐに、ウィンドウ プロシージャによってフラグがクリアされ、描画が停止します (WM_LBUTTONUP メッセージが送信されます)。
BOOL fDraw = FALSE;
POINT ptPrevious;
.
.
.
case WM_LBUTTONDOWN:
fDraw = TRUE;
ptPrevious.x = LOWORD(lParam);
ptPrevious.y = HIWORD(lParam);
return 0L;
case WM_LBUTTONUP:
if (fDraw)
{
hdc = GetDC(hwnd);
MoveToEx(hdc, ptPrevious.x, ptPrevious.y, NULL);
LineTo(hdc, LOWORD(lParam), HIWORD(lParam));
ReleaseDC(hwnd, hdc);
}
fDraw = FALSE;
return 0L;
case WM_MOUSEMOVE:
if (fDraw)
{
hdc = GetDC(hwnd);
MoveToEx(hdc, ptPrevious.x, ptPrevious.y, NULL);
LineTo(hdc, ptPrevious.x = LOWORD(lParam),
ptPrevious.y = HIWORD(lParam));
ReleaseDC(hwnd, hdc);
}
return 0L;
この例のように描画を有効にするアプリケーションでは、通常、ウィンドウが更新されるたびに線を再描画できるように、点または線を記録します。 描画アプリケーションでは、多くの場合、メモリ デバイス コンテキストと関連するビットマップを使用して、マウスを使用して描画された線を格納します。