Gewusst wie: Drehen von Text
Aktualisiert: November 2007
.NET Compact Framework bietet die LogFont-Klasse zum Erstellen von gedrehtem Text. Dies entspricht der systemeigenen Windows CE LOGFONT-Struktur (logische Schriftartstruktur), die Sie mit der FromLogFont-Methode verwenden, um ein Font-Objekt zurückzugeben.
Beispiel
Im folgenden Codebeispiel wird in der Mitte des Formulars eine um 45 Grad gedrehte Zeichenfolge erstellt. Sie definiert eine CreateRotatedFont-Methode, die den Drehwinkel und den zu drehenden Text als Parameter verwendet und eine gedrehte Schriftart zurückgibt, wobei die LogFont-Klasse verwendet wird. Der gedrehte Text wird auf dem Formular im OnPaint-Ereignishandler gezeichnet.
In diesem Beispiel wird der DPI-Wert auf 96 festgelegt. Sie sollten jedoch den für das Zielgerät jeweils angemessenen Wert verwenden. Der Wert kann bestimmt werden, indem Sie die DpiY-Eigenschaft eines Graphics-Objekts abrufen. Dieses Codebeispiel enthält eine Formel, mit der die Schriftart für Geräte mit verschiedenen DPI-Werten skaliert werden kann.
Imports System
Imports System.Drawing
Imports System.Windows.Forms
Imports Microsoft.WindowsCE.Forms
Public Class Form1
Inherits System.Windows.Forms.Form
' Declare objects to draw the text.
Private rotatedFont As System.Drawing.Font
Private redBrush As SolidBrush
' Specify the text to roate, the rotation angle,
' and the base font.
Private rTxt As String = "abc ABC 123"
Private rAng As Integer = 45
' Determine the vertial DPI setting for scaling the font on the
' device you use for developing the application.
' You will need this value for properly scaling the font on
' devices with a different DPI.
' In another application, get the DpiY property from a Graphics object
' on the device you use for application development:
'
' Dim g As Graphics = Me.CreateGraphics()
' Dim curDPI As Integer = g.DpiY
Private Const curDPI As Integer = 96
' Note that capabilities for rendering a font are
' dependant on the device.
Private rFnt As String = "Arial"
Public Sub New()
MyBase.New()
' Display OK button to close application.
Me.MinimizeBox = False
Me.Text = "Rotated Font"
' Create rotatedFont and redBrush objects in the custructor of
' the form so that they can be resued when the form is repainted.
Me.rotatedFont = CreateRotatedFont(rFnt, rAng)
Me.redBrush = New SolidBrush(Color.Red)
End Sub
' Method to create a rotated font using a LOGFONT structure.
Private Function CreateRotatedFont(ByVal fontname As String, _
ByVal angleInDegrees As Integer) As Font
Dim logf As LogFont = New Microsoft.WindowsCE.Forms.LogFont
' Create graphics object for the form, and obtain
' the current DPI value at design time. In this case,
' only the vertical resolution is petinent, so the DpiY
' property is used.
Dim g As Graphics = Me.CreateGraphics
' Scale an 18-point font for current screen vertical DPI.
logf.Height = Fix(-18.0F * g.DpiY / curDPI)
' Convert specified rotation angle to tenths of degrees.
logf.Escapement = (angleInDegrees * 10)
' Orientation is the same as Escapement in mobile platforms.
logf.Orientation = logf.Escapement
logf.FaceName = fontname
' Set LogFont enumerations.
logf.CharSet = LogFontCharSet.Default
logf.OutPrecision = LogFontPrecision.Default
logf.ClipPrecision = LogFontClipPrecision.Default
logf.Quality = LogFontQuality.ClearType
logf.PitchAndFamily = LogFontPitchAndFamily.Default
' Explicitly dispose any drawing objects created.
g.Dispose()
Return System.Drawing.Font.FromLogFont(logf)
End Function
Protected Overrides Sub OnPaint(ByVal e As PaintEventArgs)
If (Me.rotatedFont Is Nothing) Then
Return
End If
' Draw the text to the screen using the LogFont, starting at
' the specified coordinates on the screen.
e.Graphics.DrawString(rTxt, Me.rotatedFont, Me.redBrush, _
75, 125, New StringFormat( _
(StringFormatFlags.NoWrap Or StringFormatFlags.NoClip)))
End Sub
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
' Dispose created graphic objects. Although they are
' disposed by the garbage collector when the application
' terminates, a good practice is to dispose them when they
' are no longer needed.
Me.redBrush.Dispose()
Me.rotatedFont.Dispose()
MyBase.Dispose(disposing)
End Sub
Public Shared Sub Main()
Application.Run(New Form1)
End Sub
End Class
using System;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.WindowsCE.Forms;
namespace LogFontDemo
{
public class Form1 : System.Windows.Forms.Form
{
// Declare objects to draw the text.
Font rotatedFont;
SolidBrush redBrush;
// Specify the text to roate, the rotation angle,
// and the base font.
private string rTxt = "abc ABC 123";
private int rAng = 45;
// Determine the vertial DPI setting for scaling the font on the
// device you use for developing the application.
// You will need this value for properly scaling the font on
// devices with a different DPI.
// In another application, get the DpiY property from a Graphics object
// on the device you use for application development:
//
// Graphics g = this.CreateGraphics();
// int curDPI = g.DpiY;
private const int curDPI = 96;
// Note that capabilities for rendering a font are
// dependant on the device.
private string rFnt = "Arial";
public Form1()
{
// Display OK button to close application.
this.MinimizeBox = false;
this.Text = "Rotated Font";
// Create rotatedFont and redBrush objects in the custructor of
// the form so that they can be resued when the form is repainted.
this.rotatedFont = CreateRotatedFont(rFnt, rAng);
this.redBrush = new SolidBrush(Color.Red);
}
// Method to create a rotated font using a LOGFONT structure.
Font CreateRotatedFont(string fontname, int angleInDegrees)
{
LogFont logf = new Microsoft.WindowsCE.Forms.LogFont();
// Create graphics object for the form, and obtain
// the current DPI value at design time. In this case,
// only the vertical resolution is petinent, so the DpiY
// property is used.
Graphics g = this.CreateGraphics();
// Scale an 18-point font for current screen vertical DPI.
logf.Height = (int)(-18f * g.DpiY / curDPI);
// Convert specified rotation angle to tenths of degrees.
logf.Escapement = angleInDegrees * 10;
// Orientation is the same as Escapement in mobile platforms.
logf.Orientation = logf.Escapement;
logf.FaceName = fontname;
// Set LogFont enumerations.
logf.CharSet = LogFontCharSet.Default;
logf.OutPrecision = LogFontPrecision.Default;
logf.ClipPrecision = LogFontClipPrecision.Default;
logf.Quality = LogFontQuality.ClearType;
logf.PitchAndFamily = LogFontPitchAndFamily.Default;
// Explicitly dispose any drawing objects created.
g.Dispose();
return Font.FromLogFont(logf);
}
protected override void OnPaint(PaintEventArgs e)
{
if(this.rotatedFont == null)
return;
// Draw the text to the screen using the LogFont, starting at
// the specified coordinates on the screen.
e.Graphics.DrawString(rTxt,
this.rotatedFont,
this.redBrush,
75,
125,
new StringFormat(StringFormatFlags.NoWrap |
StringFormatFlags.NoClip));
}
protected override void Dispose(bool disposing)
{
// Dispose created graphic objects. Although they are
// disposed by the garbage collector when the application
// terminates, a good practice is to dispose them when they
// are no longer needed.
this.redBrush.Dispose();
this.rotatedFont.Dispose();
base.Dispose(disposing);
}
static void Main()
{
Application.Run(new Form1());
}
}
}
Kompilieren des Codes
Für dieses Beispiel sind Verweise auf die folgenden Namespaces erforderlich:
Robuste Programmierung
In diesem Beispiel werden Objekte für die Darstellung der Schriftart, nämlich das Font-Objekt und das SolidBrush-Objekt, im Konstruktor des Formulars erstellt, sodass die Objekte von der OnPaint-Methode verwendet werden, wenn das Formular aktualisiert wird. Dann werden sie freigegeben, indem die Dispose-Methode des Formulars überschrieben wird.
Siehe auch
Aufgaben
Beispiel für gedrehten Text mit LogFont