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.ComponentModel;
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.ComponentModel.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.components = new System.ComponentModel.Container();
this.Skew = new System.Windows.Forms.VScrollBar();
this.T1 = new System.Windows.Forms.Timer(this.components);
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);
}
}
}
Related examples in the same category