Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi invertierend zeichnen (https://www.delphipraxis.net/14330-invertierend-zeichnen.html)

goddi 7. Jan 2004 08:05


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

heiopei 7. Jan 2004 08:39

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

choose 7. Jan 2004 08:43

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:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Canvas.Pen.Mode := pmNotXor;
ist gleichbeteutend mit
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Self.Canvas.Pen.Mode := pmNotXor;
und sollte stattdessen
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  Image.Canvas.Pen.Mode := pmNotXor;
lautet?

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;

goddi 7. Jan 2004 08:47

Re: invertierend zeichnen
 
nette begrüssung und danke choose, jetzt funzt es :)

goddi 7. Jan 2004 15:16

Re: invertierend zeichnen
 
grmpf jetzt hab ich doch noch ein problem:

mittels
Delphi-Quellcode:
Form1.Image.Canvas.Textout(x-10,y-5,'>=1');
platziere ich in dem viereck den string ">=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?

choose 7. Jan 2004 15:45

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