DoubleClick Event unterbinden, für von CButton abgeleitete Klasse



  • Hallo,

    habe ein Problem mit einer von CButton abgeleiteten Klasse.

    Das eingesetzte Betriebssystem ist WindowsCE 5.0

    Die abgeleitete Klasse reagiert auf Doppel-/ bzw. Mehrfachklicks plötzlich anders als es die Basisklasse tut.

    Wenn ich mit einer CButton Member Variable auf einem Dialog arbeite, kann ich schnelle Mausklicks verarbeiten. Verwende ich die abgeleitete Klasse erhalte ich statt

    WM_LBUTTONDOWN -> WM_LBUTTONUP -> WM_LBUTTONDOWN -> WM_LBUTTONUP... usw
    

    diese Sequenz

    WM_LBUTTONDOWN -> WM_LBUTTONDBLCLK -> WM_LBUTTONDOWN -> WM_LBUTTONDBLCLK... usw
    

    Ich habe schon versucht PreCreateWindow zu überschreiben und das FLAG DBLCLKS aus dem Class Style zu entfernen, leider ohne Erfolg.

    Ebenso hab ich die Message WM_LBUTTONDBLCLK abgefangen und eine WM_LBUTTONDOWN daraus gemacht, ebenfalls ohne Erfolg.

    Das Problem tritt sogar auch dann auf wenn ich von CStatic ableite.

    Der Button soll unter WindowsCE per Touch bedienbar sein und kein Doppelklick-Event verarbeiten!

    Weiß jemand Rat?
    Gruß,
    Holger


  • Mod

    Welchen Stil hast Du denn dem Button gegeben, wenn Du ihn erzeugst?

    CS_DBLCLKS ist ein Class-Style! Kein Windows-Style!



  • Der Button wurde ganz normal als PUSHBUTTON auf einem Dialog platziert. Anschliessend habe ich ihm eine Member Variable vom Typ CMyButton zugeordnet mit der ich dann arbeite.

    im Ressource File steht also:

    PUSHBUTTON      "Beispielbutton",IDC_BT_BEISPIEL,368,31,25,25
    

    zusätzlich habe ich das Property BS_OWNERDRAWN gesetzt.

    Wenn ich dieses Property wieder auf FALSE setze werden keine Doppelklick Messages mehr geschickt. Also genau das Verhalten das ich haben möchte, leider muss ich das Design des Buttons aber selbst gestalten können.

    Im MSDN habe ich gelesen, wenn man den Class-Style CS_DBLCLKS in der überschriebenen Funktion:

    virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
    

    wegnimmt, wird der Komponente keine Doppelklick-Benachrichtigung mehr gesendet. Das blöde ist, daß die Funktion überhaupt nicht angesprungen wird.


  • Mod

    Grundsatzfrage: Was stört Dich an einer Doubbleclick meldung. Ignoriere sie doch einfach.

    1. Auch BS_OWNERDRAWN versendet IMHO Doubleclick nachrichten wenn auch BS_NOTIFY gesetzt wird.
    2. PreCreateWindow kann nicht ausgeführt werden, weil Dein Buton durch den Dialogmanager erzeugt wird und erst gesubclassed wird. PreSubclassWindow wäre also ein Ansatz.
    3. Ich wiederhole mich: CS_DBLCLKS ist ein Klassenstil und kein Windowsstil und kann somit nicht über die Fensterstile geändert werden. Weder in PreCreateWidnow noch in PreSubclassWindow. Wer das behauptet oder geschrieben hat, der hat keine Ahnung.



  • Wie schon erwähnt wird der Button unter WindowsCE eingesetzt. Mein Problem liegt darin ,daß schnell aufeinanderfolgende "single" Button-Clicks nicht möglich sind. Wenn ich den Button z.B. einsetze um die Selction einer ListBox zu steuern wird nicht jeder ButtonClick verarbeitet, da er ja durch WM_LBUTTONDBLCLK ersetzt wird.

    PreSubClassWindow hab ich auch verwendet, dort setze ich den Stil BS_OWNERDRAWN. Das Problem ist aber dass ich den KlassenStil dort nicht verändern kann, (viel. liegts an WinCE)

    Ich habe aber trotzdem eine Lösung gefunden. Ich überschreibe die DefWindowProc wie folgt:

    LRESULT MyButton::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
    {
       if(message == WM_LBUTTONDBLCLK)
       {
          message = WM_LBUTTONDOWN;
       }
    
       return CButton::DefWindowProc(message, wParam, lParam);
    
    }
    

    Ich mache einfach aus einem doppel- einen einfachen-Klick. wParam und lParam beinhalten die Mauskoo. und sind für beide Messages gleich.

    Ich vermute das Framework sendet WM_LBUTTONDBLCLK wenn der zweite Klick innerhalb der definierten "DoppelKlick-Zeit" erfolgt.

    Trotzdem Danke!

    Gruß,
    Holger


  • Mod

    1. Und warum behandelst Du Doppelklick und Singleklick dann nicht gleich?
    Einfach den selben Handler nehmen, das geht doch. Ich verstehe das Problem nicht, dass es unbedingt ein normaler Klick sein muss.
    2. Dieses Umbiegen einer Nachricht ist weder korrekt noch hat es dern gewünscten Effekt! Was passiert denn schon durch den Doppelklick?
    3. Könntest Du einfach den bestehenden Button zerstören und einen anderen Button nachträglich erzeugen, wenn es nicht möglich ist die Stile zu manipulieren (was bei einigen Windows-Stilen ein Problem ist).


Log in to reply