Laden...

GDI - Unscharfe Schrift mit DrawString()

Erstellt von uNki vor 12 Jahren Letzter Beitrag vor 12 Jahren 3.996 Views
U
uNki Themenstarter:in
58 Beiträge seit 2011
vor 12 Jahren
GDI - Unscharfe Schrift mit DrawString()

hi!

ich versuche mich daran, den office scheduler nachzubauen.

offensichtlich wird standardmäßig segoe ui als schriftart verwendet.
wenn ich versuche meine steuerelemente im scheduler damit zu beschriften, erscheint die schrift allerdings hässlich (unscharf/matschig) und nicht so schön wie im office.

hier der code:


                    using (Font fntDay = new Font("Segoe UI", 8, FontStyle.Regular, GraphicsUnit.Point))
                        g.DrawString(sTodaysName, fntDay, SystemBrushes.WindowText, rect, format);
                    
                    using (Font fntDayDate = new Font("Segoe UI", 10, FontStyle.Regular, GraphicsUnit.Point))
                        g.DrawString(" " + date.ToString(" d"), fntDayDate, SystemBrushes.WindowText, rect, formatdd);

habe schon mit g.SmoothingMode experimentiert. ändert nichts am erscheinungsbild.

habt ihr eine idee, woran es liegt?

in der vergleichsgrafik ist oben office und unten mein scheduler zu sehen.

danke!

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo uNki,

also ich musst da schon ziemlich genau hinschauen und habe erst in mehrfacher Vergrößerung einen Unterschied gesehen (was vielleicht auch daran liegt, dass ich hier noch einen Röhrenmonitor habe). Jedenfalls gibt es bei der selbstgezeichneten Version leichte Farbsäume um die Buchstaben. Das klingt nach ClearType, einer nicht unumstrittenen Optimierung für LCD-Monitore (Subpixel-Rendering). Das kann man systemweit abschalten. Vielleicht findest du über das Stichwort weitere Informationen, wie man es beim Graphics-Objekt oder bei DrawString abschalten kann.

herbivore

U
uNki Themenstarter:in
58 Beiträge seit 2011
vor 12 Jahren

hallo herbivore,

an cleartype habe ich nicht gedacht. habe das grundsätzlich deaktiviert. daher konnte ich mir nicht vorstellen, dass office 2010 unterschiedliche schrift (bei gleicher schriftart!) zaubert, als mein c#!?

naja, ich schau mal, ob ich was finde. hatte gehofft, dass hier sofort jmd. aufschreit "ach... alter hut.. stell das und das um!" 😃 schade

U
uNki Themenstarter:in
58 Beiträge seit 2011
vor 12 Jahren

also, der tipp mit dem cleartype war gut.

lösung hat folgendes bei mir gebracht:


g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
                   
                    using (Font fntDay = new Font("Segoe UI", 11, FontStyle.Regular, GraphicsUnit.Pixel))
                        g.DrawString(sTodaysName, fntDay, SystemBrushes.WindowText, rect, format);
                    
                    using (Font fntDayDate = new Font("Segoe UI", 12, FontStyle.Bold, GraphicsUnit.Pixel))
                        g.DrawString(" " + date.ToString(" d"), fntDayDate, SystemBrushes.WindowText, rect, formatdd);

also

g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;

und GraphicsUnit.Pixel statt GraphicsUnit.Point

ergebnis:

U
uNki Themenstarter:in
58 Beiträge seit 2011
vor 12 Jahren

aber irgendwas stimmt noch nicht ganz...

die abstände zwischen den buchstaben sind im office/outlook ein wenig größer. meine wirkt recht gedrungen.

schrift ist wohl nicht gleich schrift, auch wenn in beiden fällen segoe ui dran steht 😃

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo uNki,

auf deutsch nennt sich das Laufweite. Ich meine mich zu erinnern, dass es einen kleinen Unterschied hinsichtlich der Laufweite zwischen Graphics.DrawString und TextRenderer.DrawText gibt. Ich bin mir aber nicht sicher. Möglicherweise kann man die Laufweite aber auch selber festlegen.

herbivore