HOW TO:旋轉文字

更新:2007 年 11 月

.NET Compact Framework 提供可用來建立旋轉文字效果的 LogFont 類別 (Class)。這個類別會對應到原生的 Windows CE LOGFONT (邏輯字型) 結構,也就是在使用 FromLogFont 方法以傳回 Font 物件時所配合的結構。

範例

下列程式碼範例在表單中央描繪具 45 度角的字串。這個範例以 LogFont 類別定義了 CreateRotatedFont 方法,該方法會接收旋轉角度和要旋轉之文字做為其參數,然後傳回旋轉的字型。旋轉的文字會在 OnPaint 事件處理常式中描繪於表單上。

這個範例是將 DPI 設定為 96,不過您應該將其設定為目標裝置所適用的值。取得 Graphics 物件的 DpiY 屬性即可判斷這個值。這個程式碼範例包含可針對不同 DPI 值之裝置進行調整字型大小的公式。

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());
        }
    }
}

編譯程式碼

這個範例需要下列命名空間的參考:

穩固程式設計

這個範例會在表單的建構函式 (Constructor) 中建立呈現字型的物件,也就是 FontSolidBrush 物件,以便在表單重新描繪時,能讓 OnPaint 方法使用這些物件。接著,它會在表單之 Dispose 方法的覆寫中處置 (Dispose) 這些物件。

請參閱

工作

使用 LogFont 的旋轉文字範例

參考

LogFont