AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Linie zeichnen - Pen.Width wird nicht korrekt beachtet
Thema durchsuchen
Ansicht
Themen-Optionen

Linie zeichnen - Pen.Width wird nicht korrekt beachtet

Ein Thema von Andreas L. · begonnen am 7. Jul 2011 · letzter Beitrag vom 7. Jul 2011
Antwort Antwort
Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#1

Linie zeichnen - Pen.Width wird nicht korrekt beachtet

  Alt 7. Jul 2011, 14:59
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?
Andreas Lauß
Blog

Geändert von Andreas L. ( 7. Jul 2011 um 15:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

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

  Alt 7. Jul 2011, 16:16
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?
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
Andreas L.

Registriert seit: 23. Mai 2011
Ort: Furth im Wald
308 Beiträge
 
Delphi 11 Alexandria
 
#3

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

  Alt 7. Jul 2011, 19:47
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 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

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?
canvas_lineto.png
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...
Andreas Lauß
Blog
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#4

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

  Alt 7. Jul 2011, 19:52
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.
Ansonsten Poly-irgendwas nehmen (PolyLine ist eine Line/Umrandung, aber irgendwas gab es auch, das dann gefüllt ist)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#5

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

  Alt 7. Jul 2011, 19:56
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.
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 PS_ENDCAP_FLAT setzen. Siehe auch PenEndCap
  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 08:46 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