Entwickler-Ecke

Multimedia / Grafik - Freihandzeichnen: Linien, statt einzelne Punkte zeichnen


fusco123 - Sa 01.12.07 16:14
Titel: Freihandzeichnen: Linien, statt einzelne Punkte zeichnen
Hey Leutz,
bin neu hier am Bord.
Hab vor kurzem angefangen mich mit Delphi zu beschäftigen und nen kleines Programm geschrieben mit dem man malen kann.
Hab damit auch schon nen Problem: Wenn man die Maus zu schnell zieht, erscheinen nur einzelne Ellipsen statt eine Linie, wenn man die Maus langsam zieht, dann nicht, wißt ihr ne Möglichkeit das zu verhinden ?
Vielen Dank für eure Beiträge, fusco


Moderiert von user profile iconGausi: Topic aus Freeware Projekte verschoben am Sa 08.12.2007 um 18:52
Moderiert von user profile iconChristian S.: Topic aus VCL (Visual Component Library) verschoben am Sa 08.12.2007 um 18:52
Moderiert von user profile iconNarses: Titel nach erfolgloser Ermahnung angepasst am Di 11.12.2007 um 23:07


Timosch - Sa 01.12.07 16:28

Wie wärs mit dem Quelltext? Die compilierte Exe hilft uns nicht weiter.
Ach ja: :welcome: in der EE.


fusco123 - Di 04.12.07 17:19

Hat keiner ne Idee bezüglich des "schnellen Ziehens" ???
fusco


golgol - Mi 05.12.07 09:20

user profile iconfusco123 hat folgendes geschrieben:
Hat keiner ne Idee bezüglich des "schnellen Ziehens" ???
fusco


Eine gute Möglichkeit sowas zu verhindern ist, dass du beim Freihandzeichnen nicht einzelne Punkte setzt, sondern immer eine Gerade zwischen den beiden letzten Koordinaten zeichnest. Auf diese Weise können keine Lücken entstehen. Wenn du dann zusätzlich an den Endpunkten einen entsprechenden Kreis zeichnest, fällt der Unterschied nicht auf.


fusco123 - Sa 08.12.07 18:58

@golgol
danke für den tipp. Nur leider bringt mir das nichts. Weil, wenn man die Maus ohne zu drücken weiterzieht und dann drückt geht automatisch ne Linie zu dem letzten Punkt.
Wenn man es aber mit lineto () UND moveto() macht, ist wieder genu das problem wie vorher da, also mit den einzelnen punkten.
fusco


Christian S. - Sa 08.12.07 19:53

Hallo!

Bitte ändere den Titel so, dass man weiß, was Deine Frage ist. Danke! :-)

Grüße
Christian


Atreyu - Sa 08.12.07 20:29

user profile iconfusco123 hat folgendes geschrieben:
@golgol
danke für den tipp. Nur leider bringt mir das nichts. Weil, wenn man die Maus ohne zu drücken weiterzieht und dann drückt geht automatisch ne Linie zu dem letzten Punkt.
Wenn man es aber mit lineto () UND moveto() macht, ist wieder genu das problem wie vorher da, also mit den einzelnen punkten.
fusco


Du arbeitest doch mit MouseDown. Dann könntest du mit MouseUp die letzte Koordinate löschen, sodass sie beim erneuten MouseDown neu gespeichert wird.


Zorro - Di 11.12.07 23:25

user profile iconfusco123 hat folgendes geschrieben:
@golgol
danke für den tipp. Nur leider bringt mir das nichts. Weil, wenn man die Maus ohne zu drücken weiterzieht und dann drückt geht automatisch ne Linie zu dem letzten Punkt.
Wenn man es aber mit lineto () UND moveto() macht, ist wieder genu das problem wie vorher da, also mit den einzelnen punkten.
fusco


Dann solltest du ENTWEDER lineto ODER moveto verwenden:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
var unten : boolean;

procedure TForm1.FormMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  unten := True;
end;

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

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if unten then canvas.lineto(x,y) else canvas.moveto(x,y);

end;


ist ein voll funktionierendes Kritzelproggi.

Greetz
Zorro

Tante Edith sagte: Mach die Delphi-Tags rein. ok


fusco123 - Mi 12.12.07 18:19

hmm irgendwie versteht mein problem keiner, hab jetzt den Quelltext von zorro in meine proggi überschrieben und es geht trotzdem nicht, also die linie ist durchgehend, knüpft aber an den letzten Punkt an.
Weshalb ist da eigentlich keine durchgehende Linie, liegt dass daran dass das Programm mit den funktionen nicht so schnell arbeiten kann oder warum?
Könnte vllt jemand wenn er es geschaft hat, den quelltext von meinem programm so zu ändern dass geht, den gesamten quelltext hier posten ????
vielen danke für eure mühen fusco

P.S.: hab noch gar nicht gefragt wie ich findet ihr eig. mein Programmm so ?


Biergeneral - Mi 12.12.07 22:53

Warum der nur hin und wieder was malt ist eigentlich ganz einfach nachzuvollziehen.

Jedesmal wenn du die Maus bewegst, wird ne Nachricht von an das Fenster geschickt.
Die Nachricht beschreibt allerdings nicht die Bewegung, sondern nur die neue Position.
Bewegst du die Maus schnell, steht in der Nachricht nur drin " Jo, ich bin jetzt bei x=200, y=200"

Und genau da malt der die Ellipse jetzt auch hin..


Das ganze kannst du allerdings sehr leicht umgehen..



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
procedure TForm13.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  Checkbox1.Checked:=true;
  Image1.Canvas.MoveTo(X,Y);      // beim Mausdown bewegst du den Stift an die aktuelle Position
end;


procedure TForm13.Image1MouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
var xpos, ypos:Integer;

    begin
    xpos:=X; ypos:=Y;

    //grün
    if (Checkbox1.checked=true) and
    (Checkbox2.Checked=False) and
    (Checkbox4.Checked=False) and    //nur Maustaste, keine Ziffer
    (Checkbox5.Checked=False)  and
    (Radiobutton1.checked=false) and
    (Radiobutton2.Checked=false) and
    (Radiobutton3.Checked=false) and
    (Radiobutton4.Checked=false) then
    begin
      Image1.Canvas.Pen.color:=RGB(0,255,0);  //Randfarbe schwarz
      Image1.Canvas.Brush.Color:=RGB(0,255,0);  //Füllfarbe schwarz
//      Image1.Canvas.ellipse(xpos,ypos,xpos+10,ypos+10);  // Ellipse

//--->> Statt jetzt eine Ellipse zu malen, malst du einfach mit dem Stift
      Image1.Canvas.Pen.Width := 10;
      Image1.Canvas.LineTo(xpos, ypos);
//--->> Und verbindest, die aktuelle Position wo der Stift liegt, mit der neuen Position
    end;


fusco123 - Do 13.12.07 18:45

Jo danke, jetzt gehts ..
werde bald die aktualisierte Version hochladen, habe aber heute leider keine Zeit mehr dafür ...
fusco


fusco123 - Sa 15.12.07 17:40

Hab jetzt dank eurer Hilfe, das Proggi verbessert und die neue Version hochgeladen.
fusco

P.S. für alle nicht registrierten User zum Downloaden unter: http://rapidshare.com/files/83433753/bildschirmmalen.exe