マウス クリックへの応答

カーソルがウィンドウのクライアント領域の上にあるときにユーザーがマウス ボタンをクリックすると、ウィンドウは次のいずれかのメッセージを受け取ります。

メッセージ 意味
WM_LBUTTONDOWN 左ボタンを下へ
WM_LBUTTONUP 左ボタンを上へ
WM_MBUTTONDOWN 中央ボタンを下へ
WM_MBUTTONUP 中央ボタンを上へ
WM_RBUTTONDOWN 右ボタンを下へ
WM_RBUTTONUP 右ボタンを上へ
WM_XBUTTONDOWN XBUTTON1 または XBUTTON2 ダウン
WM_XBUTTONUP XBUTTON1 または XBUTTON2 アップ

 

クライアント領域は、フレームを除外するウィンドウの部分であることを思い出してください。 クライアント領域の詳細については、「ウィンドウとは」を参照してください。

マウス座標

これらのすべてのメッセージで、 lParam パラメーターにはマウス ポインターの x 座標と y 座標が含まれています。 lParam の最下位 16 ビットには x 座標が含まれており、次の 16 ビットには y 座標が含まれます。 GET_X_LPARAMマクロと GET_Y_LPARAM マクロを使用して、lParam から座標をアンパックします。

int xPos = GET_X_LPARAM(lParam); 
int yPos = GET_Y_LPARAM(lParam);

これらのマクロは、ヘッダー ファイル WindowsX.h で定義されています。

64 ビット Windows では、 lParam は 64 ビット値です。 lParam の上位 32 ビットは使用されません。 MSDN ドキュメントでは、 lParam の "下位ワード" と "高次語" について説明しています。 64 ビットの場合、これは下位 32 ビットの下位ワードと上位ワードを意味します。 マクロは適切な値を抽出するため、使用する場合は安全です。

マウス座標は、デバイスに依存しないピクセル (DIP) ではなくピクセル単位で指定され、ウィンドウのクライアント領域を基準にして測定されます。 座標は符号付きの値です。 クライアント領域の上と左側の位置には負の座標があります。これは、ウィンドウの外側でマウスの位置を追跡する場合に重要です。 これを行う方法については、後のトピック「 ウィンドウの外でのマウスの動きのキャプチャ」を参照してください

その他のフラグ

wParam パラメーターには、他のマウス ボタンの状態に Shift キーと Ctrl キーを加えた状態を示す、フラグのビットごとの OR が含まれています。

フラグ 説明
MK_CONTROL Ctrl キーがダウンしています。
MK_LBUTTON マウスの左ボタンが下に表示されます。
MK_MBUTTON マウスの中央ボタンが下に表示されます。
MK_RBUTTON マウスの右ボタンが下に表示されます。
MK_SHIFT Shift キーがダウンしています。
MK_XBUTTON1 [XBUTTON1] ボタンがダウンしています。
MK_XBUTTON2 [XBUTTON2] ボタンがダウンしています。

 

フラグがない場合は、対応するボタンまたはキーが押されていないことを意味します。 たとえば、Ctrl キーがダウンしているかどうかをテストするには、次のようにします。

if (wParam & MK_CONTROL) { ...

Ctrl キーと Shift キー以外の他のキーの状態を見つける必要がある場合は、「キーボード入力」で説明されている GetKeyState 関数を使用します。

WM_XBUTTONDOWNおよびWM_XBUTTONUP ウィンドウ メッセージは、XBUTTON1 と XBUTTON2 の両方に適用されます。 wParam パラメーターは、クリックされたボタンを示します。

UINT button = GET_XBUTTON_WPARAM(wParam);  
if (button == XBUTTON1)
{
    // XBUTTON1 was clicked.
}
else if (button == XBUTTON2)
{
    // XBUTTON2 was clicked.
}

ダブルクリック

既定では、ウィンドウはダブルクリック通知を受け取りません。 ダブルクリックを受け取る場合は、ウィンドウ クラスを登録するときに WNDCLASS 構造体にCS_DBLCLKS フラグを設定します。

    WNDCLASS wc = { };
    wc.style = CS_DBLCLKS;

    /* Set other structure members. */

    RegisterClass(&wc);

表示されているCS_DBLCLKS フラグを設定すると、ウィンドウにダブルクリック通知が表示されます。 ダブルクリックは、名前に "DBLCLK" というウィンドウ メッセージが表示されます。 たとえば、マウスの左ボタンをダブルクリックすると、次の一連のメッセージが生成されます。

WM_LBUTTONDOWN
WM_LBUTTONUP
WM_LBUTTONDBLCLK
WM_LBUTTONUP

実際には、通常生成される 2 番目 のWM_LBUTTONDOWN メッセージは 、WM_LBUTTONDBLCLK メッセージになります。 同等のメッセージは、右ボタン、中央ボタン、XBUTTON ボタンに対して定義されます。

ダブルクリック メッセージが表示されるまで、最初のマウス クリックがダブルクリックの開始であることを通知する方法はありません。 したがって、ダブルクリック アクションは、最初のマウス クリックで始まるアクションを続行する必要があります。 たとえば、Windows シェルでは、1 回のクリックでフォルダーが選択され、ダブルクリックするとフォルダーが開きます。

クライアント以外のマウス メッセージ

ウィンドウのクライアント以外の領域内で発生するマウス イベントに対して、個別のメッセージ セットが定義されています。 これらのメッセージの名前には、"NC" という文字が含まれます。 たとえば、 WM_NCLBUTTONDOWN はクライアント以外のWM_LBUTTONDOWNに相当 しますDefWindowProc 関数がこれらのメッセージを正しく処理するため、一般的なアプリケーションはこれらのメッセージをインターセプトしません。 ただし、これらは特定の高度な関数に役立ちます。 たとえば、これらのメッセージを使用して、タイトル バーにカスタム動作を実装できます。 これらのメッセージを処理する場合は、通常、後 で DefWindowProc に渡す必要があります。 そうしないと、ウィンドウのドラッグや最小化などの標準機能がアプリケーションによって中断されます。

次へ

マウスの動き