ダブルクリック


ダブルクリックはどのように?

以前説明した、WM_LBUTTONDOWN と WM_LBUTTONUP を用いて
プログラム側でダブルクリックを作り出すことが可能です

しかし、Windows はユーザーが自分に合わせたダブルクリックを設定しているため
//コントロールパネルのマウスの設定で変更することができる
通常は、プログラムで独自の処理を行うことは好ましくないでしょう

やはりダブルクリックも Windows がサポートしているので
一般的に、これもメッセージで処理します

ダブルクリックのメッセージは次のようになっています

左ボタン = WM_LBUTTONDBLCLK
中ボタン = WM_MBUTTONDBLCLK
右ボタン = WM_RBUTTONDBLCLK

ただし、これらは そのままでは発生しません
WNDCLASS の style メンバの指定に CS_DBLCLKS を加える必要があります

もし、CS_DBLCLKS を指定していなければ
例えば、左ボタンの連続したクリックは次のようになります

WM_LBUTTONDOWN -> WM_LBUTTONUP -> WM_LBUTTONDOWN -> WM_LBUTTONUP

ところが、CS_DBLCLKS を指定していれば次のようになります

WM_LBUTTONDOWN -> WM_LBUTTONUP -> WM_LBUTTONDBLCLK -> WM_LBUTTONUP

2回目の WM_LBUTTONDOWN が変化していますね
これは、物理的に近い位置で設定されているダブルクリック間隔の時間に行われた場合です
当然、単一クリックとダブルクリックの処理を分けることも可能です
#include <windows.h>

LRESULT CALLBACK WndProc(HWND hwnd , UINT msg , WPARAM wp , LPARAM lp) {
	HDC hdc;
	PAINTSTRUCT ps;
	static LPCTSTR pctKitty = TEXT("Kitty on your lap");
	static unsigned short int x = 0 , y = 0;

	switch (msg) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_LBUTTONDBLCLK:
		x = LOWORD(lp);
		y = HIWORD(lp);
		InvalidateRect(hwnd , NULL , TRUE);
		return 0;
	case WM_PAINT:
		hdc = BeginPaint(hwnd , &ps);
		TextOut(hdc , x , y , pctKitty , lstrlen(pctKitty));
		EndPaint(hwnd , &ps);
		return 0;
	}
	return DefWindowProc(hwnd , msg , wp , lp);
}

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow ) {
	HWND hwnd;
	MSG msg;
	WNDCLASS winc;

	winc.style		= CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
	winc.lpfnWndProc	= WndProc;
	winc.cbClsExtra	= winc.cbWndExtra	= 0;
	winc.hInstance		= hInstance;
	winc.hIcon		= LoadIcon(NULL , IDI_APPLICATION);
	winc.hCursor		= LoadCursor(NULL , IDC_ARROW);
	winc.hbrBackground	= (HBRUSH)GetStockObject(WHITE_BRUSH);
	winc.lpszMenuName	= NULL;
	winc.lpszClassName	= TEXT("KITTY");

	if (!RegisterClass(&winc)) return -1;

	hwnd = CreateWindow(
			TEXT("KITTY") , TEXT("Kitty on your lap") ,
			WS_OVERLAPPEDWINDOW | WS_VISIBLE ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			CW_USEDEFAULT , CW_USEDEFAULT ,
			NULL , NULL , hInstance , NULL
	);

	if (hwnd == NULL) return -1;

	while(GetMessage(&msg , NULL , 0 , 0)) DispatchMessage(&msg);
	return msg.wParam;
}
これは、「マウスメッセージ」の章のソースを改造した形のものです
ダブルクリックをした座標に、文字が描画されます



前のページへ戻る次のページへ