Problem: Font, Localization, RightToLeft

11/08/2009 - 13:25 von Matthias Heise | Report spam
Hallo,

leidiges altes Thema, doch leider für mich derzeit ohne Lösung. Szenario:
Ein String in Unicode z.B. gemischt mit Latain, Arabisch und Japanisch.
Windows (in z.B. System.Windows.Forms.Label) ist so schlau zu erkennen, daß
ein Teilstring (der Arabische) von rechts nach links layoutet werden muss.

In meiner Anwendung wird der String nun in einzelne Chars zerlegt und für
die werden Metrics für Buchstabengröße, Offset/Kerning etc. bestimmt.
Hintergrund ist, daß sie in einer OpenGL Engine dann einzeln gerendert werden.

Das Problem dabei ist a) daß die Bestimmung der Buchstaben-Informationen
über die PInvoke Methoden GetCharWidth, GetCharWidth32 und GetCharWidthI
sowie GetCharABCWidths nicht immer funktionieren. Der bei Microsoft
beschriebene Fallback liefert leider auch keine brauchbaren Ergebnisse. Daher
ist unser interner Fallback dann
System.Drawing.Graphics.MeasureCharacterRanges sow
System.Drawing.Graphics.MeasureString, welche wieder eher unbrauchbare
Ergebnisse liefern.

Das zweite Problem b) liegt in der Laufrichtung. In ein und demselben String
àndert diese sich ja. Nur wie bekomme ich diese Information von Windows bzw.
.NET bzw. aus dem einzelnen char der mir vorliegt wenn ich den String
durchlaufe.

Wàre super, wenn Ihr mir hier ein paar Anhaltspunkte geben könnt.

Danke

Matthias
 

Lesen sie die antworten

#1 Frank Dzaebel
11/08/2009 - 21:19 | Warnen spam
Hallo Matthias,

[...] brauchbaren Ergebnisse. Daher ist unser interner Fallback dann
System.Drawing.Graphics.MeasureCharacterRanges sow
System.Drawing.Graphics.MeasureString, welche wieder eher unbrauchbare
Ergebnisse liefern.



Normal ist ab .NET 2.0:

[TextRenderer.MeasureText-Methode (System.Windows.Forms)]
http://msdn.microsoft.com/de-de/lib...etext.aspx

genauer und flexibler.



Das zweite Problem b) liegt in der Laufrichtung. In ein und demselben
String àndert diese sich ja. Nur wie bekomme ich diese Information
von Windows bzw. .NET bzw. aus dem einzelnen char der mir vorliegt
wenn ich den String durchlaufe.



Das geht so AFAIK nicht direkt. Du kannst ggf. über die
Unicode-Kategorie gehen:

[Sorting it all Out : Mixing it up with bidirectional text]
http://blogs.msdn.com/michkap/archi...21178.aspx

[Zeichenklassen]
http://msdn.microsoft.com/de-de/lib...w873z.aspx
(siehe ganz unten)
___________________

Auf "Verdacht" noch ein paar Links, die ggf. bei
Applikationen mit RTL nutzbar sind:

private static bool CultureInfoIsRightToLeft()
{
return
System.Globalization.CultureInfo.CurrentUICulture.TextInfo.IsRightToLeft;
}

// We have to adjust the left of the drawing rectangle to draw the text in
// the correct location: NewLeft = FormWidth - (Left + Width)
TextRenderer.DrawText(e.Graphics, " العربية !", this.Font,
new Rectangle(this.Width - (5+50), 5, 50, 50),
SystemColors.ControlText, TextFormatFlags.RightToLeft);

[Microsoft Middleeast - MSDN]
http://www.microsoft.com/middleeast...rabic.aspx

[StringFormatFlags-Enumeration (System.Drawing)]
http://msdn.microsoft.com/de-de/lib...flags.aspx
(-> DirectionRightToLeft)

[Control.RtlTranslateLeftRight-Methode (System.Windows.Forms)]
http://msdn.microsoft.com/de-de/lib...right.aspx

[Control.RightToLeft-Eigenschaft (System.Windows.Forms)]
http://msdn.microsoft.com/de-de/lib...oleft.aspx


ciao Frank
Dipl.Inf. Frank Dzaebel [MCP/MVP C#]
http://Dzaebel.NET

Ähnliche fragen