2009-07-21 9 views
3

J'ai besoin de dessiner du texte VERTICALEMENT directement sur un Windows Mobile Form. Ceci est une application Compact Framework 2.0. J'ai le code de test suivant qui fonctionne dans une application de formulaire Windows, mais il ne fonctionne pas avec le cadre compact car il n'y a PAS de DirectionVertical StringFormatFlag. Existe-t-il une autre façon de faire la même chose sur Windows Mobile? La mise à niveau vers Compact Framework 3.5 n'a PAS aidé. Il a le même StringFormatFlags que 2.0.Comment dessiner du texte verticalement avec un cadre compact

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); 
} 

Merci.

Répondre

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); 
} 

utiliser ensuite comme ceci:

Graphics myGraphic = this.CreateGraphics(); 
Font myFont = CreateRotatedFont("Tahoma", 32, 90, myGraphic); 
myGraphic.DrawString("Hello", myFont, myBrush, myRect, myFormat); 
+0

Quoi de graphique g à la méthode statique? –

0

Converti en 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 

Utilisation:

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) 
1

Je sais que cette question a déjà été répondu, mais j'ai trouvé this example sur le site web de Microsoft mo re approfondie et utile:

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()); 
     } 
    } 
} 
Questions connexes