Eigenes Dragging



  • Also ... da meine Anwendungen ein ein wenig ausgefalleneres GUI haben, hab ich das komplette Zeichnen selbst übernommen ... bin es im Moment noch am umsetzen ... hab bisher eine Klasse Manager die von CWnd abgeleitet ist und die einen std::vector von Window-Elementen hat, die von keiner Klasse abgeleitet sind ... so diese haben wiederum eine eigenen std::vector Controls ... das ist ja noch rel. logisch ... nun will ich allerdings das, wenn man auf ein Window-Element klickt und die Linke-Maustaste gedrückt hält, das Element verschieben kann ... natürlich nur in einem von mir vorgegebenen Bereich ... das nennt man dragging. So ich überschreibe dafür die OnLBtnDown und OnLBtnUp des Managers und der Fragt dann jedes der elemente des std::vectors mit den Windows, ob die Mausposition innerhalb ist. Jetzt bin ich mir nur noch unschlüssig wie ich am einfachsten das Fenster mit der Maus "mitfahren" lassen kann ... jemand da ne Idee?

    TrackMouseEvent und SetCapture hatte ich angedacht ... aber beide nicht so das ware ...



  • Ich hab sowas mal so gelöst: bei Click auf das Element die Maus im Element zentrieren und dann entsprechend auf die Bewegung reagieren, du darfst nur nicht vergessen, nach jeder Bewegung die Maus wieder zu zentrieren sonst läufst du irgendwann aus dem Control.



  • Hmm ja ok ... vllt mach ich das einfach so, das ich mir die ID des Control speicher, das bei OnLBtnDown angeklcikt wurde und dann wenn OnMouseMove kommt guck ob die Maus immer noch darin ist ... ist es der Fall, wird das Fenster bewegt und sonnst halt einfach nicht ... und bei OnLBtnUp wird dann halt das draggen wieder abgebrochen ... muss ich mal sehen was sich da machen lässt ... und das man vllt mit rechter Maustaste wieder das Abbrechen kann nur das dabei dann die Ausgangsposition wieder eingenommen wird.

    Naja aber danke ... vllt noch jemand ne IDee?

    Mfg
    Deviloper
    Devil Entertainment



  • So habs umgesetzt ... zwar nicht so wie du meintest ... aber es funktioniert alles perfekt ... das einzige Problem, dass ich noch habe, ist, dass ich jetzt natürlich das Problem von wegen Flickern habe, da ich das Fenster direkt mit der Maus mitbewegen lasse ... jemand ne Idee wie ich das abstellen kann? Nutze GDI+ und hab auch ne MemBitmap usw drin ...



  • Der Trick ist beim Verschieben nur ein BitBlt zu machen. Wahrscheinlich machst du Moment 2 BitBlt operationen (eine zum Wiederherstellen des Hintergrunds und eine zum neu Zeichnen)?

    Habe mal ein Ctrl programmiert, dass verschiebbar sein sollte. Der Trick ist das UnionRect von alter und neuer Position als MemDc zu nehmen. Dann kannste in diesem MemDc erstmal den alten Hintergrund wiederherstellen, direkt danach den neuen Content reinblitten und ganz am Schluss den ganzen Kram auf den Screen malen. Dann flackert nix mehr. Allerdings war das nicht gerade wenig Aufwand, da du den alten Hintergrund in ner CBitmap speichern musst und je nach Verschieberichtung an ne andere Position blitten musst.

    Kann den Code leider nicht posten, da ich das für ne Firma gecodet habe, aber so gehts.



  • Hmm nicht ganz 😉 Ich arbeite mit GDI**+**, aber trotzdem danke für deinen Vorschlag ... ich erstell mir erst ne Gdiplus::Bitmap ... mach daraus einen Gdiplus::Graphic Pointer und mal da rein ... wenn ich fertig mit malen bin(und das ist erst, wenn alle Objekte meiner Klasse Window ihr draw-Methode abgearbeitet haben, wir diese Bitmap dann auf den eigentlichen Gdiplus::Graphic mit DrawImage gesetzt ... wobei für dieses Graphic Objekt dann der dc als Quelle dient ...


Anmelden zum Antworten