Text mit .NET setzen

8

Ich schreibe ein WinForms .NET Programm, das etwas Text auf einer Seite (mit ein paar einfachen geometrischen / Vektorgrafiken) ausgeben muss. Gibt es ein Äquivalent zu OS Xs Core Graphics und / oder < a href="https://developer.apple.com/library/mac/#documentation/StringsTextFonts/Conceptual/CoreText_Programming/Introduction/Introduction.html"> Kerntext ? Bis jetzt benutze ich nur PrintDocument und verwende das Graphics -Objekt, das von PrintPageEventArgs bereitgestellt wird, um Text auf der Seite zu zeichnen, aber es gibt sehr wenig Kontrolle über Dinge wie Wortzwischenraum, Interlinerabstand usw. und vieles Dinge müssen manuell erledigt werden.

Ich fühle mich, als würde ich etwas verpassen; Gibt es eine bessere Möglichkeit, Text auf einer Seite zu setzen? Es macht mir nichts aus, Lösungen von Drittanbietern zu verwenden, solange sie für den persönlichen Gebrauch frei sind.

Dies wird zum Setzen einer kleinen Anzahl von Dokumenten verwendet, einschließlich einseitiger Broschüren / Flyer (wobei der meiste Text variabel ist, aber die Bilder statisch sind), Zertifikaten (wo der meiste Text und Bilder statisch aber einige Texte variabel sind) , Fahrpläne usw.

    
dreamlax 03.07.2013, 13:25
quelle

2 Antworten

18

WinForms

Wenn Sie WinForms verwenden, ist es nahezu unmöglich, die richtige Einstellung zu machen, und ja, fast alles muss manuell erledigt werden. Dafür gibt es mehrere Gründe:

  1. Sie erhalten keine detaillierten Glyphinformationen
  2. Die Textmessung ist schrecklich ungenau, sowohl die GDI + als auch die GDI basierte Version.

Windows Presentation Foundation

Wenn Sie WPF verwenden, ist das eine ganz andere Sache, da Sie detaillierte geometrische Informationen zu jedem Zeichen erhalten.

Allerdings kann man die beiden etwas verschachteln, aber irgendwie möglich. Obwohl, ich empfehle es nicht, da die Grafiken und Bitmaps nicht direkt austauschbar sind, was zu einer langsamen Leistung führen kann.

Wenn Sie sich die Möglichkeit ansehen möchten, dass Sie System.Windows.Media in Ihr Projekt importieren müssen, um auf die Schrift- und Zeichensatzfähigkeit von WPF zuzugreifen.

Sie werden auch ein paar andere Herausforderungen treffen:

  1. Die Schriftartenlisten zwischen WinForm und WPF sind nicht identisch (mehr Schriftarten und Schriftarten mit WPF).
  2. Sie können nicht einfach ein WPF-Symbol verwenden und es in eine WinForm-Bitmap zeichnen.
  3. Die Werte aus dem Glyph sind wie erwartet in em , daher müssen sie basierend auf der Punktgröße in Pixel konvertiert werden.

Sie können diese (jedoch nicht ausschließlich) Informationen erhalten:

Alle Details (zu viele, um sie hier aufzulisten):
Ссылка

Fazit

Aber wenn Sie bei GDI + und WinForms bleiben, ist die beste Methode, die Sie verwenden können, wahrscheinlich die Verwendung der GDI-basierten TextMetrics Klasse.

Sie werden in jedem Fall möglicherweise Probleme mit dem Auffüllen haben, Sie können den Zeichenabstand nicht einstellen usw.

Sie müssen die Grundlinie für jede Schriftart und Größe mit top + ascent berechnen:

%Vor%

Ich kenne keine Drittanbieter-Bibliothek, die dies in der WinForm-Umgebung tun kann, ich glaube aus den hier genannten Gründen und den damit verbundenen Schmerzen.

Abschließend kann ich Ihnen nur empfehlen, sich Windows Presentation Foundation / WPF anzuschauen, um eine bessere Grundeinstellung zu erreichen, da Sie mit WinForms in vielen Kompromissen stecken bleiben (Ich habe einen Font Viewer gemacht, der ist, wo ich auf WPF gestoßen bin, weil ich Glyphen und detaillierte Informationen darüber einschließlich Black-Box und so weiter zeigen wollte - das war schmerzhaft genug).

UPDATE:

WebBrowser als Engine für die Typeinstellung

Eine mögliche Abhilfe besteht darin, das WebBrowser-Steuerelement zu verwenden, um die Einstellung vorzunehmen. Es ist kein tatsächlicher Hack, aber ein bisschen hack-ish, da es eine anfänglich unnötige Abhängigkeit vom IE-Browser auf dem Computer des Benutzers herstellt.

Dies kann sich jedoch als flexibel erweisen, wenn es um die Typeinstellung geht, da Sie die gleichen einfachen Steuerelemente für Text haben wie für jede HTML-Seite.

Um ein Ergebnis zu erhalten, fügen Sie den HTML-Code mit Stilen und Attributen für den Text ein. Sie können es sogar mit Bildern und so weiter kombinieren (offensichtlich).

Die Kontrolle kann zum Beispiel auf einer anderen versteckten Form sein, die für den Benutzer nicht sichtbar ist.

Nachdem Sie das WebControl in das Formular eingefügt oder es manuell erstellt haben, wird HTML in einem einzigen Schritt gesetzt:

%Vor%

Der nächste Schritt besteht darin, das, was Sie als HTML rendern, als ein Bild zu betrachten, das wie folgt gemacht werden kann:

%Vor%

Von: Speichern von Bildern aus einem WebBrowser-Steuerelement

Jetzt können Sie die Bitmap auf Ihrer normalen Seite platzieren. ..oder benutzen Sie einfach das Steuerelement direkt auf dem Formular mit reduzierten interaktiven Fähigkeiten (Rechtsklick-Menü könnte leicht zu einem Problem werden, wenn nicht).

Wenn Sie nicht genau wissen, für welche Verwendung das geeignet ist, ist dies möglicherweise eine geeignete Lösung, aber es bietet einige leistungsstarke Optionen und kann anstelle einer Lösung eines Drittanbieters verwendet werden.

Komponenten

Wenn man hoch und niedrig schaut, scheint es, dass dieses Gebiet nicht so zielgerichtet ist. Ich könnte eine Komponente finden, die näher kommt, aber das Muster geht weiter: Man wird einen Nagel mit einem Vorschlaghammer treffen. Es endet in der gleichen Kategorie wie der WebBrowser-Workaround.

Diese Komponente ist wirklich ein vollwertiger Editor, aber indem sie den größten Teil davon deaktiviert, kann sie vielleicht verwendet werden, um einfach formatierten Text / Grafiken mit einer Art Einstellung zu zeigen:

Ссылка

Eine andere Möglichkeit besteht darin, eine PDF-Komponente zu verwenden, um den Inhalt einzurichten und eine Komponente zu verwenden, um das PDF als Grafik (kommerziell) zu rendern:
Ссылка
Ссылка

Nicht kommerziell:
Ссылка

Verwenden von GhostScript, um ein Bild zu erhalten:
Ссылка

Die offensichtliche statische Alternative

.. und corky vielleicht, aber auf jeden Fall nehme ich es als Einfachheit, manchmal funktioniert am besten -

Wenn es nicht unbedingt erforderlich ist, diese Seiten dynamisch zu erstellen, generieren Sie den gesamten Text und alle Grafiken in Illustrator / Photoshop / inDesign usw. und speichern Sie das Ergebnis als Bilder, die angezeigt werden sollen.

    
K3N 10.07.2013, 00:27
quelle
0

Um Text zu legen: Es gibt mehrere Möglichkeiten:

  1. Ein einfaches Label, mit dem Sie einfache Textmanipulationen vornehmen können (wie Schriftart, Platzierung, Farbe usw.)
  2. Ein Rich-Text-Dokument, mit dem Sie die Eigenschaften des Steuerelements an Ihre Bedürfnisse anpassen können. Denken Sie daran, dass hier einige einfache Bilder dargestellt werden können.
  3. Ein Bild - & gt; das Sie dynamisch mit dem Grafikobjekt mit dem onpaint-Ereignis erstellen können. Dies wird nicht empfohlen, da es sich um einen Ansatz auf sehr niedrigem Niveau handelt, aber wie Sie wissen, wie niedrig das Niveau ist, desto mehr Macht Sie gewinnen.
  4. Kombination vieler Steuerelemente, in einem benutzerdefinierten Steuerelement, das Sie erstellen, dass Sie die Informationen enthalten, die Sie in lokalen Elementen zeichnen / schreiben möchten - & gt; dann behalte weiter, wenn du etwas änderst, dann setze ein Flag ( _needToBeRepainted = true; ) und dann auf neu streichen, wenn (_needToBeRepainted) alles zeichnen.

Bitte lassen Sie mich wissen, wenn Sie weitere Hilfe bei der Lösung dieses Problems benötigen.

    
Itsik Cohen 09.07.2013 12:49
quelle

Tags und Links