ダブルクリック取得 †
HSPのウィンドウ上でマウスのダブルクリックを取得します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
| #include "user32.as"
#define WM_LBUTTONDOWN $0201
#define WM_LBUTTONDBLCLK $0203
#define WM_RBUTTONDOWN $0204
#define WM_RBUTTONDBLCLK $0206
#define WM_MBUTTONDOWN $0207
#define WM_MBUTTONDBLCLK $0209
GetClassLong hwnd, -26
SetClassLong hwnd, -26, stat | $0008
oncmd gosub *On_LButtonDown , WM_LBUTTONDOWN
oncmd gosub *On_LButtonDblClk, WM_LBUTTONDBLCLK
oncmd gosub *On_RButtonDown , WM_RBUTTONDOWN
oncmd gosub *On_RButtonDblClk, WM_RBUTTONDBLCLK
oncmd gosub *On_MButtonDown , WM_MBUTTONDOWN
oncmd gosub *On_MButtonDblClk, WM_MBUTTONDBLCLK
stop
*On_LButtonDown
mes "左シングルクリック"
return
*On_LButtonDblClk
mes "左ダブルクリック"
return
*On_RButtonDown
mes "右シングルクリック"
return
*On_RButtonDblClk
mes "右ダブルクリック"
return
*On_MButtonDown
mes "中シングルクリック"
return
*On_MButtonDblClk
mes "中ダブルクリック"
return
|
通常のマウスクリックメッセージは左ボタンであれば WM_LBUTTONDOWN -> WM_LBUTTONUP -> WM_LBUTTONDOWN -> WM_LBUTTONUP というように発生します。
ダブルクリックメッセージでは WM_LBUTTONDOWN -> WM_LBUTTONUP -> WM_LBUTTONDBLCLK -> WM_LBUTTONUP というように短い間で連続して発生した WM_LBUTTONDOWN を WM_LBUTTONDBLCLK として特別扱いします。
特別扱いなので通常とは違った設定にしてやらなければなりません。
これを行うにはウィンドウのクラススタイルに CS_DBLCLKS ( $0008 ) を加えてやります。
注目してほしいのはウィンドウスタイルではなくクラススタイルを変更するという点です。
次のスクリプトをよくみてください。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
| #include "user32.as"
#define WM_LBUTTONDOWN $0201
#define WM_LBUTTONDBLCLK $0203
#define WM_RBUTTONDOWN $0204
#define WM_RBUTTONDBLCLK $0206
#define WM_MBUTTONDOWN $0207
#define WM_MBUTTONDBLCLK $0209
winx = ginfo_dispx/2
screen 0, 320, 240, 0, winx/2-160, ginfo_dispy/2-120
title "ID0"
GetClassLong hwnd, -26
SetClassLong hwnd, -26, stat | $0008
oncmd gosub *On_LButtonDblClk, WM_LBUTTONDBLCLK
screen 2, 320, 240, 0, winx+80, ginfo_dispy/2-120
title "ID2"
oncmd gosub *On_LButtonDblClk, WM_LBUTTONDBLCLK
stop
*On_LButtonDblClk
gsel ginfo(24)
mes "左ダブルクリック"
return
|
14〜15行目でクラススタイルを変更していますがこの時の hwnd はID0のウィンドウハンドルです。
ID0のウィンドウのウィンドウクラスを変更しているのでID2のウィンドウには影響なさそうですよね。
ちなみに26行目の意味は「 WM_LBUTTONDBLCLK メッセージを受け取ったウィンドウのIDを描画先に指定する」ですから、
ウィンドウクラスを変更していないID2には WM_LBUTTONDBLCLK メッセージは発生しないハズですね。
でも実際はどうですか?ID2のウィンドウでもダブルクリックを取得できています。
これはID0とID2とで同じウィンドウクラスを共有しているからです。
ウィンドウスタイルはウィンドウ毎の概観などを決定するためのもので異なるウィンドウのウィンドウスタイルを共有することはありません。
(同じウィンドウスタイルをもつ片方のウィンドウスタイルを変更しても、もう一方にはその変更は反映しません。)
しかしウィンドウクラスは共有することができるので同じウィンドウクラスを使っているウィンドウはそのウィンドウクラスを使っている全てのウィンドウに変更が反映されます。
ただし変更した内容が全てのウィンドウに瞬時に反映されるというわけではありません。