Frage

Ich habe eine Kontrolle in C # WinForms subclassed und benutzerdefinierten am Zeichnen von Text in meinem OnPaint() Handler. Die Schriftart Courier New festgelegt wird, um den folgenden Code in meinem Formular:

FontFamily family = new FontFamily("Courier New");
this.myControl.Font = new Font(family, 10);

Bei der Steuerung selbst wird die Zeichenfolge in realText gespeichert, und ich verwende den folgenden Code, um es auf den Bildschirm zu zeichnen:

protected override void OnPaint(PaintEventArgs e)
{
    base.OnPaint(e);

    e.Graphics.DrawString(realText, Font, new SolidBrush(ForeColor), ClientRectangle);
}

Das Ergebnis für einige zufällige Beispiel Text sieht wie folgt aus: http://img219.imageshack.us/img219/1778/courier.png

Wenn Sie die Ansicht vergrößern, können Sie zum Beispiel sehen, dass der Raum zwischen dem ersten ‚als‘ anders ist als der Abstand zwischen dem zweiten ‚als‘ (1 Pixel im Vergleich zu 2 Pixel). Hat jemand eine Ahnung, was dies verursachen könnte, oder wie kann ich es verhindern? Es gibt eine Menge ähnliche Seltsamkeit in Abstand, wie ich mit verschiedenen Schriftart zu zeichnen, aber ich nehme an, sie sind alle Ergebnisse des gleichen Problems.

Vielen Dank im Voraus für alle Ideen, die Sie haben.

War es hilfreich?

Lösung

Ich werde erraten, dass es ist, weil Sie verwenden Graphics.DrawString() anstelle von TextRenderer.DrawText() . Der ehemalige Farbe Text GDI + verwendet, die Art von crappy und veraltet ist. Letztere verwendet GDI die modernere ist (in Bezug auf Text-Rendering). Ich glaube, dies ist der Unterschied von der vorherige Antwort (WinForms vs. Windows).

festgestellt ist

Sie können auch die Überlastung von Graphics.DrawString() versuchen, die eine StringFormat Objekt und StringFormat.GenericTypographic angeben. Aber das ist wirklich ein bisschen wie ein Hack, um das Problem. Wenn Sie .NET 2.0 oder höher verwenden, sollten Sie die TextRenderer Klasse verwenden, anstatt die crappy Graphics Klasse für alle Ihre Text-Rendering-Bedürfnisse. Graphics.MeasureString() und Graphics.DrawString() existieren ausschließlich für die Abwärtskompatibilität mit .NET 1.0 und 1.1.

edit: Ach ja, und der Code ein GDI-Objekt auf alle Lackzyklus leckt. Pinsel Objekte werden Wrapper um nicht verwalteten Ressourcen verwaltet somit müssen sie explizit entsorgt werden.

Andere Tipps

Ich habe um ehrlich zu sein, aber das passiert mir noch nie. Allerdings versuche das Smoothing auf Anti-Aliasing-Einstellung:

e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

Eine andere Sache beiseite, stellen Sie sicher, dass die von Ihrer Verwendung hat Double auf true gesetzt. Versuchen Sie auch, nicht ein neues SolidBrush in jedem OnPaint Aufruf zu erstellen ..

Meine Erfahrung mit Malerei Texten subclassed Kontrollen WinForms ist, dass das Text-Rendering-Engine nutzt (GDI +?) Ist eigene Schrift-Engine nicht so gut wie Windows und gibt sicherlich unterschiedliche Ergebnisse, auch wenn es funktioniert gut.

Ich bin der Autor eines Visual Studio Addin ( http://entrian.com/source-search ), die Steuerelemente in Visual Studio, und um die Schriften der gleiche wie das Standard-Steuerelemente in Visual Studio aussehen zu lassen malen muss (Listviews, treeviews, etc.) ich WinForms zu umgehen habe und den Text malt das Win32 mit API:

[DllImport("gdi32.dll")]
public static extern bool ExtTextOut(IntPtr hdc, int X, int Y,
   uint fuOptions, [In] ref RECT lprc, string lpString, uint cbCount,
   [In] int[] lpDx);

... und Familie.

Wahrscheinlich nicht, was Sie hören wollten, aber es gibt es.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top