マウス クリックへの応答
カーソルがウィンドウのクライアント領域上にあるときにユーザーがマウス ボタンをクリックすると、ウィンドウは次のいずれかのメッセージを受け取ります。
メッセージ | 意味 |
---|---|
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_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" を含むウィンドウ メッセージによって示されます。 たとえば、マウスの左ボタンをダブルクリックすると、次の一連のメッセージが生成されます。
実際には、通常生成される 2 番目の WM_LBUTTONDOWN メッセージは、WM_LBUTTONDBLCLK メッセージになります。 同等のメッセージは、右ボタン、中央ボタン、XBUTTON ボタンに対して定義されます。
ダブルクリック メッセージが表示されるまで、最初のマウス クリックがダブルクリックの開始であることを通知する方法はありません。 したがって、ダブルクリック アクションは、最初のマウス クリックで始まるアクションを続行する必要があります。 たとえば、Windows シェルでは、1 回のクリックでフォルダーが選択され、ダブルクリックするとフォルダーが開きます。
クライアント以外のマウス メッセージ
ウィンドウのクライアント以外の領域内で発生するマウス イベントに対して、個別のメッセージ セットが定義されます。 これらのメッセージには、名前に "NC" という文字が含まれます。 たとえば、WM_NCLBUTTONDOWN はクライアント以外の WM_LBUTTONDOWN に相当します。 DefWindowProc 関数がこれらのメッセージを正しく処理するため、一般的なアプリケーションはこれらのメッセージをインターセプトしません。 ただし、特定の高度な関数に役立つ場合があります。 たとえば、これらのメッセージを使用して、タイトル バーにカスタム動作を実装できます。 これらのメッセージを処理する場合は通常、後で DefWindowProc に渡す必要があります。 そうしないと、ウィンドウのドラッグや最小化などの標準機能がアプリケーションによって中断されます。
次へ