![]() |
Probleme mit XOR-Zeichenmodus
Hallo,
vorab: Wenn ich richtig informiert bin, kann ich, wenn ich den XOR-Zeichenmodus verwende, auf ein ständiges Löschen (z.B. eines Objekts durch Einfärben mit der Hintergrundfarbe) verzichten. Auf dieser Basis möchte ich nun einen Kreis über ein Formular wandern lassen, aber es klappt nicht so richtig. Hier mal ein wenig Code:
Delphi-Quellcode:
Die Variablen x und Radius werden global deklariert und gleich initialisiert.
procedure TForm1.DrawCircle;
begin Canvas.Ellipse(x-Radius, 100-Radius, x+Radius, 100+Radius); Inc(x, 10) end; procedure TForm1.FormCreate(Sender: TObject); begin Canvas.Brush.Style := bsClear; Canvas.Pen.Mode := pmXOR; Canvas.Pen.Color := clBlack or clBtnFace end; procedure TForm1.TimerTimer(Sender: TObject); begin DrawCircle end; Ich weiß nicht, woran es liegt und ob es so überhaupt funktioniert, aber ich brauche eine Alternative zu dem konventionellen Löschen, welches ich oben erklärt habe. mfg. |
AW: Probleme mit XOR-Zeichenmodus
Du musst bei XOR immer alles doppelt zeichnen, einmal um die alte Zeichnung aufzuheben, und das zweite mal um die neue Zeichnung zu zeichnen. Wirklich etwas sparen tust du dir dadurch also nicht, eher handelst dir Ärger ein...
|
AW: Probleme mit XOR-Zeichenmodus
Dem stimme ich zu.
Nützlich ist so etwas für zB. Floating Rectangles, so ein Auswahlrechteckdingens. ( zB. in ![]() |
AW: Probleme mit XOR-Zeichenmodus
Das man sich damit oft Ärger einhandelt, habe ich schon gemerkt... :)
Gibt es aber generell einen Zeichenmodus, bei welchem ich eine "alte" Grafik nicht wieder mit der Hintergrundfarbe einfärben muss? Angenommen, ich habe einen Verlauf auf einem TImage gezeichnet und möchte dann nur einen Kreis "rauslöschen" (ich habe mir TheMandelBrot mal angeschaut, aber da kommt das nicht zum Tragen, wenn ich das richtig beurteile). |
AW: Probleme mit XOR-Zeichenmodus
Der Gold-Standard ist es, den Hintergrund als separates Bitmap vorzuhalten, diesen immer wieder neu auf die Anzeige zu kleistern, und darauf dann die beweglichen Teile immer wieder neu zu zeichnen. Alles andere ist Rumgehampel, dass bestenfalls zu Fehleranfälligkeit führt.
Bei eher großen/komplexen Dingen kann es sich ggf. lohnen die von den dynamischen Teilen überdeckten Bereiche zu speichern (als Rect), und nur diese mit dem Hintergrund zu übernageln, wie es Windows z.B. selbst auch macht (InvalidateRect() und Co.), wobei das auch schnell in viel Aufwand für wenig Nutzen ausarten kann. Bitmaps hin- und herblitten gehört mit zu den einfacheren Aufgaben für einen PC. |
AW: Probleme mit XOR-Zeichenmodus
Zitat:
|
AW: Probleme mit XOR-Zeichenmodus
Zitat:
Ich habe Dein Programm quick and dirty hingefummelt, damit Du das Prinzip siehst.
Delphi-Quellcode:
Gruß
procedure TForm1.SetXOR;
begin Canvas.Brush.Style := bsClear; Canvas.Pen.Mode := pmXOR; Canvas.Pen.Style := psSolid; Canvas.Pen.Color := clBlack or clBtnFace; end; procedure TForm1.DrawCircle; begin SetXOR; Canvas.Ellipse(x-Radius, 100-Radius, x+Radius, 100+Radius); x := (X+2) mod 200; Canvas.Ellipse(x-Radius, 100-Radius, x+Radius, 100+Radius); end; procedure TForm1.tmr1Timer(Sender: TObject); begin DrawCircle; end; procedure TForm1.btn1Click(Sender: TObject); begin x := 15; Radius := 10; SetXOR; Canvas.Ellipse(x-Radius, 100-Radius, x+Radius, 100+Radius); tmr1.Enabled := True; end; Erich |
AW: Probleme mit XOR-Zeichenmodus
Vielen Dank für Deine Antwort, LargoD! So etwas hilft mir wirklich weiter. Soweit, wie ich das jetzt sehe, kann ich das auch auf andere Probleme/Aufgabenstellungen beziehen!
Danke |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz