Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Probleme mit XOR-Zeichenmodus (https://www.delphipraxis.net/153772-probleme-mit-xor-zeichenmodus.html)

Mysterio08 15. Aug 2010 16:11

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:
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;
Die Variablen x und Radius werden global deklariert und gleich initialisiert.
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.

Namenloser 15. Aug 2010 16:39

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...

turboPASCAL 15. Aug 2010 17:15

AW: Probleme mit XOR-Zeichenmodus
 
Dem stimme ich zu.

Nützlich ist so etwas für zB. Floating Rectangles, so ein Auswahlrechteckdingens. ( zB. in Mandelbrötchen )

Mysterio08 15. Aug 2010 17:29

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).

Medium 15. Aug 2010 17:44

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.

Namenloser 15. Aug 2010 18:44

AW: Probleme mit XOR-Zeichenmodus
 
Zitat:

Zitat von Mysterio08 (Beitrag 1042364)
Gibt es aber generell einen Zeichenmodus, bei welchem ich eine "alte" Grafik nicht wieder mit der Hintergrundfarbe einfärben muss?

Nein, natürlich nicht. Wie sollte das funktionieren? Eine einmal überschriebene Information ist eben für immer weg. Du musst schon selbst dafür sorgen, dass irgendwo eine Kopie zwischengespeichert wird.

LargoD 15. Aug 2010 21:22

AW: Probleme mit XOR-Zeichenmodus
 
Zitat:

Zitat von Mysterio08 (Beitrag 1042364)
Gibt es aber generell einen Zeichenmodus, bei welchem ich eine "alte" Grafik nicht wieder mit der Hintergrundfarbe einfärben muss?

Alles was Du im XOR-Mode gezeichnet hast, kannst Du auch im XOR-Mode wieder löschen, indem Du es noch mal zeichnest.
Ich habe Dein Programm quick and dirty hingefummelt, damit Du das Prinzip siehst.

Delphi-Quellcode:
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;
Gruß
Erich

Mysterio08 16. Aug 2010 06:48

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