Hallo,
gibt es eine Möglichkeit bei Graphics.Drawstring den Zeichenabstand zu verändern?
Weder bei System.Drawing.Font noch bei DrawString hab ich eine Letter-Spacing Eigenschaft gefunden.
Muss ich das selbst coden? Und wenn ja: Wie berechne ich die Breite eines Buchstabens, damit ich diese Breite auf die X-Koordinate aufaddieren kann?
Gruß, Rasta
Sogar meine Mailadresse ist .NET 🙂
verwende nicht graphics.DrawString sondern immer den TextRenderer zum zeichnen von strings.
verwende auch nciht graphics.MeasureString sondern immer TextRenderer.MeasureString
wäre es bedeutend einfacher, wenn dueinfach ein leerzeichen zwischen jeden buchstaben setzt. wenn das zu viel ist, dann musst du mit measurestring ausmessen, wie groß der buchstabe ist und dann immer etwas dazuberechnen und immer nur ein buchstaben nach dem anderen zeichnen. VORSICHT!!!-->das funktioniert nicht mit allen fonts. bei inigen wird auch bei dieser verbesserten methode nicht immer die korrekte breite der einzelnen buchstaben berechnet.
am besten du verwendest einen font, der immer für jedes zeichen den gleichen abstand hat. z.b. courier new.
Hallo Rasta,
soweit ich das überblicke, kannst du bei DrawString zusätzlichen zu den Einstellungen im Font-Objekt nur das einstellen, was in StringFormat möglich ist. Ich sehe auch nicht, das mit Blick auf dein Anliegen mit TextRenderer mehr rauszuholen wäre.
herbivore
Das Problem ist, dass ich einen Parser + GUI für ein Layoutformat baue.
Sowohl Zeichenhöhe als auch Zeichenabstand wird in Gleitkomma-Millimetern angegeben. Einfach Leerzeichen dazwischenschieben ist viel zu ungenau.
Der TextRenderer scheint aber schon vielversprechend zu sein. Momentan zeichnet er mir noch alles zu klein, woran könnte das liegen? Ich übergebe dem TR das gleiche Font-Objekt wie Graphics.DrawString.
Interpretiert der TR die Angabe "2.34mm" etwa anders? 😉
Danke schonmal, wenns nicht richtig klappt frag ich nochmal.
@herbivore: Das hat mir Google leider auch gesagt. In .NET war ein vernünftiger Schriftsatz scheinbar nicht vorgesehen (bzw. bei DrawString etc.).
Möglicherweise muss ich wirklich aus jedem Wort ein Char-Array machen und jeden Buchstaben einzeln mit dem richtigen Abstand zeichnen. Schaun wa moal...
Gruß, Sascha
Sogar meine Mailadresse ist .NET 🙂
Hallo Rasta,
Möglicherweise muss ich wirklich aus jedem Wort ein Char-Array machen und jeden Buchstaben einzeln mit dem richtigen Abstand zeichnen. Schaun wa moal...
das ist keine gute Idee. Du müsstest dich dann selber um die Abstände kümmern und die sind ja nicht konstant, sondern hängen von der Kombination der Buchstaben ab. Zwischen a und o (ao) sind es in diesem Font zwei Pixel und zwischen a und t (at) ein Pixel. Denkbar wären zwischen T und o (To) auch null Pixel oder sogar eine Unterschneidung, also ein negativer Abstand, obwohl das im konkreten Font nicht der Fall ist.
Je besser der Font ist, desto mehr sog. Hints hat er, was die Abstände von Buchstabenkombinationen angeht. Diese Hints werden bei der Ausgabe von fortlaufendem Text berücksichtigt. Wenn du die Zeichen einzeln ausgibst, können die Hints natürlich nicht zum Tagen kommen.
herbivore
Hallo Rasta,
evtl. würde es sich für dich lohnen für einen Layout-Editor auf WPF umzusteigen.
Um derartige Zeichenoperationen auf Fonts umzusetzen, müßtest du mit Glyphen arbeiten (und WPF unterstützt dies, s.a. Typography in WPF).
An WPF hatte ich auch schonmal gedacht. Aber bevor ich das mache, liefere ich erstmal ab, was ich habe. Der GUI-Teil ist nämlich gar nicht gefordert gewesen, nur der Parser. Aber ich wollte halt ne visuelle Überprüfung haben ob der auch richtig parst ^^
Wo ich den Artikel "Typography in WPF" so lese...das ist ja richtig gut was da geboten wird. Da kommt anscheinend so ein "WinForms sind tot"-Gedanke hoch 😉
Danke dafür.
Gruß, Rasta
Sogar meine Mailadresse ist .NET 🙂