Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Zeichenprogramm erstellen: wie die Linien zeichnen? (https://www.delphipraxis.net/36860-zeichenprogramm-erstellen-wie-die-linien-zeichnen.html)

malo 27. Dez 2004 11:47


Zeichenprogramm erstellen: wie die Linien zeichnen?
 
Ich hab mir mal überlegt, einen kleinen Paint-Klon zu schreiben... Nunja, ich bin noch ziemlich am Anfang :roll:

Und zwar hab ich Probleme damit, Linien zu zeichnen. Ich hab mir überlegt, eine globale boolsche variable zu erstellen. Im OnMouseDown wird sie auf True gesetzt, im OnMouseUp auf False. Dann im OnMouseMove folgende Abfrage:

Delphi-Quellcode:
var
  pt: Tpoint;
begin
  if Zeichnen = true then
    begin
      pt := Mouse.CursorPos;
      Canvas.Pixels [pt.X-196, pt.y-145] := clBlack;
    end;
end;
Nur ist mir das zu langsam. Wenn ich die Maus langsam bewege, wird ordentlich gezeichnet, bei schnelleren Bewegungen sieht man jedoch nur einzelne Punkte... Kennt jemand eine andere Möglichkeit dafür oder kann mir einen Tipp geben, um das ganze zu beschleunigen?

mirage228 27. Dez 2004 11:51

Re: Zeichenprogramm erstellen: wie die Linien zeichnen?
 
Hi,

Du kannst einfach Canvas.LineTo() und Canvas.MoveTo() benutzen.

MoveTo() bewegt die Position unsichtbar (also das beim ersten Klicken machen) und LineTo() zeichnet dann den Strich.

mfG
mirage228

malo 27. Dez 2004 11:59

Re: Zeichenprogramm erstellen: wie die Linien zeichnen?
 
Mit LineTo() hatte ich es auch schon versucht, mich hat da nur gestört, dass der immer unnötige Linien gemacht hat...

Aber auch mit MoveTo geht das nicht wirklich...

Delphi-Quellcode:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var pt: TPoint;
begin
  Zeichnen := true;
  Canvas.MoveTo (pt.X-196, pt.y-145);
end;

procedure TForm1.FormMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Zeichnen := false;
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  pt: Tpoint;
begin
  if Zeichnen = true then
    begin
      pt := Mouse.CursorPos;
      Canvas.LineTo (pt.X-196, pt.y-145);
    end;

end;
Wenn ich dann klicke und Maustaste gedrückt halte, passiert noch nichts. Wenn ich dann aber die Maus bewege, zeichnet mein Prog mir immer erst eine senktrechte Linie von unten bis zur Maus... :(

Luckie 27. Dez 2004 12:14

Re: Zeichenprogramm erstellen: wie die Linien zeichnen?
 
Zeichne nicht im MouseMove, sondern merk dir den Punmkt im OnMouseDown und im OnMouseUp und im OnMouseUp zeichnest du dann auch.

malo 27. Dez 2004 12:24

Re: Zeichenprogramm erstellen: wie die Linien zeichnen?
 
Zitat:

Zitat von Luckie
Zeichne nicht im MouseMove, sondern merk dir den Punmkt im OnMouseDown und im OnMouseUp und im OnMouseUp zeichnest du dann auch.

Verbessere mich, wenn ich's falsch verstanden hab, aber das würde doch dann nur eine Linie zeichnen von dem Punkt an, wo ich klicke bis zu dem Punkt, wo ich die Maus loslasse, oder nicht? :gruebel:

Wuaegner 27. Dez 2004 12:25

Re: Zeichenprogramm erstellen: wie die Linien zeichnen?
 
Richtig,
da deine Frage war:
Zitat:

Linien zu zeichnen

malo 27. Dez 2004 12:28

Re: Zeichenprogramm erstellen: wie die Linien zeichnen?
 
Zitat:

Zitat von Wuaegner
Richtig,
da deine Frage war:
Zitat:

Linien zu zeichnen

:wall:

Gut, da hab ich mich doch wohl etwas fehlerhaft ausgedrückt... ich will ein "freies Zeichnen" erlauben. Das heißt, klicken, Maustaste gedrückt halten, Maus bewegen und damit was Zeichnen, Maustaste loslassen. Ich hoffe, man hat mich jetzt richtig verstanden ;)

Steve 27. Dez 2004 12:42

Re: Zeichenprogramm erstellen: wie die Linien zeichnen?
 
Hi,

gib Deinem Form ne Boolsche Variable z.B. MouseIsDown, setz diese im OnMouseDown auf True, im OnMouseUp auf False. Im OnMouseDown gehst Du mit Delphi-Referenz durchsuchenTCanvas.MoveTo noch auf den "Startpunkt", im OnMouseMove wird mit Delphi-Referenz durchsuchenTCanvas.LineTo ne Linie gezeichnet, falls MouseIsDown=true ist. :zwinker:

Gruß
Stephan :dance:

malo 27. Dez 2004 13:58

Re: Zeichenprogramm erstellen: wie die Linien zeichnen?
 
Zitat:

Zitat von Steve
Hi,

gib Deinem Form ne Boolsche Variable z.B. MouseIsDown, setz diese im OnMouseDown auf True, im OnMouseUp auf False. Im OnMouseDown gehst Du mit Delphi-Referenz durchsuchenTCanvas.MoveTo noch auf den "Startpunkt", im OnMouseMove wird mit Delphi-Referenz durchsuchenTCanvas.LineTo ne Linie gezeichnet, falls MouseIsDown=true ist. :zwinker:

Gruß
Stephan :dance:

Genau das HAB ich doch schon gemacht. Ein paar Posts weiter oben ist mein QuellCode dazu. Und da steht auch mein Problem. Und zwar immer, wenn ich anfange zu zeichnen, zeichnet Canvas mir eine senkrechte Linie nach oben bis zu meinem Cursor. Und ich weiß nicht, warum oder gar, wie ich es verhindern kann.

dizzy 27. Dez 2004 14:39

Re: Zeichenprogramm erstellen: wie die Linien zeichnen?
 
Zitat:

Zitat von malo
Delphi-Quellcode:
procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
var pt: TPoint;
begin
  Zeichnen := true;
  Canvas.MoveTo (pt.X-196, pt.y-145);
end;

pt wird nicht initialisiert! Drüber hinaus ist sie überflüssig, da du eh schon mit X und Y die Koordinaten relatic zur Form bekommst. (Also entfällt auch das -196 bzw. -145, was sowieso überaus unschön ist. Besser wäre ScreenToClient zu benutzen!)

Zitat:

Zitat von malo
Delphi-Quellcode:
procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var
  pt: Tpoint;
begin
  if Zeichnen = true then
    begin
      pt := Mouse.CursorPos;
      Canvas.LineTo (pt.X-196, pt.y-145);
    end;

end;

Hier das selbe Spiel: pt ist überflüssig - X und Y ist alles was du brauchst.


Gruss,
Fabian


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:43 Uhr.
Seite 1 von 2  1 2      

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