代码之家  ›  专栏  ›  技术社区  ›  Bobby Ortiz

如何用紧凑框架垂直绘制文本

  •  3
  • Bobby Ortiz  · 技术社区  · 15 年前

    我需要直接在Windows Mobile窗体上垂直绘制文本。这是一个紧凑的框架2.0应用程序。我在Windows窗体应用程序中使用了以下测试代码,但它不适用于Compact框架,因为没有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 回复  |  直到 10 年前
        1
  •  6
  •   JMD    15 年前
    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);
    
        2
  •  1
  •   David Talbot    10 年前

    我知道这个问题已经回答了,但我发现 this example 在Microsoft网站上,更全面、更有用:

    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());
            }
        }
    }
    
        3
  •  0
  •   x2z    11 年前

    已转换为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)