방법: 텍스트 회전
업데이트: 2007년 11월
.NET Compact Framework에서는 회전된 텍스트 효과를 만들 수 있는 LogFont 클래스를 제공합니다. 이 클래스는 Font 개체를 반환하도록 FromLogFont 메서드와 함께 사용하는 네이티브 Windows CE LOGFONT(논리 글꼴) 구조체에 해당합니다.
예제
다음 코드 예제에서는 문자열을 폼의 가운데에 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());
}
}
}
코드 컴파일
이 예제에는 다음과 같은 네임스페이스에 대한 참조가 필요합니다.
강력한 프로그래밍
이 예제에서는 폼이 다시 그려질 때 OnPaint 메서드에서 사용할 수 있도록 글꼴을 렌더링하기 위한 개체인 Font 및 SolidBrush 개체를 폼의 생성자에 만듭니다. 그런 다음 폼의 Dispose 메서드에 대한 재정의에서 해당 개체를 삭제합니다.