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

Referenz

LogFont