如何使用Compact Framework垂直绘制文本

时间:2009-07-21 19:06:08

标签: c# user-interface windows-mobile drawing

我需要直接在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);
}

感谢。

3 个答案:

答案 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)