次の方法で共有


マウス クリックへの応答

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

メッセージ 意味
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 ビットは使用されません。 Windows のドキュメントでは、lParam の「下位ワード」と「高次ワード」について説明しています。64 ビットのケースは、下位 32 ビットの下位および上位の単語を意味します。 マクロは適切な値を抽出するため、使用すると安全です。

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

その他のフラグ

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

フラグ 意味
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_XBUTTONDOWNWM_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 に渡す必要があります。 そうしないと、ウィンドウのドラッグや最小化などの標準機能がアプリケーションによって中断されます。

次へ

マウスの動き