2010-12-02 5 views
3

Ich muss viel auf einem Raster mit einem Abstand von 12,5 Pixel X und 20 Pixel Y (die PICA-Skala) zu zeichnen. Die Schrift muss eine bestimmte Größe haben und die Linien müssen immer noch ein Pixel dick sein. Momentan speichere ich diese Werte in Fließkommazahlen und multipliziere sie (z. B. Text beginnend in Zeile 3, Spalte 6 wird als Koordinaten 2f * cx, 5f * cy gezeichnet). Ich möchte diese unnötige Multiplikation vermeiden, indem ich eine Maßstabsumwandlung benutze, die aber leider auch die Schriftgröße und Linienstärke beeinflusst. Gibt es eine Möglichkeit, dies zu vermeiden? Oder würde der Compiler das still für mich tun, da die cx/cy-Werte Konstanten sind?C# Scaling GDI-Positionen, aber nicht Schriftgröße oder Linienstärke

Antwort

1

Der Compiler sollte den konstanten Teil der Ausdrücke auf eine einzige Konstante reduzieren, aber es muss immer noch eine Multiplikation zur Laufzeit geben, da der Wert Ihres Gleitkommazugs zur Kompilierungszeit nicht bekannt ist. Also kann (1 + 2 + c) * 6 * f vom Compiler auf n * f reduziert werden, wenn c eine Konstante ist.

Ihre beste Wette, um die Skalierung Ihres Textes zu verhindern, ist wahrscheinlich, eine Skalierungstransformation einzurichten, alle Nicht-Textgrafiken zu zeichnen, die Sie nicht interessieren, minimale Linienbreiten beizubehalten, dann Ihren Text ohne die Transformation zu zeichnen. Sie können die Transformation verwenden, um zu lokalisieren, wo der Text beginnen soll, um sich selbst zu errechnen, dass er dies unabhängig berechnen muss - eine Funktion wie LPtoDP (logischer Punkt zum Gerätepunkt) sollte den Trick machen.

Eine weitere Möglichkeit, dies zu erreichen, besteht darin, den Text in der Transformation zu rendern, aber eine umgekehrte Skalierung auf die Textgröße anzuwenden. Wenn die Transformation also um 5% reduziert wird, skalieren Sie die Schriftgröße um 5%. Dies wird keine genauen Ergebnisse liefern, könnte aber für Visuals nahe genug sein.

+0

Gibt es eine LPtoDP-Funktion in den Grafikklassen, oder müsste ich das selbst machen? Es gibt eine Menge Textausgaben, aber ich möchte das so schnell wie möglich (es gehört tatsächlich in OnPaintBackground) und der Aspekt ist nicht 1: 1, also glaube ich nicht, dass eine umgekehrte Skalierung eine gute Wahl wäre. – Patrick

+0

LPtoDP ist eine Win32 GDI-API-Funktion. Es kann ähnlich in den .NET-Grafikklassen sein, nicht sicher. – dthorpe

6

... Microsoft hat auch einen kleinen "Hack" für uns hinterlassen, wenn Sie nicht möchten, dass Zeilen skaliert werden. Stellen Sie die Breite der Linie auf 0px, und es wird immer ein einzelnes Pixel dick gezeichnet.

+0

Wow. Das wusste ich nicht. Das ist ordentlich. – Patrick

+0

Das ist brilliant, du bist ein Beinende. –