Bei Mausbewegung Linie (Fadenkreuz) zeichnen
-
Hallo,
wie kann ich bei einer Mausbewegung eine Linie (Fadenkreuz) zeichnen? Ich habe schon mehrere Möglichkeiten ausprobiert aber alle "flackern".
Ich setzte in OnMouseMove eine Variable auf true, speichere die MausPos in einer Member und rufe anschließend Invalidate auf. In meiner OnDraw zeichnen ich dann das Fadenkreuz. Gibt es eine Möglichkeit ohne Flackern (ausser den Bereich zu speichern...?)
-
Wie rufst du Invalidate auf? Invalidate(FALSE) würde ich dir raten.
Ansonsten versuch mal die Doublebuffer/Backbuffer-Technik. Solltest mit der Suche fündig werden. Das habe ich da auch irgendwo beschrieben.
Falls du nicht fündig wirst, dann melde dich nochmal.
MfG,
Paul.
-
logischer Zeichenmodus NOTXOR, beim zweiten mal drüberzeichen erscheint immer wieder das, was vorher da war
-
Wenn Du InvalidateRect aufrufst, so wird immer das Erease-Background ausgelöst, wass dann dies Flackern auslöst... wie Paul_C. gesagt hat musst Du dies verhindern.
Desweiteren ist noch zu Empfehlen einen MemoryDC zum Double-Puffern zu verwenden...
-
nix mit Puffern, nix mit Invalidate!!! Nimm den logischen Zeichenmodus. So wird das selbst in CAD-Programmen gemacht. Dazu gibts sogar ein ausführliches Beispiel in der MSDN.
Das ist recht einfach und schnell. Da flackert auch nix.
-
Ja, ich geb Dir recht. Wenn Du was direkt mit der Maus zeichnen willst, dann solltest Du dies auch direkt tun... Problematisch wird es natürlich nur wenn Du Linien "ziehen" willst. Dann musst Du eben etwas mehr Gehirnschmalz reinstecken, aber das geht auch.
-
Wozu gibts Klassen^^
Hab erst vor kurzem nen Bildeditor machen müssen ähnlich wie Paint. Dort gibts auch für jedes Objekt diese "Gummibandvorschau". Am besten für jeden Typ eine Klasse, diese erben von einer gemeinsamen Basisklasse und die lässt man dann die Zeichenarbeit machen. Is übersichtlich, lässt sich gut erweitern usw. ... halt OOP
-
OOP ist was für weicheier
-
@Palleon: kannst du bitte den MSDN - Link geben? Finde da nichts, wußte aber nicht, dass das so auch gehen kann. Würde mich aber interessieren.
-
*hum* habs in der Offline-MSDN gelesen, frag mich jetzt aber nicht mehr wie der Titel hieß^^ Hilf das?
int mode = pDC->GetROP2(); pDC->SetROP2(R2_NOTXORPEN); pDC->MoveTo(firstPoint); pDC->LineTo(secondPoint); pDC->SetROP2(mode);
first- und secondPoint sind CPoints hier. Damit zeichnest du im logischen Modus. Beim zweiten mal zeichen hast du wieder den alten Inhalt der betroffenen Pixel.
HAHA ich bin gut^^ hab was gefunden
http://support.microsoft.com/kb/q135865/
-
Danke, werde es mir anschauen.
-
habs aufprobiert,
bei mir wird dabei jedoch der Hintergrund (bestehende Zeichnung) gelöscht !
Mach ich da was falsch?
-
AnTri schrieb:
habs aufprobiert,
bei mir wird dabei jedoch der Hintergrund (bestehende Zeichnung) gelöscht !
Mach ich da was falsch?joar machst du wohl^^
Beim zweiten mal Zeichnen musst du auch dieselben Koordinaten haben, wie mein ersten mal. Zeig doch mal deinen Code.
-
Danke,
ich hab ausversehen beim 2. mal die Koordinaten verwechselt. Funktioniert jetzt einfach OPTIMAL.
Vielen Dank für Eure Hilfe!
Kann mir noch jemand erklären wie das eigentlich geht, merkt sich der Context den Pixel der vor dem Zeichen da war?
-
Der merkt sich die alten Pixel nicht, das klappt nur durch geeignete Bit-Operationen:
Zeichnen:
Pnz=Paz XOR Pl
(Pnz-Pixel nach Zeichnen, Paz-Pixel vor Zeichnen, Pl-Pixel der Linie)
Löschen:
Pnc=Pac XOR Pl
(Pnc-Pixel nach Löschen (clear),...)
-> insgesamt:
Pnc=Pac XOR Pl =Pnz XOR Pl =Paz XOR Pl XOR Pl =Paz
-
Genau, das ist der Witz an der Sache, das nichts gespeichert wird. Dadurch flackert auch nichts.
Das is halt einfach eine mathematische Operation, die beim 2. Anwenden den Ausgangszustand wieder herstellt.
-
suuuuuper ....
Danke!