Share via


マウスによる描画

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; 

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