Entwickler-Ecke

Windows API - Doppelklick?


matze.de - Mo 25.07.05 12:24
Titel: Doppelklick?
Hi,
Ich versuche die Ganze Zeit schon einen Doppelklick bei mir im Programm zu implementieren. Die Struktur sieht bei mir so aus:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
Function WndProc(HWND: HWND; uMsg: UINT; wParam: wParam;
    lParam: lParam): LRESULT; Stdcall;
Begin
    Result := 0;
    Case uMsg Of
        {...}
        WM_COMMAND:
            Begin
                If HiWord(wParam) = BN_CLICKED Then
                Begin
                  {...}
                End;
                If HiWord(wParam) = BN_DOUBLECLICKED Then
                Begin
                  {...}
                End;
            End;
    End
    Else
        Result := DefWindowProc(HWND, uMsg, wParam, lParam);
    End;
End;


Jetzt geht der bei nem Doppelklick aber in den BN_CLICKED Zweig, was ja auch logisch ist, denn nen Doppelklick sind ja nur 2 aufeinanderfolgende Klicks. Jetzt von mir die Frage: Wie realisiere ich einen Doppelklick?

mfg matze


jaenicke - Mo 25.07.05 12:36

Es gibt Mausbotschaften für Klick und Doppelklick. Dort wird allerdings der erste Klick wohl auch als Einzelklick gegeben und ZUSÄTZLICH als Doppelklick.

Möglichkeit: Mit GetSystemMetrics die Doppelklickzeit herausfinden und nach einem Klick diese Zeit warten, ob ein weiterer Klick folgt.


Overdosed - Mi 27.07.05 13:49

Habs jetzt nicht ausprobiert, aber sollte es so oder ählich nicht funktionieren ?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
Function WndProc(HWND: HWND; uMsg: UINT; wParam: wParam;
    lParam: lParam): LRESULT; Stdcall;
Begin
    Result := 0;
    Case uMsg Of
        {...}
        WM_COMMAND:
            Begin
                If HiWord(wParam) = BN_DOUBLECLICKED Then
                Begin
                  {...}
                End;
                If HiWord(wParam) = BN_CLICKED Then
                Begin
                  {...}
                End;
            End;
    End
    Else
        Result := DefWindowProc(HWND, uMsg, wParam, lParam);
    End;
End;


Sprich, die zwei IF's in ihrer Reihenfolge tauschen ?
Dann kann im Begin/End des BN_DOUBLECLICKED die Funktion beendet werden, ohne dass er je in BN_CLICKED springt.

Gruss, Perry

Moderiert von user profile iconMotzi: Code- durch Delphi-Tags ersetzt.


hallo - Mi 27.07.05 13:54

Das wird nicht funktionieren...
Zuerst wird der normale Klick ausgelöst, und da weiß der noch nix vom Doppelclick!


Overdosed - Mi 27.07.05 14:08

Also willst du mir damit sagen, dass ein Doppelklick nicht abfangbar ist, weil ja sowieso immer nur der erste klick ausgewertet wird ?

Muss doch irgendwie gehen ?!


Overdosed - Mi 27.07.05 14:37

So, hab also nochmal schnell ein bisschen rumgespielt und hab die Unterscheidung zwischen dem Doppel- und dem Einzelklick nicht hinbekommen.
Kann zwar auf den Doppelklick reagieren, aber nur bei "ausgeschaltetem" Klick.

Wichtig ist aber der Style des Buttons, BN_DOUBLECLICKED funktioniert nur mit BS_OWNERDRAW or BS_RADIOBUTTON, dran denken und die WIN-SDK-Hilfe befragen.


matze.de - Mi 27.07.05 16:06

Ich hatte nun das Problem in der Listbox, aber das is gelöst, da die ListBox ne eigene Message sendet bei nem Doppelklick auf einen String. Aber wenn man nun auf die Form nen Doppelklick machen will, das bleibt immernoch offen....

mfg matze


jaenicke - Mi 27.07.05 16:24

Warum benutzt du eigentlich nicht die Ereignisse des Formulars?
Es gibt doch onDblClick und onClick!


matze.de - Mi 27.07.05 16:36

:D jaenicke Wir sprechen hier von nonVCL, da is das ned ganz so einfach.

mfg matze


jaenicke - Mi 27.07.05 17:33

:oops: :oops: :oops:
Ähh, da hab ich nicht drauf geachtet...

Aber wie wärs mit den entsprechenden Botschaften:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/userinput/mouseinput/mouseinputreference/mouseinputmessages/wm_lbuttondblclk.asp