Csharp/C Sharp/2D Graphics/Text

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

Center each line of text horizontally and vertically

  using System;
  using System.Drawing;
  using System.Drawing.Drawing2D;
  using System.Collections;
  using System.ruponentModel;
  using System.Windows.Forms;
  using System.Data;
  using System.Drawing.Imaging;
  public class Form1 : System.Windows.Forms.Form
  {
    public Form1()
    {
      InitializeComponent();
    }
    private void InitializeComponent()
    {
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
      this.ClientSize = new System.Drawing.Size(292, 273);
      this.Text = "";
      this.Resize += new System.EventHandler(this.Form1_Resize);
      this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
    }
    static void Main() 
    {
      Application.Run(new Form1());
    }
    private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
    {      
      Graphics g = e.Graphics;
      g.FillRectangle(Brushes.White, this.ClientRectangle);
      String s = "This is a long string that will wrap. ";
      s += "It will be centered both vertically and horizontally.";
      Font f = new Font("Arial", 12);
      StringFormat sf = new StringFormat();
      sf.Alignment = StringAlignment.Center;        // horizontal alignment
      sf.LineAlignment = StringAlignment.Center;    // vertical alignment
      Rectangle r = new Rectangle(10, 10, 300, f.Height * 4);
      g.DrawRectangle(Pens.Black, r);
      g.DrawString(s, f, Brushes.Black, r, sf);
      f.Dispose();
    }
    private void Form1_Resize(object sender, System.EventArgs e)
    {
      Invalidate();
    }
  }


Clip Text

 

using System;
using System.Collections.Generic;
using System.ruponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Text;
using System.Windows.Forms;
class FontMenuForm : Form {
    protected string strText = "Clip Text";
    protected Font font = new Font("Times New Roman", 24);
    public static void Main() {
        Application.Run(new FontMenuForm());
    }
    public FontMenuForm() {
        ResizeRedraw = true;
    }
    protected void DoPage(Graphics grfx, Color clr, int cx, int cy) {
        GraphicsPath path = new GraphicsPath();
        float fFontSize = PointsToPageUnits(grfx, font);
        path.AddString(strText, font.FontFamily, (int)font.Style,
                       fFontSize, new PointF(0, 0), new StringFormat());
        grfx.SetClip(path);
        RectangleF rectfBounds = path.GetBounds();
        grfx.TranslateClip(
                       (cx - rectfBounds.Width) / 2 - rectfBounds.Left,
                       (cy - rectfBounds.Height) / 2 - rectfBounds.Top);
        Random rand = new Random();
        for (int y = 0; y < cy; y++) {
            Pen pen = new Pen(Color.FromArgb(rand.Next(255),
                                             rand.Next(255),
                                             rand.Next(255)));
            grfx.DrawBezier(pen, new Point(0, y),
                                 new Point(cx / 3, y + cy / 3),
                                 new Point(2 * cx / 3, y - cy / 3),
                                 new Point(cx, y));
        }
    }
    public float GetAscent(Graphics grfx, Font font) {
        return font.GetHeight(grfx) *
                  font.FontFamily.GetCellAscent(font.Style) /
                       font.FontFamily.GetLineSpacing(font.Style);
    }
    public float GetDescent(Graphics grfx, Font font) {
        return font.GetHeight(grfx) *
                  font.FontFamily.GetCellDescent(font.Style) /
                       font.FontFamily.GetLineSpacing(font.Style);
    }
    public float PointsToPageUnits(Graphics grfx, Font font) {
        float fFontSize;
        if (grfx.PageUnit == GraphicsUnit.Display)
            fFontSize = 100 * font.SizeInPoints / 72;
        else
            fFontSize = grfx.DpiX * font.SizeInPoints / 72;
        return fFontSize;
    }
}


Deal with Tab and New Line in Painting String

  using System;
  using System.Drawing;
  using System.Drawing.Drawing2D;
  using System.Collections;
  using System.ruponentModel;
  using System.Windows.Forms;
  using System.Data;
  using System.Drawing.Imaging;
  public class Form1 : System.Windows.Forms.Form
  {
    public Form1()
    {
      InitializeComponent();
    }
    private void InitializeComponent()
    {
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
      this.ClientSize = new System.Drawing.Size(292, 273);
      this.Text = "";
      this.Resize += new System.EventHandler(this.Form1_Resize);
      this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
    }
    static void Main() 
    {
      Application.Run(new Form1());
    }
    private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
    {      
      Graphics g = e.Graphics;
      g.FillRectangle(Brushes.White, this.ClientRectangle);
      Font f = new Font("Times New Roman", 12);
      Font bf = new Font(f, FontStyle.Bold);
      StringFormat sf = new StringFormat();
      float[] ts = { 10.0f, 70.0f, 100.0f, 90.0f };
      sf.SetTabStops(0.0f, ts);
      // The \t escape-sequence in these lines specifies the tab
      string s1 = "\tName\tEye Color\tHeight";
      string s2 = "\tBob\tBrown\t175cm";
      string s3 = "\tMary\tBlond\t161cm\n\tBill\tBlack\t168cm";
      g.DrawString(s1, bf, Brushes.Black, 20, 20, sf);
      g.DrawString(s2, f, Brushes.Blue, 20, 20 + bf.Height, sf);
      g.DrawString(s3, f, Brushes.Blue, 20,
                        20 + bf.Height + f.Height, sf);
      f.Dispose();
      bf.Dispose();
    }
    private void Form1_Resize(object sender, System.EventArgs e)
    {
      Invalidate();
    }
  }


Draw line and string

/*
User Interfaces in C#: Windows Forms and Custom Controls
by Matthew MacDonald
Publisher: Apress
ISBN: 1590590457
*/
using System;
using System.Drawing;
using System.Collections;
using System.ruponentModel;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
namespace GDI_Basics
{
    /// <summary>
    /// Summary description for PenCaps.
    /// </summary>
    public class PenCaps1 : System.Windows.Forms.Form
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ruponentModel.Container components = null;
        public PenCaps1()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();
            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if(components != null)
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }
        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            // 
            // PenCaps
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(424, 330);
            this.Name = "PenCaps";
            this.Text = "PenCaps";
            this.Resize += new System.EventHandler(this.PenCaps_Resize);
            this.Paint += new System.Windows.Forms.PaintEventHandler(this.PenCaps_Paint);
        }
        #endregion
        private void PenCaps_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
        {
            Pen myPen = new Pen(Color.Blue, 10);
            int y  = 20;
            
            foreach (LineCap cap in System.Enum.GetValues(typeof(LineCap)))
            {
                myPen.StartCap = cap;
                myPen.EndCap = cap;
                e.Graphics.DrawLine(myPen, 20, y, 100, y);
                e.Graphics.DrawString(cap.ToString(), new Font("Tahoma", 8), Brushes.Black, 120, y - 10);
                y += 30;
            }
        }
        [STAThread]
        static void Main() 
        {
            Application.Run(new PenCaps1());
        }
        private void PenCaps_Resize(object sender, System.EventArgs e)
        {
            this.Invalidate();
        }
    }
}


Draw multiline text: auto wrap

using System;
using System.Drawing;
using System.Collections;
using System.ruponentModel;
using System.Windows.Forms;
using System.Data;
public class Form1 : System.Windows.Forms.Form{
  public Form1()
  {
        InitializeComponent();
        SetStyle(ControlStyles.Opaque, true);
        Bounds = new Rectangle(0, 0, 500, 300);
  }
    protected override void OnPaint(PaintEventArgs e) {
         Graphics g = e.Graphics;
   
         g.FillRectangle(Brushes.White, ClientRectangle);

         // Draw multiline text
         Font trFont = new Font("Times New Roman", 12);
         Rectangle rect = new Rectangle(0, 0, 400, trFont.Height * 3);
         g.DrawRectangle(Pens.Blue, rect);
         String longString = "Text Text Text Text Text Text Text Text Text Text  ";
         longString += "Text Text Text Text Text Text Text Text Text Text  ";
         longString += "Text Text Text Text Text Text Text Text Text Text  ";
         longString += "Text Text Text Text Text Text Text Text Text .";
         g.DrawString(longString, trFont, Brushes.Black, rect);
      }
    private void InitializeComponent()
    {
      this.Size = new System.Drawing.Size(300,300);
      this.Text = "Form1";
    }
    static void Main() 
    {
      Application.Run(new Form1());
    }
}


Draw rectangle and string inside

  using System;
  using System.Drawing;
  using System.Drawing.Drawing2D;
  using System.Collections;
  using System.ruponentModel;
  using System.Windows.Forms;
  using System.Data;
  public class MainForm : System.Windows.Forms.Form
  {
    public MainForm()
    {
      InitializeComponent();
      CenterToScreen();
      SetStyle(ControlStyles.ResizeRedraw, true);  
    }
    private void InitializeComponent()
    {
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
      this.ClientSize = new System.Drawing.Size(292, 273);
      this.Text = "Pens...";
      this.Resize += new System.EventHandler(this.Form1_Resize);
      this.Paint += new System.Windows.Forms.PaintEventHandler(this.MainForm_Paint);
    }
    static void Main() 
    {
      Application.Run(new MainForm());
    }
    private void MainForm_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
    {
      Graphics g = e.Graphics;
      // And a rect with some text...
      Rectangle r = new Rectangle(150, 10, 130, 60);
      g.DrawRectangle(Pens.Blue, r);
      g.DrawString("www.nfex.ru", 
        new Font("Arial", 12), Brushes.Black, r);
    }
    private void Form1_Resize(object sender, System.EventArgs e)
    {
       Invalidate();  
    }
  }


Draw string with new font and solid brush

  using System;
  using System.Drawing;
  using System.Collections;
  using System.ruponentModel;
  using System.Windows.Forms;
  using System.Data;
  public class MainForm : System.Windows.Forms.Form
  {
    private System.ruponentModel.Container components;
    public MainForm()
    {
      InitializeComponent();
      BackColor = Color.Tomato;
      Opacity = 0.5d;
      Text = "www.nfex.ru";
      Cursor = Cursors.WaitCursor;
      this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
    }
    protected override void Dispose( bool disposing )
    {
      if( disposing )
      {
        if (components != null) 
        {
          components.Dispose();
        }
      }
      base.Dispose( disposing );
    }
    private void InitializeComponent()
    {
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
      this.ClientSize = new System.Drawing.Size(292, 273);
      this.Text = "Form1";
    }
    [STAThread]
    static void Main() 
    {
      Application.Run(new MainForm());
    }
    private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
    {
      Graphics g = e.Graphics;
      g.DrawString("www.nfex.ru", 
        new Font("Times New Roman", 20), 
        new SolidBrush(Color.Black), 40, 10);
    }
  }


Draw the string, using the rectangle as a bounding box

  using System;
  using System.Drawing;
  using System.Drawing.Drawing2D;
  using System.Collections;
  using System.ruponentModel;
  using System.Windows.Forms;
  using System.Data;
  using System.Drawing.Imaging;
  public class Form1 : System.Windows.Forms.Form
  {
    public Form1()
    {
      InitializeComponent();
    }
    private void InitializeComponent()
    {
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
      this.ClientSize = new System.Drawing.Size(292, 273);
      this.Text = "Pen Cap App";
      this.Resize += new System.EventHandler(this.Form1_Resize);
      this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
    }
    static void Main() 
    {
      Application.Run(new Form1());
    }
    private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
    {      
      Graphics g = e.Graphics;
      g.FillRectangle(Brushes.White, this.ClientRectangle);
      String s = "Text Text Text Text Text Text Text Text Text Text ";
      s += "Text Text Text Text Text Text Text Text Text Text Text Text Text ";
      s += "Text Text Text Text Text Text Text Text Text Text Text Text ";
      Font f = new Font("Arial", 12);
      Rectangle r = new Rectangle(20, 20, 200, f.Height * 6);
      // 
      g.DrawRectangle(Pens.Black, r);
      g.DrawString(s, f, Brushes.Black, r);
      f.Dispose();
    }
    private void Form1_Resize(object sender, System.EventArgs e)
    {
      Invalidate();
    }
  }


Draw Vertical String Text

  using System;
  using System.Drawing;
  using System.Drawing.Drawing2D;
  using System.Collections;
  using System.ruponentModel;
  using System.Windows.Forms;
  using System.Data;
  using System.Drawing.Imaging;
  public class Form1 : System.Windows.Forms.Form
  {
    public Form1()
    {
      InitializeComponent();
    }
    private void InitializeComponent()
    {
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
      this.ClientSize = new System.Drawing.Size(292, 273);
      this.Text = "";
      this.Resize += new System.EventHandler(this.Form1_Resize);
      this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
    }
    static void Main() 
    {
      Application.Run(new Form1());
    }
    private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
    {      
      Graphics g = e.Graphics;
      g.FillRectangle(Brushes.White, this.ClientRectangle);
      String s = "Accrington Stanley";
      StringFormat sf = new StringFormat(StringFormatFlags.DirectionVertical);
      Font f = new Font("Times New Roman", 14);
      SizeF sizef = g.MeasureString(s, f, Int32.MaxValue, sf);
      RectangleF rf = new RectangleF(20, 20, sizef.Width, sizef.Height);
      g.DrawRectangle(Pens.Black, rf.Left, rf.Top, rf.Width, rf.Height);
      g.DrawString(s, f, Brushes.Black, rf, sf);
      f.Dispose();
    }
    private void Form1_Resize(object sender, System.EventArgs e)
    {
      Invalidate();
    }
  }


Emboss

 
using System;
using System.Drawing;
using System.Windows.Forms;
   
class FontMenuForm: Form
{
     protected string strText = "Emboss";
     protected Font font = new Font("Times New Roman", 24);
   
     public static void Main()
     {
          Application.Run(new FontMenuForm());
     }
     public FontMenuForm()
     {
          ResizeRedraw = true;

     }
     protected void DoPage(Graphics grfx, Color clr, int cx, int cy)
     {
          int iOffset = 2;
          SizeF sizef = grfx.MeasureString(strText, font);
          float x     = (cx - sizef.Width) / 2;
          float y     = (cy - sizef.Height) / 2;
   
          grfx.Clear(Color.White);
          grfx.DrawString(strText, font, Brushes.Gray, x, y);
          grfx.DrawString(strText, font, Brushes.White, x - iOffset, 
                                                        y - iOffset);
                                            
     }
     public float GetAscent(Graphics grfx, Font font)
     {
          return font.GetHeight(grfx) * 
                    font.FontFamily.GetCellAscent(font.Style) /
                         font.FontFamily.GetLineSpacing(font.Style);
     }
     public float GetDescent(Graphics grfx, Font font)
     {
          return font.GetHeight(grfx) * 
                    font.FontFamily.GetCellDescent(font.Style) /
                         font.FontFamily.GetLineSpacing(font.Style);
     }
     public float PointsToPageUnits(Graphics grfx, Font font)
     {
          float fFontSize;
   
          if (grfx.PageUnit == GraphicsUnit.Display)
               fFontSize = 100 * font.SizeInPoints / 72;
          else
               fFontSize = grfx.DpiX * font.SizeInPoints / 72;
   
          return fFontSize;
     }
}


Engrave

 

using System;
using System.Drawing;
using System.Windows.Forms;
   
class FontMenuForm: Form
{
     protected string strText = "Engrave";
     protected Font font = new Font("Times New Roman", 24);
   
     public static void Main()
     {
          Application.Run(new FontMenuForm());
     }
     public FontMenuForm()
     {
          ResizeRedraw = true;
     }
     protected void DoPage(Graphics grfx, Color clr, int cx, int cy)
     {
          int iOffset = -2;
          SizeF sizef = grfx.MeasureString(strText, font);
          float x     = (cx - sizef.Width) / 2;
          float y     = (cy - sizef.Height) / 2;
   
          grfx.Clear(Color.White);
          grfx.DrawString(strText, font, Brushes.Gray, x, y);
          grfx.DrawString(strText, font, Brushes.White, x - iOffset, 
                                                        y - iOffset);
                                            
     }
     public float GetAscent(Graphics grfx, Font font)
     {
          return font.GetHeight(grfx) * 
                    font.FontFamily.GetCellAscent(font.Style) /
                         font.FontFamily.GetLineSpacing(font.Style);
     }
     public float GetDescent(Graphics grfx, Font font)
     {
          return font.GetHeight(grfx) * 
                    font.FontFamily.GetCellDescent(font.Style) /
                         font.FontFamily.GetLineSpacing(font.Style);
     }
     public float PointsToPageUnits(Graphics grfx, Font font)
     {
          float fFontSize;
   
          if (grfx.PageUnit == GraphicsUnit.Display)
               fFontSize = 100 * font.SizeInPoints / 72;
          else
               fFontSize = grfx.DpiX * font.SizeInPoints / 72;
   
          return fFontSize;
     }
}


String Format based on Tab info data

  using System;
  using System.Drawing;
  using System.Drawing.Drawing2D;
  using System.Collections;
  using System.ruponentModel;
  using System.Windows.Forms;
  using System.Data;
  using System.Drawing.Imaging;
  public class Form1 : System.Windows.Forms.Form
  {
    public Form1()
    {
      InitializeComponent();
    }
    private void InitializeComponent()
    {
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
      this.ClientSize = new System.Drawing.Size(292, 273);
      this.Text = "";
      this.Resize += new System.EventHandler(this.Form1_Resize);
      this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
    }
    static void Main() 
    {
      Application.Run(new Form1());
    }
    private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
    {      
      Graphics g = e.Graphics;
      g.FillRectangle(Brushes.White, this.ClientRectangle);
      Font f = new Font("Courier New", 12);
      Font bf = new Font(f, FontStyle.Bold);
      StringFormat sf = new StringFormat();
      float[] ts = { 100.0f, 150.0f, 170.0f };
      sf.SetTabStops(0.0f, ts);
      string fs = "{0}\t{1,8}\t{2,10}\t{3,12}";
      string s1 = String.Format(fs, "Name", "Salary", "New Salary", "Difference");
      string s2 = String.Format(fs, "January", "900.00", "1050.00", "-150.00");
      string s3 = String.Format(fs, "February", "1100.00", "990.00", "110.00");
      // Draw the text strings 
      g.DrawString(s1, bf, Brushes.Black, 20, 20, sf);
      g.DrawString(s2, f, Brushes.Blue, 20, 20 + bf.Height, sf);
      g.DrawString(s3, f, Brushes.Blue, 20, 20 + bf.Height + f.Height, sf);
      f.Dispose();
      bf.Dispose();
    }
    private void Form1_Resize(object sender, System.EventArgs e)
    {
      Invalidate();
    }
  }


Tall in the Center

 
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
   
class FontMenuForm: Form
{
     protected string strText = "Tall in the Center";
     protected Font font = new Font("Times New Roman", 24);
   
     public static void Main()
     {
          Application.Run(new FontMenuForm());
     }
     public FontMenuForm()
     {
          ResizeRedraw = true;
     }
     protected void DoPage(Graphics grfx, Color clr, int cx, int cy)
     {
          GraphicsPath path = new GraphicsPath();
          float fFontSize = PointsToPageUnits(grfx, font);
   
          path.AddString(strText, font.FontFamily, (int) font.Style,
                         fFontSize, new PointF(0, 0), new StringFormat());
   
          RectangleF rectf = path.GetBounds();
   
          path.Transform(new Matrix(1, 0, 0, 1, 
                                    -(rectf.Left + rectf.Right) / 2,
                                    -(rectf.Top + rectf.Bottom) / 2));
          rectf = path.GetBounds();
          PointF[] aptf = path.PathPoints;
   
          for (int i = 0; i < aptf.Length; i++)
               aptf[i].Y *= 2 * (rectf.Width - Math.Abs(aptf[i].X)) / 
                                                                 rectf.Width; 
          path = new GraphicsPath(aptf, path.PathTypes);
   
          grfx.TranslateTransform(cx / 2, cy / 2);
          grfx.FillPath(new SolidBrush(clr), path);
                                            
     }
     public float GetAscent(Graphics grfx, Font font)
     {
          return font.GetHeight(grfx) * 
                    font.FontFamily.GetCellAscent(font.Style) /
                         font.FontFamily.GetLineSpacing(font.Style);
     }
     public float GetDescent(Graphics grfx, Font font)
     {
          return font.GetHeight(grfx) * 
                    font.FontFamily.GetCellDescent(font.Style) /
                         font.FontFamily.GetLineSpacing(font.Style);
     }
     public float PointsToPageUnits(Graphics grfx, Font font)
     {
          float fFontSize;
   
          if (grfx.PageUnit == GraphicsUnit.Display)
               fFontSize = 100 * font.SizeInPoints / 72;
          else
               fFontSize = grfx.DpiX * font.SizeInPoints / 72;
   
          return fFontSize;
     }
}


Text Format

/*
GDI+ Programming in C# and VB .NET
by Nick Symmonds
Publisher: Apress
ISBN: 159059035X
*/
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Text;
using System.Collections;
using System.ruponentModel;
using System.Windows.Forms;
using System.Data;
namespace TextFormat_c
{
  public class TextFormat : System.Windows.Forms.Form
  {
    #region Class Local Variables
    Rectangle UserRect      = Rectangle.Empty;
    bool RectStarted        = false;
    bool RectFinished       = false;
    bool Typing             = false;
    bool InsideRect         = false;
    Cursor ClientCursor     = Cursors.Default;
    string RectText         = string.Empty;
    StringFormat BoxFormat  = StringFormat.GenericDefault;
    #endregion
    private System.Windows.Forms.Button cmdNew;
    private System.Windows.Forms.Button cmdLeft;
    private System.Windows.Forms.Button cmdTop;
    private System.ruponentModel.Container components = null;
    public TextFormat()
    {
      InitializeComponent();
      //All the mouse move events use the same delegate
      this.cmdNew.MouseMove  += new MouseEventHandler(this.Button_MouseMove);
      this.cmdLeft.MouseMove += new MouseEventHandler(this.Button_MouseMove);
      this.cmdTop.MouseMove  += new MouseEventHandler(this.Button_MouseMove);
      this.KeyPress += new KeyPressEventHandler(this.FormKeyPress);
      BoxFormat.Alignment = StringAlignment.Center;
      BoxFormat.LineAlignment = StringAlignment.Center;
    }
    protected override void Dispose( bool disposing )
    {
      if( disposing )
      {
        if (components != null) 
        {
          components.Dispose();
        }
      }
      ClientCursor.Dispose();
      base.Dispose( disposing );
    }
        #region Windows Form Designer generated code
    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
      this.cmdNew = new System.Windows.Forms.Button();
      this.cmdLeft = new System.Windows.Forms.Button();
      this.cmdTop = new System.Windows.Forms.Button();
      this.SuspendLayout();
      // 
      // cmdNew
      // 
      this.cmdNew.Location = new System.Drawing.Point(16, 328);
      this.cmdNew.Name = "cmdNew";
      this.cmdNew.Size = new System.Drawing.Size(56, 24);
      this.cmdNew.TabIndex = 0;
      this.cmdNew.Text = "&New";
      this.cmdNew.Click += new System.EventHandler(this.cmdNew_Click);
      // 
      // cmdLeft
      // 
      this.cmdLeft.Location = new System.Drawing.Point(104, 328);
      this.cmdLeft.Name = "cmdLeft";
      this.cmdLeft.Size = new System.Drawing.Size(104, 24);
      this.cmdLeft.TabIndex = 1;
      this.cmdLeft.Text = "Center Left Align";
      this.cmdLeft.Click += new System.EventHandler(this.cmdLeft_Click);
      // 
      // cmdTop
      // 
      this.cmdTop.Location = new System.Drawing.Point(248, 328);
      this.cmdTop.Name = "cmdTop";
      this.cmdTop.Size = new System.Drawing.Size(104, 24);
      this.cmdTop.TabIndex = 2;
      this.cmdTop.Text = "Top Left Align";
      this.cmdTop.Click += new System.EventHandler(this.cmdTop_Click);
      // 
      // TextFormat
      // 
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
      this.ClientSize = new System.Drawing.Size(392, 373);
      this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                  this.cmdTop,
                                                                  this.cmdLeft,
                                                                  this.cmdNew});
      this.MaximizeBox = false;
      this.MinimizeBox = false;
      this.Name = "TextFormat";
      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
      this.Text = "TextFormat";
      this.Load += new System.EventHandler(this.TextFormat_Load);
      this.ResumeLayout(false);
    }
        #endregion
    [STAThread]
    static void Main() 
    {
      Application.Run(new TextFormat());
    }
    private void TextFormat_Load(object sender, System.EventArgs e)
    {
    }
    protected override void OnPaint(PaintEventArgs e)
    {
      Graphics G = e.Graphics;
      using(Pen P = new Pen(Brushes.Black, 1))
      {
        if ( !RectFinished )
          P.DashStyle = DashStyle.Dash;
        G.DrawRectangle(P,UserRect);
      }
      if (RectFinished && ClientCursor == Cursors.IBeam)
        G.DrawString(RectText, new Font("Arial", 16), Brushes.Black, 
                                                UserRect, BoxFormat);
      base.OnPaint(e);
    }
    protected override void OnMouseDown(MouseEventArgs e)
    {
      //If left button then start the rectangle
      if ( e.Button == MouseButtons.Left )
      {
        if (UserRect == Rectangle.Empty)
        {
          UserRect.X = e.X;
          UserRect.Y = e.Y;
          RectStarted = true;
          RectFinished = false;
        }
      }
      //If right button then start the edit
      else if ( e.Button == MouseButtons.Right )
      {
        if ( UserRect != Rectangle.Empty )
        {
          ClientCursor = Cursors.IBeam;
          this.Cursor  = ClientCursor;
          Point pos    = new Point(UserRect.X+UserRect.Width/2, 
                                   UserRect.Y+UserRect.Height/2);
          //Translate cursor screen postion to position on form
          int Offset = this.Height-this.ClientRectangle.Height;
          pos += new Size(this.Location.X, this.Location.Y+Offset);
          Cursor.Position = pos;
          Typing          = true;
          this.KeyPreview = true;
        }
      }
      base.OnMouseDown(e);
    }
    protected override void OnMouseUp(MouseEventArgs e)
    {
      base.OnMouseUp(e);
      // A negative rectangle is not allowed.
      // Mouse_down then Mouse_up without Mouse_move is not allowed
      if (UserRect.Width <= 0 || UserRect.Height <=0 )
         UserRect = Rectangle.Empty;
      //Rectangle has ended
      RectStarted = false;
      RectFinished = true;
      Invalidate();
    }
    protected override void OnMouseMove(MouseEventArgs e)
    {
      base.OnMove(e);
      //Let program know if cursor is inside user rectangle
      InsideRect = false;
      if (UserRect != Rectangle.Empty)
        if (UserRect.Contains(new Point(e.X, e.Y)))
          InsideRect = true;
      
      this.Cursor = ClientCursor;
      //Increase the size of the rectangle each time the mouse moves.
      if (RectStarted)
      {
        Size s = new Size(e.X-UserRect.X, e.Y-UserRect.Y);
        UserRect.Size=s;
        Invalidate();
      }
    }
    private void cmdNew_Click(object sender, System.EventArgs e)
    {
      if ( Typing && InsideRect )
        return;
      //Start a new blank form
      UserRect = Rectangle.Empty;
      ClientCursor = Cursors.Default;
      RectStarted = false;
      RectFinished = false;
      RectText = string.Empty;
      this.KeyPreview=false;
      Invalidate();
    }
    private void Button_MouseMove(object sender, MouseEventArgs e)
    {
      this.Cursor = Cursors.Default;
    }
    void FormKeyPress(object sender, KeyPressEventArgs e)
    {
      //Handle backspace key
      if (e.KeyChar == (char)8)
      {
        if ( RectText != string.Empty )
          RectText = RectText.Remove(RectText.Length-1, 1);
      }
      else
        RectText += e.KeyChar;
      
      Invalidate();
    }
    private void cmdLeft_Click(object sender, System.EventArgs e)
    {
      //Change horizontal alignement and redraw
      BoxFormat.Alignment = StringAlignment.Near;
      Invalidate();
    }
    private void cmdTop_Click(object sender, System.EventArgs e)
    {
      //Chnage vertical alignment and redraw
      BoxFormat.LineAlignment = StringAlignment.Near;
      Invalidate();
    }
  }
}


Text Rotate

/*
GDI+ Programming in C# and VB .NET
by Nick Symmonds
Publisher: Apress
ISBN: 159059035X
*/
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Drawing.Text;
using System.Collections;
using System.ruponentModel;
using System.Windows.Forms;
using System.Data;
namespace TextRotate_c
{
    public class TextRotate : System.Windows.Forms.Form
    {
    Bitmap bmp; 
    Point UL, UR, BL;
    Rectangle InvRect;
    int Direction = -1;
    String s = "ROTATING TEXT";
    Font fnt = new Font("Arial", 12);
    private System.Windows.Forms.VScrollBar Skew;
    private System.Windows.Forms.Timer T1;
    private System.ruponentModel.IContainer components;
        public TextRotate()
        {
            InitializeComponent();
      Skew.Minimum = 50;
      Skew.Maximum = 250;
      Skew.SmallChange = 1;
      Skew.LargeChange = 10;
      Skew.Value = 150;
      using (Graphics G = this.CreateGraphics())
      {
        SizeF sz = G.MeasureString(s, fnt);
        bmp = new  Bitmap((int)sz.Width, (int)sz.Height);
      }
      for ( int k=0; k<bmp.Height; k++ )
      {
        for ( int j=0; j<bmp.Width; j++ )
          bmp.SetPixel(j, k, Color.White);
      }
      bmp.MakeTransparent(Color.White);
      UL = new Point(150, 150);
      UR = new Point(UL.X+bmp.Width, Skew.Value);
      BL = new Point(150, UL.Y+bmp.Height);
      InvRect = new  Rectangle(-UR.X, Skew.Minimum, 2*UR.X, Skew.Maximum);
      using (Graphics G = Graphics.FromImage(bmp))
      {
        G.SmoothingMode = SmoothingMode.AntiAlias;
        G.TextRenderingHint = TextRenderingHint.AntiAlias;
        G.DrawString(s, fnt, Brushes.Black, 0, 0);
      }
      this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
      this.SetStyle(ControlStyles.DoubleBuffer, true);
      T1.Interval=10; //milliseconds
      T1.Enabled=false;
        }
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null) 
                {
                    components.Dispose();
                }
            }
      bmp.Dispose();
      fnt.Dispose();
            base.Dispose( disposing );
        }
        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
      this.ruponents = new System.ruponentModel.Container();
      this.Skew = new System.Windows.Forms.VScrollBar();
      this.T1 = new System.Windows.Forms.Timer(this.ruponents);
      this.SuspendLayout();
      // 
      // Skew
      // 
      this.Skew.Location = new System.Drawing.Point(352, 54);
      this.Skew.Name = "Skew";
      this.Skew.Size = new System.Drawing.Size(16, 264);
      this.Skew.TabIndex = 1;
      this.Skew.Scroll += new System.Windows.Forms.ScrollEventHandler(this.Skew_Scroll);
      // 
      // T1
      // 
      this.T1.Tick += new System.EventHandler(this.T1_Tick);
      // 
      // TextRotate
      // 
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
      this.ClientSize = new System.Drawing.Size(392, 373);
      this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                  this.Skew});
      this.MaximizeBox = false;
      this.MinimizeBox = false;
      this.Name = "TextRotate";
      this.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
      this.Text = "TextRotate";
      this.Load += new System.EventHandler(this.TextRotate_Load);
      this.ResumeLayout(false);
    }
        #endregion
        [STAThread]
        static void Main() 
        {
            Application.Run(new TextRotate());
        }
    private void TextRotate_Load(object sender, System.EventArgs e)
    {
    }
    protected override void OnPaint(PaintEventArgs e)
    {
      Point[] dest = {UL, UR, BL};
      // Draw the image mapped to the parallelogram.
      e.Graphics.DrawImage(bmp, dest);
      e.Graphics.DrawLine(Pens.Black, UL, BL+new Size(0, 20));
      if (T1.Enabled==false)
        T1.Enabled=true;
    }
    private void Skew_Scroll(object sender, 
                             System.Windows.Forms.ScrollEventArgs e)
    {
      UR.Y = Skew.Value;
    }
    private void T1_Tick(object sender, System.EventArgs e)
    {
      UR.X += Direction;
      if ( UR.X == UL.X + bmp.Width*Direction )
        Direction *=-1;
      Invalidate(InvRect);
    }
    }
}


Text Rotate 2

/*
Professional Windows GUI Programming Using C#
by Jay Glynn, Csaba Torok, Richard Conway, Wahid Choudhury, 
   Zach Greenvoss, Shripad Kulkarni, Neil Whitlow
Publisher: Peer Information
ISBN: 1861007663
*/
using System;
using System.Drawing;
using System.Collections;
using System.ruponentModel;
using System.Windows.Forms;
using System.Data;
using System.Drawing.Drawing2D;
namespace Altamira
{
    /// <summary>
    /// Summary description for Altamira.
    /// </summary>
    public class Altamira : System.Windows.Forms.Form
    {
        /// <summary>
        /// Required designer variable.
        /// </summary>
        private System.ruponentModel.Container components = null;
        public Altamira()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();
            this.Text = "Text direction";
            //
            // TODO: Add any constructor code after InitializeComponent call
            //
        }
        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null) 
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }
        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
            // 
            // Altamira
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(224, 141);
            this.Name = "Altamira";
            this.Text = "Altamira";
        }
        #endregion
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main() 
        {
            Application.Run(new Altamira());
        }
        protected override void OnPaint(PaintEventArgs e)
        {
            Graphics g = CreateGraphics();          
            string txt = "HELLO";
            float alpha = 45.0f;
            int fontSize = 24;
            Point center = new Point(90,20);
            // Vertical text:
            FontFamily ff = new FontFamily("Times New Roman");
            Font f = new Font(ff, fontSize, FontStyle.Regular);
            StringFormat sf = new StringFormat();
            sf.FormatFlags = StringFormatFlags.DirectionVertical;
            g.DrawString(txt, f, new SolidBrush(Color.Blue), center, sf);
            // Global shift of the origin:
            g.TranslateTransform(center.X, center.Y);  // X + fontSize/2
            g.DrawEllipse(Pens.Magenta, new Rectangle(0,0, 1, 1));  // center
            // Local rotation of vertcal text (sf):
            GraphicsPath gp = new GraphicsPath();
            gp.AddString(txt, ff, (int)FontStyle.Bold, fontSize + 4, 
                new Point(0, 0), sf);
            Matrix m = new Matrix();
            m.Rotate(alpha);  // clockwise
            gp.Transform(m);
            g.DrawPath(Pens.Red, gp);  //g.FillPath(Brushes.Black, gp);
            // Global rotation of vertical text (sf):
            g.RotateTransform(-alpha);  // anticlockwise
            g.DrawString(txt, f, new SolidBrush(Color.Black), 0, 0, sf);
            gp.Dispose();  g.Dispose();  m.Dispose();
        }
    }
}


Text string"s containing rectangle

  using System;
  using System.Drawing;
  using System.Drawing.Drawing2D;
  using System.Collections;
  using System.ruponentModel;
  using System.Windows.Forms;
  using System.Data;
  using System.Drawing.Imaging;
  public class Form1 : System.Windows.Forms.Form
  {
    public Form1()
    {
      InitializeComponent();
    }
    private void InitializeComponent()
    {
      this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
      this.ClientSize = new System.Drawing.Size(292, 273);
      this.Text = "";
      this.Resize += new System.EventHandler(this.Form1_Resize);
      this.Paint += new System.Windows.Forms.PaintEventHandler(this.Form1_Paint);
    }
    static void Main() 
    {
      Application.Run(new Form1());
    }
    private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
    {      
      Graphics g = e.Graphics;
      g.FillRectangle(Brushes.White, this.ClientRectangle);
      String s = "Accrington Stanley";
      StringFormat sf = new StringFormat(StringFormatFlags.DirectionVertical);
      Font f = new Font("Times New Roman", 14);
      SizeF sizef = g.MeasureString(s, f, Int32.MaxValue, sf);
      RectangleF rf = new RectangleF(20, 20, sizef.Width, sizef.Height);
      g.DrawRectangle(Pens.Black, rf.Left, rf.Top, rf.Width, rf.Height);
      g.DrawString(s, f, Brushes.Black, rf, sf);
      f.Dispose();
    }
    private void Form1_Resize(object sender, System.EventArgs e)
    {
      Invalidate();
    }
  }