Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Linie zeichnen - Pen.Width wird nicht korrekt beachtet (https://www.delphipraxis.net/161528-linie-zeichnen-pen-width-wird-nicht-korrekt-beachtet.html)

Andreas L. 7. Jul 2011 13:59


Linie zeichnen - Pen.Width wird nicht korrekt beachtet
 
Hallo,

ich möchte in einer PaintBox eine Linie zeichnen. Solange ich als Breite 1 Pixel angebe, funktioniert auch alles.

Delphi-Quellcode:
  PaintBox1.Canvas.Pen.Color := clBlack;
  PaintBox1.Canvas.Pen.Width := SpinEdit1.Value;
  PaintBox1.Canvas.MoveTo(0, 0);
  PaintBox1.Canvas.LineTo(PaintBox1.Width, 1);
Wenn die Breite 2 ist, wird die Linie trotzdem nur 1 Pixel breit gezeichnet. Bei 3 Pixel wird die Linie 2 Pixel breit gezeichnet. Bei 48 wird sie 24 breit gezeichnet.

Warum ist das so?

s.h.a.r.k 7. Jul 2011 15:16

AW: Linie zeichnen - Pen.Width wird nicht korrekt beachtet
 
Zeichne die Linie mal in die Mitte des Canvas und nicht am Rand. Evtl. zeichnet er in den negativen Bereich und das siehst du dann eben nicht -- das wird genau diese Hälfte sein.

Ebenso solltest du nicht von (0, 0) auf (Width, 1) zeichnen, sondern von (0, 0) auf (Width, 0). Die selbe Höhe sollte schon drin sein, außer du brauchst das genau so?

Andreas L. 7. Jul 2011 18:47

AW: Linie zeichnen - Pen.Width wird nicht korrekt beachtet
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von s.h.a.r.k (Beitrag 1110630)
Ebenso solltest du nicht von (0, 0) auf (Width, 1) zeichnen, sondern von (0, 0) auf (Width, 0). Die selbe Höhe sollte schon drin sein, außer du brauchst das genau so?

Danke für deine Hilfe :-D Das war anscheinend das Problem. Jetzt wird die Linie mit korrekter Breite gezeichnet. Hatte es auch schon mit (Width, 0) versucht, aber irgendwie ging das vorhin nicht :gruebel:

Jetzt wo ich die Linie in der Mitte der PaintBox zeichne ist mir ein neues Problem aufgefallen: Die Linie wird links und rechts abgerundet gezeichnet (siehe Screenshot). Ist das normal?
Anhang 34648
Gezeichnet mit diesem Code:
Delphi-Quellcode:
  PaintBox1.Canvas.Pen.Color := clSilver;
  PaintBox1.Canvas.Pen.Style := psSolid;
  PaintBox1.Canvas.Pen.Width := SpinEdit1.Value;
  PaintBox1.Canvas.MoveTo(50, 50);
  PaintBox1.Canvas.LineTo(150, 50);
Ist jetzt nicht so das Problem weil ich die Linie jetzt eh' mit TBrush und FillRect zeichne. Aber interessieren würde mich trotzdem warum die Linie abgerundet wird...

himitsu 7. Jul 2011 18:52

AW: Linie zeichnen - Pen.Width wird nicht korrekt beachtet
 
Jupp, ist normal so, also das mit dem Abrunden.

Bei mehr als 1 Pixel Beite und wenn die Linie nur senkrecht/wagerecht sein soll, dann kannst du aber auch mit FillRect zeichnen ... so isses schön rechtreckig. :mrgreen:
Ansonsten Poly-irgendwas nehmen (PolyLine ist eine Line/Umrandung, aber irgendwas gab es auch, das dann gefüllt ist)

Namenloser 7. Jul 2011 18:56

AW: Linie zeichnen - Pen.Width wird nicht korrekt beachtet
 
Zitat:

Zitat von Andreas L. (Beitrag 1110685)
Jetzt wo ich die Linie in der Mitte der PaintBox zeichne ist mir ein neues Problem aufgefallen: Die Linie wird links und rechts abgerundet gezeichnet (siehe Screenshot). Ist das normal?

Ja.
Zitat:

Zitat von Andreas L. (Beitrag 1110685)
Ist jetzt nicht so das Problem weil ich die Linie jetzt eh' mit TBrush und FillRect zeichne. Aber interessieren würde mich trotzdem warum die Linie abgerundet wird...

Weil der Standard-Pen ein Kreis ist.

Man kann über die GDI-Funktion ExtCreatePen auch eigene Pens erstellen. Wenn man abgehackte Enden haben will, muss man das Flag
Delphi-Quellcode:
PS_ENDCAP_FLAT
setzen. Siehe auch PenEndCap


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