[PR]

シングルクリックとダブルクリックを使い分ける

戻る

 例えば左ボタンのダブルクリック時には、メッセージは次のように送られる。

 WM_LBUTTONDOWN -> WM_LBUTTONUP -> WM_LBUTTONDBLCLK -> WM_LBUTTONUP

 ダブルクリック時にシングルクリックに対応する処理を行いたくないならば、1回目のクリックからダブルクリック時間が経過するまで処理を行わないようにすればよい。
 ダブルクリック時間は関数 GetDoubleClickTime() によって取得できる。

対処例

LRESULT APIENTRY WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
	// UINT uMsg; は、ウィンドウに送られてきたメッセージの値
	switch( uMsg )
	{
		// クリック開始
		case WM_LBUTTONDOWN:
		case WM_RBUTTONDOWN:
			SetTimer( hWnd, uMsg, GetDoubleClickTime(), NULL );
			break;

		// ダブルクリック
		case WM_LBUTTONDBLCLK:
			KillTimer( hWnd, WM_LBUTTONDOWN ); // 左のシングルクリックをキャンセル
			MessageBox( hWnd, "ダブルクリックされました。", "左", MB_OK );
			break;
		case WM_RBUTTONDBLCLK:
			KillTimer( hWnd, WM_RBUTTONDOWN ); // 右のシングルクリックをキャンセル
			MessageBox( hWnd, "ダブルクリックされました。", "右", MB_OK );
			break;
		
		// シングルクリック
		case WM_TIMER:
			KillTimer( hWnd, wParam );
			if ( wParam == WM_LBUTTONDOWN ) MessageBox( hWnd, "クリックされました。", "左", MB_OK );
			if ( wParam == WM_RBUTTONDOWN ) MessageBox( hWnd, "クリックされました。", "右", MB_OK );
			break;

	…… 省略 ……

}//WindowProc

Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
IDGは全世界85カ国でIT関連雑誌を発行する出版社です。