Linien mit Maus verschieben



  • Hallo,

    ich will in einem Programm folgendes einbauen:

    Eine Linie, die sich vom User mit der Maus verschieben lässt (dabei soll die linke Maustaste gedrückt werden).
    Beispielweise lassen sich bei Photoshop Hilfslinien hin- und herziehen ohne das dabei der gesamte DC aktualisiert wird. Natürlich wäre es gut, wenn man auch ein Stück neben die Linie klicken kann um diese zu erfassen.

    Muss ich ein Rechteck erzeugen das etwas breiter ist als die Linie, welches ich dann mit PtInRect erfassen kann? Und dann mit InvalidateRect neuzeichnen?

    Hat jemand die ultimative Lösung ?

    Danke,
    LabRat



  • Naja, als erstes solltest du dich mal mit Drag&Drop beschäftigen [OnMouseMove(), OnLButtonDown() & OnLButtonUp()]

    Photoshop arbeitet ja mit einzelnen Ebenen, So in der Art müsstest du das auch machen, weil du sonst keine Chance mehr hast eine Linie auf dem DC zu erfassen.

    Gruß
    :: NoName ::



  • Die oben genannten Funktionen für Drag&Drop hatte ich schon mal implementiert.

    Da war das Problem, wenn ich die Linie verschoben habe, also die OnMouseMove-Methode aufgerufen wurde, wurde an jeder neuen Position des Cursors eine weitere Linie gezeichnet. Die Linie zuvor wurde nicht gelöscht.

    Dies zu vermeiden war mir nur über einen Aufruf von Invalidate() (also Neuzeichnung des _gesamten_ Gerätekontextes) in der MouseMove-Meth. möglich.
    Das hatte, wie erwähnt, ein hässliches Bildschirmflackern zur Folge.

    Hat jemand vielleicht ein Code-Sample für mich (Pseudo-Code geht auch)?



  • Im Buch VC++ 6 in 21 Tagen ist dies erklärt.

    Weiters muss du nicht alles neu zeichen. Lediglich die geänderten Bereiche.

    Da Bildschrimflackern kann man umgehen. Einfach mal hier im Forum suchen.
    Grafik ist etwas komlexer als Bunti-Klicki-Dialog.
    Deshalb musst du dich auch mehr anstengen und mal die Suchfunktion ausnutzen.

    Man kann es zwar mit wenige Codezeilen zeigen aber verstehen würdest du es auch nicht.



  • Wo ist das Problem? Wenn Du vor dem Bewegen der Linie nur den Bereich der Linie in die Update-Region tust (mit InvalidateRect(), als RECT den Bereich der Linie angeben), wird auch nicht das Fenster komplett neu gezeichnet (vorausgesetzt, der WM_PAINT Handler fraegt seine Update-Region ordentlich ab und aktualisiert nur die Bereiche, die da rein passen).

    Noch einfacher ist es, ein eigenes Control zu definieren (ueber RegisterClassEx(), eine entsprechende Fensterprozedur und CreateWindowEx()), das in WM_PAINT nix anderes macht als eine Linie zu zeichnen (kannste Dir sogar sparen wenn Du in WNDCLASSEX die Farbe der Linie als Hintergrundfarbe angibst). Dann brauchst Du nur noch MoveWindow() aufzurufen, um die Linie zu verschieben. Der Rest geht dann von alleine.


Anmelden zum Antworten