Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Durchgehend zeichnen mit canvas (https://www.delphipraxis.net/24642-durchgehend-zeichnen-mit-canvas.html)

Dragon27 23. Jun 2004 20:14


Durchgehend zeichnen mit canvas
 
Hallo,

bin grad dabei ein Zeichenprogramm zur Übung zu schreiben. Habe da aber ein Problem mit den ganz normalen Zeichenen.

Delphi-Quellcode:

zeichenbrett.Canvas.Pixels[x,y]:=JvGammaPanel1.ForegroundColor;
Wenn ich diesen Code hernehme dann zeichnet der nicht durchgehende Linien sondern es wird pixelig (Steht ja scho im Quelltext :lol: ) und bei "Line To" geht das auch net.

Kann mir da bitte jemand helfen?

Danke

supermuckl 23. Jun 2004 20:17

Re: Durchgehend zeichnen mit canvas
 
und wie sieht der code aus für lineto ?

die frage versteh ich net ganz.. wo wird es da pixelig ?

nailor 23. Jun 2004 20:20

Re: Durchgehend zeichnen mit canvas
 
ich glaube, er meint, dass es nichts in der richtung antialiasing gibt.

Mirilin 23. Jun 2004 20:32

Re: Durchgehend zeichnen mit canvas
 
:hi:


Im MouseDown/Up eine Boolean Variable entsprechend setzen. Dann im MouseMove, falls die Boolean Variable entsprechend gesetzt ist, mit LineTo die Linie vom alten Punkt zum neuen X,Y zeichen und das X,Y dann als alten Punkt hinterlegen.

mfg Tobias

Dragon27 23. Jun 2004 20:35

Re: Durchgehend zeichnen mit canvas
 
Hallo,

Also schaut der Text jetzt aus. aber der macht bei schnellem Zeichnen hald einfach nicht eine solche Linie

__________________________________________________ __________

sondern:

.................................................. ..........

Also sie is einfach gepunktet wenn man zu schnell zeichntet.

Hier noch der code:


Delphi-Quellcode:

if zeichnet=true
then begin
 zeichenbrett.Canvas.Font.Color:=JvGammaPanel1.ForegroundColor;
if toolbutton1.Down
then begin
zeichenbrett.Canvas.Pixels[x,y]:=JvGammaPanel1.ForegroundColor;
end;
Wie würdet Ihr denn so ne zeichenroutine machen?

Zeichnet stellt sich bei mousedown auf true....


Danke

Andy

supermuckl 23. Jun 2004 20:38

Re: Durchgehend zeichnen mit canvas
 
das problem was du da hast ist wohl:

die maus, wenn du sie schnell bewegst, springt dann von pixel zu pixel und überfliegt viele.. je schneller desto mehr

das ist wohl der effekt den du da hast.. du kannst aber durch eine verbundlinie ( spline ) trotzdem vvon punkt zu punkt eine linie ziehen.. so wie es mirilin vorgemacht hat etwa

Skiron 23. Jun 2004 20:39

Re: Durchgehend zeichnen mit canvas
 
da dürfts doch einen Pen-Style geben (wenn mich nicht alles täuscht)

Nicodius 23. Jun 2004 20:39

Re: Durchgehend zeichnen mit canvas
 
Delphi-Quellcode:
procedure TForm1.StiftDraw(x, y: Integer);
begin
  with Form1 do begin
    if not FC then begin
      Paintbox1.Canvas.Pen.Color := Farbe;
      PaintBox1.Canvas.MoveTo(MOldPo.X, MOldPo.Y);
      PaintBox1.Canvas.LineTo(Xold, Yold);
    end
    else
      FC := False;
    Paintbox1.Canvas.Pen.Color := Farbe;
    PaintBox1.Canvas.MoveTo(XOld, YOld);
    PaintBox1.Canvas.LineTo(X, Y);
    XOld:=X; YOld:=Y;
  end;
end;

bitte schön ;)

supermuckl 23. Jun 2004 20:41

Re: Durchgehend zeichnen mit canvas
 
jo genau so :)

Dragon27 23. Jun 2004 20:45

Re: Durchgehend zeichnen mit canvas
 
hi,

das von Mirilin versteh ich irgendwie nicht so. Hab ich ja auch so gemacht.......
Aber irgendwie funzt das nicht da immer die linien nicht genau werden.

gibts da sonst noch was?

Danke

Dragon27 23. Jun 2004 20:46

Re: Durchgehend zeichnen mit canvas
 
Oh da war ja wohl mein posting voreilig, sorry!!!

Danke für den code!!!

Mirilin 23. Jun 2004 20:48

Re: Durchgehend zeichnen mit canvas
 
:hi:


Delphi-Quellcode:
{MD steht für MouseDown : Boolean, und OldP wäre TPoint}
procedure TMainForm.PaintBoxMouseMove(Sender: TObject; Shift: TShiftState;
  X, Y: Integer);
begin
  if not MD then Exit;
 // Bit.Canvas.MoveTo(OldP.X,OldP.Y);
  Bit.Canvas.LineTo(X,Y);
 // OldP := Point(X,Y);
  PaintBoxPaint(Self);
end;

procedure TMainForm.PaintBoxMouseDown(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  MD := True;
  //OldP := Point(X,Y);
  Bit.Canvas.MoveTo(X,Y)
end;

procedure TMainForm.PaintBoxMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  MD := False;
end;
Ich habs kurz so gemacht.


@Nicodius, erklär mir bitte kurz das "with Form1" ...

mfg Tobias

supermuckl 23. Jun 2004 20:50

Re: Durchgehend zeichnen mit canvas
 
with form1 do begin
height := 10;
end;

ist das selbe wie

form1.height := 10;

Mirilin 23. Jun 2004 20:52

Re: Durchgehend zeichnen mit canvas
 
:hi:

:wink: ja, das weiss ich :roll:

ich find den Aufruf nur irgendwie überflüssig.


mfg Tobias

Skiron 23. Jun 2004 20:53

Re: Durchgehend zeichnen mit canvas
 
Bringt ja irgend wie nichts!
Ist eigentlich nur ein Nachteil!
Das wirst du sehen, wenn du dann dein Formular umbenennst!

supermuckl 23. Jun 2004 20:54

Re: Durchgehend zeichnen mit canvas
 
Zitat:

Das wirst du sehen, wenn du dann dein Formular umbenennst!
naja aber doch gerade dann hast es ja leichter.. must nur einen namen ändern und nicht in jeder zeile form1.bla ändern

Nicodius 23. Jun 2004 20:59

Re: Durchgehend zeichnen mit canvas
 
das war nur weil ichs kopiert habe bei mir stehen ja noch andere sachen (paintbox :roll: )


aber der code funktioniert zu 100%

Skiron 23. Jun 2004 21:23

Re: Durchgehend zeichnen mit canvas
 
Zitat:

Zitat von supermuckl
Zitat:

Das wirst du sehen, wenn du dann dein Formular umbenennst!
naja aber doch gerade dann hast es ja leichter.. must nur einen namen ändern und nicht in jeder zeile form1.bla ändern

am einfachsten hättest du es, wenn dus total weg lassen würdest, also statt

Delphi-Quellcode:
procedure TForm1.StiftDraw(x, y: Integer);
begin
  with Form1 do begin
    if not FC then begin
      Paintbox1.Canvas.Pen.Color := Farbe;
      PaintBox1.Canvas.MoveTo(MOldPo.X, MOldPo.Y);
      PaintBox1.Canvas.LineTo(Xold, Yold);
    end
    else
      FC := False;
    ...
  end;
end;
einfach

Delphi-Quellcode:
procedure TForm1.StiftDraw(x, y: Integer);
begin
  if not FC then begin
    Paintbox1.Canvas.Pen.Color := Farbe;
    PaintBox1.Canvas.MoveTo(MOldPo.X, MOldPo.Y);
    PaintBox1.Canvas.LineTo(Xold, Yold);
  end
  else
    FC := False;
  ...
end;
am besten wärs so:
Delphi-Quellcode:
procedure TForm1.StiftDraw(x, y: Integer);
begin
  with Paintbox1.Canvas do begin
    if not FC then begin
      Pen.Color := Farbe;
      MoveTo(MOldPo.X, MOldPo.Y);
      LineTo(Xold, Yold);
    end
    else
      FC := False;
    ...
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:51 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