![]() |
invertierend zeichnen
hi
ich will ein gezeichnetes rechteck auf meiner canvas verschieben. das will ich realisieren, indem ich das rechteck erst an den alten koordinaten lösche (indem ich es erneut invertiert zeichne) und danach an den neuen korrdinaten zeichne. das funzt aber irgendwie ned.. ich bin ziemlicher delphi anfänger und hab keinen ahnung woran das liegt :[ hiermal der relevante code
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin [...] canvas.pen.mode := pmNOTXOR; canvas.brush.Style := bsSolid; canvas.Pen.Color := clblack; canvas.pen.width := 2; end; procedure tTeil.zeichnen; begin Form1.Image.Canvas.Rectangle(x-20, y-20, x+20, y+20); if aktiv = true then Form1.Image.Canvas.Rectangle(x-18, y-18, x+18, y+18); end; procedure TForm1.ImageMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); var aktTeil, altTeil: tTeil; begin .. [liest aus liste das in frage kommende Teil aus.. funzt 100%] .. if (cModus = 'verschieben') then begin altTeil.zeichnen; AktTeil.zeichnen; end; .. hoffe ihr seht meinen fehler :] greez |
Re: invertierend zeichnen
welcome to us, guddi,
also, ich weiss net was das notxor macht, aber wenn du einfach das dreieck mit der farbe des canvas, bzw. des hintergrundes zeichnest, dürfte des doch auch funzen, oder? pfiad di, heiopei |
Re: invertierend zeichnen
Hallo goddi,
herzlich willkommen bei der Delphi-PRAXiS! Wenn ich Deinen Code richtig interpretiere, liegt das Problem daran, dass Du die Eigenschaften von Pen und Brush in der Methode FormCreate für die Zeichenfläche des Formulars, nicht aber für die des Bildes, auf dem Du später in zeichnen arbeitest, setzt. Der Aufruf
Delphi-Quellcode:
ist gleichbeteutend mit
procedure TForm1.FormCreate(Sender: TObject);
begin Canvas.Pen.Mode := pmNotXor;
Delphi-Quellcode:
und sollte stattdessen
procedure TForm1.FormCreate(Sender: TObject);
begin Self.Canvas.Pen.Mode := pmNotXor;
Delphi-Quellcode:
lautet?
procedure TForm1.FormCreate(Sender: TObject);
begin Image.Canvas.Pen.Mode := pmNotXor; Folgender Test funktioniert bei mir wie von Dir (annähernd) beschrieben:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin with Image1.Canvas do begin Pen.Mode:= pmNotXor; Pen.Color:= clBlack; Pen.Width:= 2; MoveTo(10, 10); LineTo(100, 100); end; end; |
Re: invertierend zeichnen
nette begrüssung und danke choose, jetzt funzt es :)
|
Re: invertierend zeichnen
grmpf jetzt hab ich doch noch ein problem:
mittels
Delphi-Quellcode:
platziere ich in dem viereck den string ">=1".
Form1.Image.Canvas.Textout(x-10,y-5,'>=1');
Ich kann das gesamte Objekt auf meiner Canvas langsam problemlos verschieben, verschiebe ich es jedoch etwas schneller oder lösche es, bleibt ">=1" stehen. ich könnt natürlich einfach nochmal weiss drübermalen, aber das ist vielleicht nicht unbedingt die eleganteste Lösung.. weiss jemand rat? |
Re: invertierend zeichnen
Wenn ich das richtig in Erinnerung habe, verwendet die Implementierung von TCanvas.TextOut nicht die Eigenschaften von TCanvas.Pen, so dass die Schrift in Farbe der von TCanvas.Font.Color übernommen wird und immer opaque, also ohne einen Bit-Filter (zB xor), gezeichnet wird. Der hintergrund hingegen wird von TCanvas.Brush übernommen.
Aus diesem Grund solltes Du die "doppelt zeichnen löscht wieder"-Strategie für die so erstellten Texte nicht verwenden können. Alternativen wären zB ein Sichern des Bereiches (Ermitteln über TextExtend) und anschließendes zurückkopieren, bzw das zeichenen des Textes in eine Hilfsgrafik, die anschließend unter Verwendung eines Bit-Filters auf das tatsächliche Bild geblittet wird (TCanvas.CopyMode)... BTW: Versuche bitte in Zukunft für jede neue Frage einen neuen Thread mit aussagekräftigem Titel und einer vollständigen Problembeschreibung zu erstellen. Das macht späteres Wiederfinden bei Recherchen deutlich einfacher. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:10 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-2025 by Thomas Breitkreuz