using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Globalization;
namespace Elements
{
/// <summary>
/// A custom windows control to display text vertically
/// </summary>
[ToolboxBitmap(typeof(VerticalLabel), "VerticalLabel.ico")]
public class VerticalLabel : Control
{
private DrawMode drawMode = DrawMode.BottomUp;
private bool transparent = false;
private bool autoSize = true;
private AnchorStyles anchor = AnchorStyles.Top | AnchorStyles.Left;
private DockStyle dock = DockStyle.None;
private System.ComponentModel.Container components = new System.ComponentModel.Container();
public VerticalLabel()
{
CreateControl();
AutoSize = true;
SetStyle(System.Windows.Forms.ControlStyles.Opaque, true);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (!((components == null)))
{
components.Dispose();
}
}
base.Dispose(disposing);
}
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
{
float labelControlWidth;
float labelControlHeight;
float labelTransformX;
float labelTransformY;
Color controlBackColor = BackColor;
Pen labelBorderPen;
SolidBrush labelBackColorBrush;
if (transparent)
{
labelBorderPen = new Pen(Color.Empty, 0);
labelBackColorBrush = new SolidBrush(Color.Empty);
}
else
{
labelBorderPen = new Pen(controlBackColor, 0);
labelBackColorBrush = new SolidBrush(controlBackColor);
}
SolidBrush labelForeColorBrush = new SolidBrush(base.ForeColor);
base.OnPaint(e);
labelControlWidth = this.Size.Width;
labelControlHeight = this.Size.Height;
e.Graphics.DrawRectangle(labelBorderPen, 0, 0, labelControlWidth, labelControlHeight);
e.Graphics.FillRectangle(labelBackColorBrush, 0, 0, labelControlWidth, labelControlHeight);
e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
if (this.TextDrawMode == DrawMode.BottomUp)
{
labelTransformX = 0;
labelTransformY = labelControlHeight;
e.Graphics.TranslateTransform(labelTransformX, labelTransformY);
e.Graphics.RotateTransform(270);
e.Graphics.DrawString(base.Text, Font, labelForeColorBrush, this.Margin.Top, this.Margin.Left);
}
else
{
labelTransformX = labelControlWidth;
labelTransformY = labelControlHeight;
e.Graphics.TranslateTransform(labelControlWidth, 0);
e.Graphics.RotateTransform(90);
e.Graphics.DrawString(base.Text, Font, labelForeColorBrush, this.Margin.Bottom, this.Margin.Right);
}
}
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x20;
return cp;
}
}
public override string Text
{
get { return base.Text; }
set
{
base.Text = value;
Invalidate();
}
}
public DrawMode TextDrawMode
{
get { return drawMode; }
set { drawMode = value; }
}
public bool TransparentBackground
{
get { return transparent; }
set { transparent = value; }
}
public override bool AutoSize
{
get { return autoSize; }
set
{
base.AutoSize = value;
autoSize = value;
VerticalLabel_Resize(null, null);
}
}
private void VerticalLabel_Resize(object sender, System.EventArgs e)
{
if (autoSize)
{
Graphics g = this.CreateGraphics();
Size textLength = g.MeasureString(this.Text, this.Font).ToSize();
Height = this.Margin.Top + textLength.Width + this.Margin.Bottom;
Width = this.Margin.Left + textLength.Height + this.Margin.Right;
}
}
protected override void OnTextChanged(EventArgs e)
{
VerticalLabel_Resize(null, null);
}
protected override void OnFontChanged(EventArgs e)
{
VerticalLabel_Resize(null, null);
}
protected override void OnAutoSizeChanged(EventArgs e)
{
VerticalLabel_Resize(null, null);
}
public override AnchorStyles Anchor
{
get { return anchor; }
set { base.Anchor = value; anchor = value; }
}
public override DockStyle Dock
{
get { return dock; }
set { base.Dock = value; dock = value; }
}
}
public enum DrawMode
{
BottomUp = 1,
TopDown
}
}
|