How to: Rotate Text

The .NET Compact Framework provides the LogFont class for creating rotated text effects. It corresponds to the native Windows CE LOGFONT (logical font) structure that you use with the FromLogFont method to return a Font object.

Example

The following code example draws a string at 45 degrees in the center of the form. It defines a CreateRotatedFont method that takes the rotation angle and text to be rotated as its parameters and returns a rotated font, using the LogFont class. The rotated text is drawn on the form in the OnPaint event handler.

This example sets the DPI to 96, but you should set it to the value appropriate for the target device. The value can be determined by getting the DpiY property of a Graphics object. This code example contains a formula to scale the font for devices with different DPI values.

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

Compiling the Code

This example requires references to the following namespaces:

Robust Programming

This example creates objects for rendering the font, the Font and SolidBrush objects, in the form's constructor so that they are used by the OnPaint method when the form repaints. Then it disposes them in an override of the form's Dispose method.

See Also

Tasks

Rotated Text Using LogFont Sample

Reference

LogFont