AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Problem mit Zeichnen im TImage
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Zeichnen im TImage

Ein Thema von Adrian112 · begonnen am 13. Nov 2007 · letzter Beitrag vom 13. Nov 2007
Antwort Antwort
Adrian112
(Gast)

n/a Beiträge
 
#1

Problem mit Zeichnen im TImage

  Alt 13. Nov 2007, 12:17
Hallo,

ich habe angefangen eine Art Paint-Clon zu proggen, hier meine Zeichenrotine:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
DoubleBuffered := True;
Form1.WindowState := wsMaximized;
Image1.Align := alClient;
with Image1.Canvas do
 begin
  pen.mode:=pmNotXor; // Zeichnenmodus umschalten auf pmNotXor (Für die Gummilinie)
  Image1.canvas.pen.style:=pssolid;
  Pen.Width:=5;
  Pen.Color:=clGreen; // Grüne Stiftfarbe
 end;
end;

procedure TForm1.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if zeichnen then
     with Image1.Canvas do
       begin
        moveto(x_anfang,y_anfang);

        if SpeedButton1.Down = true then
        begin lineto(x_ende,y_ende); end;

        If SpeedButton2.Down = true then
        begin rectangle(x_Anfang, y_anfang, x_ende, y_ende); end;

        if speedbutton3.Down = true then
        begin ellipse(x_Anfang, y_anfang, x_ende, y_ende); end;
       
       // neues Linienende
       x_ende:=x;
       y_ende:=y;
       // Neue Linie zeichnen
       moveto(x_anfang,y_anfang);
       
       if SpeedButton1.Down = True then
       begin lineto(x_ende,y_ende); end;

       If SpeedButton2.Down = True then
       begin rectangle(x_Anfang, y_anfang, x_ende, y_ende); end;

       if speedbutton3.Down = true then
       begin ellipse(x_Anfang, y_anfang, x_ende, y_ende); end;

       end;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 x_anfang:=x; y_anfang:=y;
  x_ende:=x; y_ende:=y;
  zeichnen:=true;

end;

procedure TForm1.Image1MouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 zeichnen:=false;
end;
So, das funktioniert bis jetzt ja gut (Wenn ich im leeren Image zeichne), nur leider wird die linie wenn ein Bild im Image geladen ist nicht grün sondern (durch den pmNotXor Modus) irgendwie durchsichtig. Siehe Bild 2. Wie kann ich so etwas umgehen? Ich habe schon versucht im pmCopy Modus zu zeichnen, doch das kann ja nicht klappen!

@ Edit: Falsches Bild ersetzt
Miniaturansicht angehängter Grafiken
1_690.jpg   2_665.jpg  
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#2

Re: Problem mit Zeichnen im TImage

  Alt 13. Nov 2007, 13:01
Kommentier mal die Zeile " pen.mode:=pmNotXor;" aus und schau, wies dann aussieht.
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: Problem mit Zeichnen im TImage

  Alt 13. Nov 2007, 13:08
Hallo Adrian112,

siehe Delphi Hilfe:
Zitat:
pmNotXor
Komplementärfarbe zu pmXor: Kombination von Farbanteilen, die entweder nur im Stift oder nur im Hintergrund der Zeichenfläche enthalten sind, aber nicht in beiden
Es passiert genau das, was du Programmiert hast. Die Frage bleibt: Was willst du tatsächlich haben?
Soll die Farbe immer grün sein? Was passiert dann bei Bildern die grün mit drinne haben oder gar ganz grün sind

Gruß, Chris
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
Adrian112
(Gast)

n/a Beiträge
 
#4

Re: Problem mit Zeichnen im TImage

  Alt 13. Nov 2007, 13:27
Ja, ich will einfach, das immer eine Linie in der von mir bestimmten Farbe gezeichnet wird, egal wie der Hintergrund / Vordergrund ist. Ich müsste vieleicht den Modus des Stiftes noch ändern können wenn die Linie Gezeichnet wird. Oder (probier ich grad mal aus) die Darstellung während des Zeichnens mit pmNotXor machen und dann vor den LineTo den Modus auf pmCopy setzen.
  Mit Zitat antworten Zitat
Benutzerbild von ChrisE
ChrisE

Registriert seit: 15. Feb 2006
Ort: Hechingen
504 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: Problem mit Zeichnen im TImage

  Alt 13. Nov 2007, 14:11
Hallo,

wenn ich Dein Problem richtig verstehe, dann liegt es daran, dass du ja beim Aufziehen des Rechecks das "alte" Rechteck löschen musst und das neue Zeichnen.

Folgender Vorschlag von mir:
1. OnMouseDown
Inhalt der aktuellen Darstellung in ein Bitmap zwischenspeichern per BitBlt o.ä.
2. OnMouseMove
a) Den Inhalt von der Darstellung wie sie in MouseDown war auf die Canvas zeichnen (z.B. per BitBlt )
b) Den durch die User-Interaktion hinzugekommenen Inhalt dazu oben drauf zeichnen
3. OnMouseUp
Temporäres Bitmap wieder löschen

Das funktioniert ganz gut und ermöglicht einem auch ganz andere Möglichkeiten einen Rahmen auf zu ziehen (Stichwort AlphaBlending). Aber das nur am Rande.

Gruß, Chris
Christian E.
Es gibt 10 Arten von Menschen, die die Binär lesen können und die die es nicht können

Delphi programming rules
  Mit Zitat antworten Zitat
matashen

Registriert seit: 29. Jan 2007
Ort: daheim
471 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#6

Re: Problem mit Zeichnen im TImage

  Alt 13. Nov 2007, 14:35
Due solltest alles erstmal ein wenig umstrukturieren.

1. erstelle für deine Zeichenoperationen eine eigene procedure um Zugriffe von verschiedenen Punkten des Programms aus machen zu können.

2. Lege die aktuelle einstellung des Zeichentools in eigenem Type ab. Erleichtert das erfassen und übergeben an andere Routinen.

Dann nimm nicht x_ende und X_Start für sowas gibts Point.

Definier dazu
Origin,MoveTo:TPoint; Nimm z.B. bei Mousdown
Delphi-Quellcode:
Origin.x:=x;
Origin.y:=y;
MoveTo:=Origin;
zeichnen:=true;
Zeichne(Origin,Origin,pmnotxor);
Zeichne mußt du definieren
procedure Zeichne(Start,Ziel:TPoint; z_style:penstyle); in mousemove
Delphi-Quellcode:
if zeichnen
then
Zeichne(Origin,MoveTo,pmnotxor);
MoveTo.x:=x
moveTo.y:=y;
Zeichne(Origin,MoveTo,pmnotxor);
und bei mouseup
Delphi-Quellcode:
if zeichnen then
Zeichne(Origin,MoveTo,pmcopy);
so in etwa wirds dann auch einfacher weitere sachen zu integrieren

Gruß Matthias
Matthias
Das Leben ist eines der härtesten.
  Mit Zitat antworten Zitat
Progman

Registriert seit: 31. Aug 2007
Ort: 99974 MHL
695 Beiträge
 
Delphi 10.1 Berlin Starter
 
#7

Re: Problem mit Zeichnen im TImage

  Alt 13. Nov 2007, 15:18
Hi nochmal.
Mal ein kleiner Hinweis:
Delphi-Quellcode:
   if SpeedButton1.Down = True then //macht man nicht!
    begin lineto(x_ende,y_ende); end;
Besser ist:
Delphi-Quellcode:
  if SpeedButton1.Down then lineto(x_ende,y_ende);
  else
  if SpeedButton2.Down then ...
Und als weiteren Vorschlag, so hab ich das mal gemacht:
Über das Image mit dem Bild ein zweites legen, das weiß ist und weiß ist auch die Transparenzfarbe des Images.
Transparent muss natürlich auf True. Dann kann man da drauf rummalen
Die alten Linien mit weiß übermalen, die neue in der gewünschten Farbe... so als Denkanstoß
Karl-Heinz
Populanten von Domizilen mit fragiler, transparenter Aussenstruktur sollten sich von der Translation von gegen Deformierung resistenter Materie distanzieren!
(Wer im Glashaus sitzt sollte nicht mit Steinen werfen)
  Mit Zitat antworten Zitat
Adrian112
(Gast)

n/a Beiträge
 
#8

Re: Problem mit Zeichnen im TImage

  Alt 13. Nov 2007, 16:06
Danke für die guten Tipps (Ja, bei mir haperts noch weng mit der Codestrukturierung) und ich denke so werde ich das auch hinbekommen.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz