我需要直接在Windows Mobile窗体上直接绘制文本。这是一个Compact Framework 2.0应用程序。我在Windows窗体应用程序中使用以下测试代码,但它不适用于紧凑框架,因为没有DirectionVertical StringFormatFlag。还有另一种方法可以在Windows Mobile上执行相同的操作吗?升级到Compact Framework 3.5没有帮助。它具有与2.0相同的StringFormatFlags。
private void TestDrawVertically()
{
Font myFont = new Font(FontFamily.GenericSerif, 10, FontStyle.Bold);
System.Drawing.Brush myBrush = new SolidBrush(Color.Black);
Rectangle myRect = new Rectangle(10, 10, 200, 200);
StringFormat myFormat = new StringFormat();
myFormat.LineAlignment = StringAlignment.Center;
myFormat.Alignment = StringAlignment.Center;
myFormat.FormatFlags = StringFormatFlags.DirectionVertical;
Graphics myGraphic = this.CreateGraphics();
myGraphic.DrawString("Hello", myFont, myBrush, myRect, myFormat);
}
感谢。
答案 0 :(得分:6)
public static Font CreateRotatedFont(string fontname, int height, int angleInDegrees, Graphics g)
{
LogFont logf = new LogFont();
logf.Height = -1 * height;
logf.FaceName = fontname;
logf.Escapement = angleInDegrees * 10;
logf.Orientation = logf.Escapement;
logf.CharSet = LogFontCharSet.Default;
logf.OutPrecision = LogFontPrecision.Default;
logf.ClipPrecision = LogFontClipPrecision.Default;
logf.Quality = LogFontQuality.ClearType;
logf.PitchAndFamily = LogFontPitchAndFamily.Default;
return Font.FromLogFont(logf);
}
然后像这样使用它:
Graphics myGraphic = this.CreateGraphics();
Font myFont = CreateRotatedFont("Tahoma", 32, 90, myGraphic);
myGraphic.DrawString("Hello", myFont, myBrush, myRect, myFormat);
答案 1 :(得分:1)
我知道这个问题已经得到解答,但我在微软网站上发现this example更加全面和有用:
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());
}
}
}
答案 2 :(得分:0)
转换为VB.NET
Public Function CreateRotatedFont(ByVal FontName As String, ByVal Height As Integer, ByVal AngleInDegrees As Integer, ByVal g As Graphics) As Font
Dim logf As New LogFont()
logf.Height = -1 * Height
logf.FaceName = FontName
logf.Escapement = AngleInDegrees * 10
logf.Orientation = logf.Escapement
logf.CharSet = LogFontCharSet.Default
logf.OutPrecision = LogFontPrecision.Default
logf.ClipPrecision = LogFontClipPrecision.Default
logf.Quality = LogFontQuality.ClearType
logf.PitchAndFamily = LogFontPitchAndFamily.Default
Return Font.FromLogFont(logf)
End Function
使用:
Dim myGraphic As Graphics = Me.CreateGraphics()
Dim myFont As Font = CreateRotatedFont("Tahoma", 32, 90, myGraphic)
Dim myBrush As New SolidBrush(Color.Black)
myGraphic.DrawString("Hello", myFont, myBrush, 200, 103)