Benutzer mit den meisten Antworten
Frage zu Graphics.PageScale und Fonts

Frage
-
Hi,
in einer Windows Forms Anwendung zeichne ich eine Baumansicht. Die Zeichenroutine wird sowohl für die Ausgabe auf dem Bildschirm wie auch für die Ausgabe auf einem Drucker verwendet. Zum Drucken setzte ich den Wert von PageUnit auf Millimeter und den Wert von PageScale auf 0.2. Dabei ist mir aufgefallen, das alle Zeichenoperationen angepasst werden, nicht aber die Textausgabe (DrawString). Egal welchen Wert ich dort eintrage, die Schriftgröße wird dabei nicht verändert. Ist das normal so!? Denn verwende ich die ScaleTransform Methode, so wird die Textgröße mit verändert!
Gruß
Martin
Antworten
-
Hallo Martin,
PageUnits/PageScale sind an sich hilfreich (man setzt sie und überläßt alles weitere dem Graphics-Objekt). Aber es gibt viele Limitierungen, so auch beim Ausgeben von Text, da das Font-Objekt (this.Font) nicht von den PageUnits beeinflußt wird. Es sei denn man berechnet die Font-Höhe entsprechend den aktuellen Werte aus dem Graphics-Objekt mittels Font.GetHeight() und skaliert das Font-Objekt selbst. Font.GetHeight() hat den Vorteil, die Schriftarthöhe in der aktuellen Einheit zurückzugeben:
float fontHeight = this.Font.GetHeight(g); Font myScaledFont = new Font(this.Font.FontFamily, fontHeight, FontStyle.Regular, GraphicsUnit.Millimeter); g.DrawString(text, myScaledFont, Brushes.Black, boundingRectangle);
Eine andere Möglichkeit wäre natürlich eine Matrix zu verwenden:
Matrix matrix = new Matrix(); matrix.Scale(x, y); g.Transform = matrix; g.DrawString(text, this.Font, Brushes.Black, boundingRectangle);
Font.GetHeight-Methode (Graphics)
http://msdn.microsoft.com/de-de/library/7y237t0c.aspx
Graphics.Transform-Eigenschaft:
http://msdn.microsoft.com/de-de/library/system.drawing.graphics.transform.aspxGruß
Marcel
- Bearbeitet Marcel RomaModerator Freitag, 25. November 2011 14:36
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 2. Dezember 2011 09:10
Alle Antworten
-
Hallo Martin,
PageUnits/PageScale sind an sich hilfreich (man setzt sie und überläßt alles weitere dem Graphics-Objekt). Aber es gibt viele Limitierungen, so auch beim Ausgeben von Text, da das Font-Objekt (this.Font) nicht von den PageUnits beeinflußt wird. Es sei denn man berechnet die Font-Höhe entsprechend den aktuellen Werte aus dem Graphics-Objekt mittels Font.GetHeight() und skaliert das Font-Objekt selbst. Font.GetHeight() hat den Vorteil, die Schriftarthöhe in der aktuellen Einheit zurückzugeben:
float fontHeight = this.Font.GetHeight(g); Font myScaledFont = new Font(this.Font.FontFamily, fontHeight, FontStyle.Regular, GraphicsUnit.Millimeter); g.DrawString(text, myScaledFont, Brushes.Black, boundingRectangle);
Eine andere Möglichkeit wäre natürlich eine Matrix zu verwenden:
Matrix matrix = new Matrix(); matrix.Scale(x, y); g.Transform = matrix; g.DrawString(text, this.Font, Brushes.Black, boundingRectangle);
Font.GetHeight-Methode (Graphics)
http://msdn.microsoft.com/de-de/library/7y237t0c.aspx
Graphics.Transform-Eigenschaft:
http://msdn.microsoft.com/de-de/library/system.drawing.graphics.transform.aspxGruß
Marcel
- Bearbeitet Marcel RomaModerator Freitag, 25. November 2011 14:36
- Als Antwort markiert Robert BreitenhoferModerator Freitag, 2. Dezember 2011 09:10
-
Hallo Martin Horst,
Ist es nicht besser, zum Drucken, das Dokument um den druckbaren Bereich des Druckers erstmals formatieren, so dass keine Skalierung erforderlich ist?
Zum lesen:
Das Problem der verschiedenen Maßeinheiten
Festlegung der Einheiten und Skalierung
Beispielprogramm zum Drucken einer Grafik
Grüße,
Robert