ウインドウスタイルで「CS_DBLCLKS」を指定します。これを指定しないとダブルクリックが使用できません。
WNDCLASSEX wcl;
省略…
wcl.style = CS_DBLCLKS;
省略…
他のプロパティも選択するのには以下のように「|」を使います。
WNDCLASSEX wcl;
省略…
wcl.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
省略…
ちなみに
CS_HREDRAWは水平方向のサイズ変更があったら全体を描き直し、
CS_VREDRAWは垂直方向のサイズ変更があったら全体を描き直しです。
シンプルに、左右シングルクリック、ダブルクリックしたらメッセージボックスを表示するコードを書いて見ます。
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message){
case WM_RBUTTONDOWN:
MessageBox(hwnd, "右シングルクリック", "右シングルクリック", MB_OK);
break;
case WM_RBUTTONDBLCLK:
MessageBox(hwnd, "右ダブルクリック", "右ダブルクリック", MB_OK);
break;
case WM_LBUTTONDOWN:
MessageBox(hwnd, "左シングルクリック", "左シングルクリック", MB_OK);
break;
case WM_LBUTTONDBLCLK:
MessageBox(hwnd, "左ダブルクリック", "左ダブルクリック", MB_OK);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
このコードは一見正しく動作しそうですが、ダブルクリックがシングルクリックとして反応してしまいます。
これは、以下のようにメッセージが送られる為です。
左クリックの場合
- WM_LBUTTONDOWN
- WM_LBUTTONUP
- WM_LBUTTONDBLCLK
- WM_LBUTTONUP
右クリックの場合
- WM_RBUTTONDOWN
- WM_RBUTTONUP
- WM_RBUTTONDBLCLK
- WM_RBUTTONUP
では、どのようにすれば良いのでしょうか?
上記のようにメッセージが送られてくるのを利用し、タイマーとGetDoubleClickTime()関数を使います。
LRESULT CALLBACK WindowFunc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch(message){
case WM_RBUTTONDOWN:
case WM_LBUTTONDOWN:
SetTimer(hwnd, message, GetDoubleClickTime(), NULL);
break;
case WM_RBUTTONDBLCLK:
KillTimer(hwnd, WM_RBUTTONDOWN);
MessageBox(hwnd, "右ダブルクリック", "右ダブルクリック", MB_OK);
break;
case WM_LBUTTONDBLCLK:
KillTimer(hwnd, WM_LBUTTONDOWN);
MessageBox(hwnd, "左ダブルクリック", "左ダブルクリック", MB_OK);
break;
case WM_TIMER:
KillTimer(hwnd, wParam);
if(wParam == WM_RBUTTONDOWN)
MessageBox(hwnd, "右シングルクリック", "右シングルクリック", MB_OK);
if(wParam == WM_LBUTTONDOWN)
MessageBox(hwnd, "左シングルクリック", "左シングルクリック", MB_OK);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd, message, wParam, lParam);
}
return 0;
}
他のプロパティも選択するのには以下のように「|」を使います。
WNDCLASSEX wcl;
省略…
wcl.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
省略…
WM_RBUTTONDOWNとWM_LBUTTONDOWNでタイマーを発生させます。
タイマー間隔は、GetDoubleClickTime()で得られた時間、すなわちダブルクリックの間隔です。
この間に、ダブルクリックメッセージがあればダブルクリック、タイマーメッセージであれば、シングルクリックとなります。
忘れていけないのは、メッセージが来た後、タイマーを切ることです。
これで、シングルとダブルクリックの使い分けができます。