マウスによる描画
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;
この例のように描画を有効にするアプリケーションでは、通常、ポイントまたは線を記録して、ウィンドウが更新されるたびに線を再描画できるようにします。 描画アプリケーションでは、多くの場合、メモリ デバイス コンテキストと関連するビットマップを使用して、マウスを使用して描画された線を格納します。