Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Actualización: noviembre 2007
.NET Compact Framework proporciona la clase LogFont para crear efectos de texto girado. Esta clase se corresponde con la estructura LOGFONT (fuente lógica) nativa de Windows CE que se utiliza con el método FromLogFont para devolver un objeto Font.
Ejemplo
El siguiente ejemplo de código dibuja una cadena a 45 grados en el centro del formulario. Define un método CreateRotatedFont que toma como parámetros el ángulo de rotación y el texto que se va a girar y devuelve una fuente girada, utilizando la clase LogFont. El texto girado se dibuja en el formulario en el controlador de eventos OnPaint.
Este ejemplo establece el valor de PPP en 96, pero este valor debe establecerse en un valor adecuado para el dispositivo de destino. Este valor puede determinarse obteniendo la propiedad DpiY de un objeto Graphics. Este ejemplo de código incluye una fórmula para ajustar la fuente de dispositivos con valores distintos de PPP.
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());
}
}
}
Compilar el código
Para este ejemplo se requieren referencias a los siguientes espacios de nombres:
Programación eficaz
Este ejemplo crea objetos para representar la fuente (los objetos Font y SolidBrush) en el constructor del formulario, para que el método OnPaint pueda utilizarlos cuando vuelva a dibujarse el formulario. A continuación, los elimina en un reemplazo del método Dispose del formulario.
Vea también
Tareas
Ejemplo Rotated Text Using LogFont