从事.net工作,拉拉杂杂算在一起,将近5年了,在各种技术群中,总是被问及“想要自定义控件,应该怎么做?”,“想要重绘控件,有什么入门教程没有”一类的问题,虽然很无奈,但是目前我确实没有看到过,最近在做一个ActiveX的同时,也在做一套控件美化,趁现在还没有忘了,把重绘控件的一些新的和方法与大家分享一下。
首先给大家展示一下系统的类图:
任何一个Windows窗体(这里所说的窗体包括控件,在Windows中,会把Button也识别为一个窗体,和Form略有区别的就是ClassStyle和ClassStyleEx略有区别)想要如何显示,是需要通过绘制来显示出来的,先来做一个基础类,这样各种控件在这个基础上生成。
今天先做ControlBase类,该类功能如下:文本内容的绘制,字符串的对齐,自定义绘制方法。
/*************************************************************************************
* CLR版本: 2.0
* 类 名 称: Button
* 机器名称: Bluefire-PC
* 命名空间: Com.Bluefire.ControlCollection.Common.Util
* 文 件 名: ControlBase
* 创建时间: 2012年4月5日
* 作 者: Bluefire
* 说 明: 控件基础
* 修改时间:
* 修 改 人:
*************************************************************************************/
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using Com.Bluefire.ControlCollection.Common.Properties;
using System.Drawing.Drawing2D;
using Com.Bluefire.ControlCollection.Common.Win32Helper;
namespace Com.Bluefire.ControlCollection.Common.Util
{
public partial class ControlBase : Control
{
#region Event Load
private event EventHandler m_Load;
[Browsable(true),
EditorBrowsable(EditorBrowsableState.Always),
Category("BluefireEvent"),
Description("控件显示之前")]
/// <summary>
/// 控件文本对齐方式改变
/// </summary>
public event EventHandler Load
{
add
{
m_Load += value;
}
remove
{
m_Load -= value;
}
}
protected virtual void OnLoad(EventArgs e)
{
EventHandler temp = m_Load;
if (temp != null)
{
temp(this, e);
}
}
#endregion
#region Event TextAlignChanged
protected virtual Boolean m_PaintText { get; set; }
private event EventHandler m_TextAlignChanged;
[Browsable(true),
EditorBrowsable(EditorBrowsableState.Always),
Category("BluefireEvent"),
Description("控件文本对齐方式改变")]
/// <summary>
/// 控件文本对齐方式改变
/// </summary>
public event EventHandler TextAlignChanged
{
add
{
m_TextAlignChanged += value;
}
remove
{
m_TextAlignChanged -= value;
}
}
protected virtual void OnTextAlignChanged(EventArgs e)
{
EventHandler temp = m_TextAlignChanged;
if (temp != null)
{
temp(this, e);
}
}
#endregion
#region TextAlign
private ContentAlignment m_TextAlign = ContentAlignment.MiddleCenter;
[
DefaultValue(typeof(ContentAlignment), "MiddleCenter"),
Browsable(true),
EditorBrowsable(EditorBrowsableState.Always),
Category("BluefireStyle"),
Description("控件文本对齐方式")
]
/// <summary>
/// 控件文本对齐方式
/// </summary>
public virtual ContentAlignment TextAlign
{
get
{
return m_TextAlign;
}
set
{
if (value != m_TextAlign)
{
m_TextAlign = value;
Refresh();
OnTextAlignChanged(EventArgs.Empty);
}
}
}
#endregion
#region Text
private string m_Text;
[
DefaultValue(null),
Browsable(true),
EditorBrowsable(EditorBrowsableState.Always),
Category("BluefireStyle"),
Description("文本内容")
]
/// <summary>
/// 控件文本
/// </summary>
public override string Text
{
get
{
return m_Text;
}
set
{
if (value != m_Text)
{
m_Text = value;
Refresh();
base.OnTextChanged(EventArgs.Empty);
}
}
}
#endregion
#region ColorGradientDirection
private LinearGradientMode m_ColorGradientDirection = LinearGradientMode.Vertical;
[
DefaultValue(typeof(LinearGradientMode), "Vertical"),
Browsable(true),
EditorBrowsable(EditorBrowsableState.Always),
Category("BluefireStyle"),
Description("颜色渐变方向")
]
/// <summary>
/// 颜色渐变方向
/// </summary>
public virtual LinearGradientMode ColorGradientDirection
{
get
{
return m_ColorGradientDirection;
}
set
{
m_ColorGradientDirection = value;
this.Refresh();
}
}
#endregion
#region LightColor
private Color m_LightColor = StyleManager.BaseLightColor;
[
DefaultValue(typeof(Color), "110, 255, 255, 255"),
Browsable(true),
EditorBrowsable(EditorBrowsableState.Always),
Category("BluefireStyle"),
Description("浅色区颜色"),
RefreshProperties(System.ComponentModel.RefreshProperties.Repaint)
]
/// <summary>
///浅色区颜色
/// </summary>
public virtual Color LightColor
{
get
{
return m_LightColor;
}
set
{
if (SystemManagedColor)
{
throw new ArgumentException("operation is prohibited");
}
else
{
m_LightColor = value;
Refresh();
}
}
}
#endregion
#region DarkColor
private Color m_DarkColor = StyleManager.BaseColor;
[
DefaultValue(typeof(Color), "200, 0, 191, 255"),
Browsable(true),
EditorBrowsable(EditorBrowsableState.Always),
Category("BluefireStyle"),
Description("浅色区颜色")
]
/// <summary>
///浅色区颜色
/// </summary>
public virtual Color DarkColor
{
get
{
return m_DarkColor;
}
set
{
if (SystemManagedColor)
{
throw new ArgumentException("operation is prohibited");
}
else
{
m_DarkColor = value;
Refresh();
}
}
}
#endregion
#region DarkColor
private IntPtr m_ParentHandle = IntPtr.Zero;
[
Browsable(false),
EditorBrowsable(EditorBrowsableState.Never),
Category("BluefireStyle"),
Description("父容器句柄")
]
/// <summary>
///父容器句柄
/// </summary>
public virtual IntPtr ParentHandle
{
get
{
return m_ParentHandle;
}
}
#endregion
#region ControlDirection
private ControlDirection m_ControlDirection = ControlDirection.Horizontal;
[DefaultValue(typeof(ControlDirection), "Horizontal"),
Browsable(true),
EditorBrowsable(EditorBrowsableState.Always),
Category("BluefireStyle"),
Description("最大值"),
RefreshProperties(System.ComponentModel.RefreshProperties.Repaint)]
/// <summary>
///最大值
/// </summary>
public virtual ControlDirection ControlDirection
{
get
{
return m_ControlDirection;
}
set
{
if (value != m_ControlDirection)
{
m_ControlDirection = value;
Refresh();
}
}
}
#endregion
#region DisLightColor
private Color m_DisLightColor = StyleManager.DisableBaseLightColor;
[DefaultValue(typeof(Color), "110, 255, 255, 255"),
Browsable(true),
EditorBrowsable(EditorBrowsableState.Always),
Category("BluefireStyle"),
Description("禁用时浅色区颜色"),
RefreshProperties(System.ComponentModel.RefreshProperties.Repaint)]
/// <summary>
///禁用时浅色区颜色
/// </summary>
public virtual Color DisLightColor
{
get
{
return m_DisLightColor;
}
set
{
if (SystemManagedColor)
{
throw new ArgumentException("operation is prohibited");
}
else
{
m_DisLightColor = value;
Refresh();
}
}
}
#endregion
#region DisDarkColor
private Color m_DisDarkColor = StyleManager.DisableBaseColor;
[DefaultValue(typeof(Color), "200, 180, 180, 180"),
Browsable(true),
EditorBrowsable(EditorBrowsableState.Always),
Category("BluefireStyle"),
Description("禁用时深色区颜色"),
RefreshProperties(System.ComponentModel.RefreshProperties.Repaint)]
/// <summary>
///禁用时深色区颜色
/// </summary>
public virtual Color DisDarkColor
{
get
{
return m_DisDarkColor;
}
set
{
if (SystemManagedColor)
{
throw new ArgumentException("operation is prohibited");
}
else
{
m_DisDarkColor = value;
Refresh();
}
}
}
#endregion
#region SystemManagedColor
private Boolean m_SystemManagerColor = true;
[DefaultValue(true),
Browsable(true),
EditorBrowsable(EditorBrowsableState.Always),
Category("BluefireStyle"),
Description("是否让系统管理颜色")]
/// <summary>
/// 是否让系统管理颜色
/// </summary>
public virtual Boolean SystemManagedColor
{
get
{
return m_SystemManagerColor;
}
set
{
if (value != m_SystemManagerColor)
{
m_SystemManagerColor = value;
if (value)
{
ReSetColor();
}
this.Refresh();
}
}
}
#endregion
#region Enable
[Browsable(false),
EditorBrowsable(EditorBrowsableState.Never)]
/// <summary>
///是否禁用
/// </summary>
public new bool Enabled
{
get
{
return Enable;
}
set
{
Enable = value;
}
}
private Boolean m_Enabled = true;
[
DefaultValue(true),
Browsable(true),
EditorBrowsable(EditorBrowsableState.Always),
Category("BluefireStyle"),
Description("是否禁用")
]
/// <summary>
///是否禁用
/// </summary>
public virtual Boolean Enable
{
get
{
return m_Enabled;
}
set
{
if (value != m_Enabled)
{
m_Enabled = value;
Refresh();
OnEnabledChanged(EventArgs.Empty);
Enabled = value;
}
}
}
#endregion
#region Region
/// <summary>
/// 边框类型
/// </summary>
[DefaultValue(typeof(RegionSizeType), "NONE"),
Browsable(false),
EditorBrowsable(EditorBrowsableState.Never),
Category("BluefireStyle"),
Description("边框形状")]
public virtual RegionSizeType SizeType
{
get
{
return this.manager.SizeType;
}
set
{
this.manager.SizeType = value;
}
}
/// <summary>
/// ↖大小
/// </summary>
[DefaultValue(0),
Browsable(false),
EditorBrowsable(EditorBrowsableState.Never),
Category("BluefireStyle"),
Description("↖大小")]
public virtual int LeftTopRadius
{
get
{
return this.manager.LeftTopRadius;
}
set
{
this.manager.LeftTopRadius = value;
}
}
/// <summary>
/// ↙大小
/// </summary>
[DefaultValue(0),
Browsable(false),
EditorBrowsable(EditorBrowsableState.Never),
Category("BluefireStyle"),
Description("↙大小")]
public virtual int LeftButtomRadius
{
get
{
return this.manager.LeftButtomRadius;
}
set
{
this.manager.LeftButtomRadius = value;
}
}
/// <summary>
/// ↗大小
/// </summary>
[DefaultValue(0),
Browsable(false),
EditorBrowsable(EditorBrowsableState.Never),
Category("BluefireStyle"),
Description("↗大小")]
public virtual int RightTopRadius
{
get
{
return this.manager.RightTopRadius;
}
set
{
this.manager.RightTopRadius = value;
}
}
/// <summary>
/// ↘大小
/// </summary>
[DefaultValue(0),
Browsable(false),
EditorBrowsable(EditorBrowsableState.Never),
Category("BluefireStyle"),
Description("↘大小")]
public virtual int RightButtomRadius
{
get
{
return this.manager.RightButtomRadius;
}
set
{
this.manager.RightButtomRadius = value;
}
}
#endregion
public ControlBase()
{
InitializeComponent();
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw |
ControlStyles.UserPaint, true);
this.DoubleBuffered = true;
this.ResizeRedraw = true;
this.SetStyle(ControlStyles.StandardClick | ControlStyles.StandardDoubleClick | ControlStyles.Selectable, false);
m_PaintText = true;
}
#region 自定义方法
protected virtual Boolean ReSetColor()
{
if (DesignMode)
{
if (MessageBox.Show(Resources.sys_ResetColor, Resources.sys_Caption, MessageBoxButtons.YesNo) == DialogResult.No)
{
return false;
}
}
m_LightColor = StyleManager.BaseLightColor;
m_DarkColor = StyleManager.BaseColor;
m_DisLightColor = StyleManager.DisableBaseLightColor;
m_DisDarkColor = StyleManager.DisableBaseColor;
return true;
}
protected virtual void PaintRectangle(Graphics graphic, Color basecolor, Color baselightcolor)
{
graphic.SmoothingMode = SmoothingMode.HighQuality;
graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
switch (m_ColorGradientDirection)
{
case LinearGradientMode.BackwardDiagonal:
{
LinearGradientBrush brushtop = new LinearGradientBrush(this.ClientRectangle,
baselightcolor, basecolor, LinearGradientMode.BackwardDiagonal);
graphic.FillRectangle(brushtop, this.ClientRectangle);
}
break;
case LinearGradientMode.ForwardDiagonal:
{
LinearGradientBrush brushtop = new LinearGradientBrush(this.ClientRectangle,
baselightcolor, basecolor, LinearGradientMode.ForwardDiagonal);
graphic.FillRectangle(brushtop, this.ClientRectangle);
}
break;
case LinearGradientMode.Horizontal:
{
int leftwidth = this.Width / 2;
int rightwidth = this.Width - leftwidth;
Rectangle rectleft = new Rectangle(0, 0, leftwidth,
this.Height);
Rectangle rectright = new Rectangle(leftwidth, 0,
rightwidth, Height);
LinearGradientBrush brushleft = new LinearGradientBrush(rectleft,
baselightcolor, basecolor, LinearGradientMode.Horizontal);
LinearGradientBrush brushrigth = new LinearGradientBrush(rectright,
basecolor, baselightcolor, LinearGradientMode.Horizontal);
graphic.FillRectangle(brushrigth, rectright);
graphic.FillRectangle(brushleft, rectleft);
}
break;
case LinearGradientMode.Vertical:
{
int topheight = this.Height / 2;
int buttomheight = this.Height - topheight;
Rectangle recttop = new Rectangle(0, 0, this.Width,
topheight);
Rectangle rectbuttom = new Rectangle(0, topheight,
this.Width, buttomheight);
LinearGradientBrush brushtop = new LinearGradientBrush(recttop, baselightcolor, basecolor, LinearGradientMode.Vertical);
LinearGradientBrush brushbuttom = new LinearGradientBrush(rectbuttom, basecolor, baselightcolor, LinearGradientMode.Vertical);
graphic.FillRectangle(brushbuttom, rectbuttom);
graphic.FillRectangle(brushtop, recttop);
}
break;
}
}
protected virtual void PaintRectangle(Graphics graphic, Color basecolor, Color baselightcolor, Rectangle rect)
{
if (rect.Width == 0 || rect.Height == 0)
{
return;
}
graphic.SmoothingMode = SmoothingMode.HighQuality;
graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
switch (m_ColorGradientDirection)
{
case LinearGradientMode.BackwardDiagonal:
{
LinearGradientBrush brushtop = new LinearGradientBrush(rect,
baselightcolor, basecolor, LinearGradientMode.BackwardDiagonal);
graphic.FillRectangle(brushtop, rect);
}
break;
case LinearGradientMode.ForwardDiagonal:
{
LinearGradientBrush brushtop = new LinearGradientBrush(rect,
baselightcolor, basecolor, LinearGradientMode.ForwardDiagonal);
graphic.FillRectangle(brushtop, rect);
}
break;
case LinearGradientMode.Horizontal:
{
float leftwidth = rect.Width / 2;
float rightwidth = rect.Width - leftwidth;
RectangleF rectleft = new RectangleF(rect.X, rect.Y, leftwidth,
rect.Height);
RectangleF rectright = new RectangleF(leftwidth, rect.Y,
rightwidth, rect.Height);
LinearGradientBrush brushleft = new LinearGradientBrush(rectleft,
baselightcolor, basecolor, LinearGradientMode.Horizontal);
LinearGradientBrush brushrigth = new LinearGradientBrush(rectright,
basecolor, baselightcolor, LinearGradientMode.Horizontal);
graphic.FillRectangle(brushrigth, rectright);
graphic.FillRectangle(brushleft, rectleft);
}
break;
case LinearGradientMode.Vertical:
{
float topheight = rect.Height / 2;
float buttomheight = rect.Height - topheight;
RectangleF recttop = new RectangleF(rect.X, rect.Y, rect.Width,
topheight);
RectangleF rectbuttom = new RectangleF(rect.X, rect.Y + topheight,
rect.Width, buttomheight);
LinearGradientBrush brushtop = new LinearGradientBrush(recttop, baselightcolor, basecolor, LinearGradientMode.Vertical);
LinearGradientBrush brushbuttom = new LinearGradientBrush(rectbuttom, basecolor, baselightcolor, LinearGradientMode.Vertical);
graphic.FillRectangle(brushbuttom, rectbuttom);
graphic.FillRectangle(brushtop, recttop);
}
break;
}
}
protected virtual void PaintRectangle(Graphics graphic, Color basecolor, Color baselightcolor, Rectangle rect, LinearGradientMode mode)
{
if (rect.Width == 0 || rect.Height == 0)
{
return;
}
graphic.SmoothingMode = SmoothingMode.HighQuality;
graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
switch (mode)
{
case LinearGradientMode.BackwardDiagonal:
{
LinearGradientBrush brushtop = new LinearGradientBrush(rect,
baselightcolor, basecolor, LinearGradientMode.BackwardDiagonal);
graphic.FillRectangle(brushtop, rect);
}
break;
case LinearGradientMode.ForwardDiagonal:
{
LinearGradientBrush brushtop = new LinearGradientBrush(rect,
baselightcolor, basecolor, LinearGradientMode.ForwardDiagonal);
graphic.FillRectangle(brushtop, rect);
}
break;
case LinearGradientMode.Horizontal:
{
float leftwidth = rect.Width / 2;
float rightwidth = rect.Width - leftwidth;
RectangleF rectleft = new RectangleF(rect.X, rect.Y, leftwidth,
rect.Height);
RectangleF rectright = new RectangleF(leftwidth, rect.Y,
rightwidth, rect.Height);
LinearGradientBrush brushleft = new LinearGradientBrush(rectleft,
baselightcolor, basecolor, LinearGradientMode.Horizontal);
LinearGradientBrush brushrigth = new LinearGradientBrush(rectright,
basecolor, baselightcolor, LinearGradientMode.Horizontal);
graphic.FillRectangle(brushrigth, rectright);
graphic.FillRectangle(brushleft, rectleft);
}
break;
case LinearGradientMode.Vertical:
{
float topheight = rect.Height / 2;
float buttomheight = rect.Height - topheight;
RectangleF recttop = new RectangleF(rect.X, rect.Y, rect.Width,
topheight);
RectangleF rectbuttom = new RectangleF(rect.X, rect.Y + topheight,
rect.Width, buttomheight);
LinearGradientBrush brushtop = new LinearGradientBrush(recttop, baselightcolor, basecolor, LinearGradientMode.Vertical);
LinearGradientBrush brushbuttom = new LinearGradientBrush(rectbuttom, basecolor, baselightcolor, LinearGradientMode.Vertical);
graphic.FillRectangle(brushbuttom, rectbuttom);
graphic.FillRectangle(brushtop, recttop);
}
break;
}
}
protected virtual void PaintRectangle(Graphics graphic, Color basecolor, Color baselightcolor, RectangleF rect, LinearGradientMode mode)
{
if (rect.Width == 0 || rect.Height == 0)
{
return;
}
graphic.SmoothingMode = SmoothingMode.HighQuality;
graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
switch (mode)
{
case LinearGradientMode.BackwardDiagonal:
{
LinearGradientBrush brushtop = new LinearGradientBrush(rect,
baselightcolor, basecolor, LinearGradientMode.BackwardDiagonal);
graphic.FillRectangle(brushtop, rect);
}
break;
case LinearGradientMode.ForwardDiagonal:
{
LinearGradientBrush brushtop = new LinearGradientBrush(rect,
baselightcolor, basecolor, LinearGradientMode.ForwardDiagonal);
graphic.FillRectangle(brushtop, rect);
}
break;
case LinearGradientMode.Horizontal:
{
float leftwidth = rect.Width / 2;
float rightwidth = rect.Width - leftwidth;
RectangleF rectleft = new RectangleF(rect.X, rect.Y, leftwidth,
rect.Height);
RectangleF rectright = new RectangleF(leftwidth, rect.Y,
rightwidth, rect.Height);
LinearGradientBrush brushleft = new LinearGradientBrush(rectleft,
baselightcolor, basecolor, LinearGradientMode.Horizontal);
LinearGradientBrush brushrigth = new LinearGradientBrush(rectright,
basecolor, baselightcolor, LinearGradientMode.Horizontal);
graphic.FillRectangle(brushrigth, rectright);
graphic.FillRectangle(brushleft, rectleft);
}
break;
case LinearGradientMode.Vertical:
{
float topheight = rect.Height / 2;
float buttomheight = rect.Height - topheight;
RectangleF recttop = new RectangleF(rect.X, rect.Y, rect.Width,
topheight);
RectangleF rectbuttom = new RectangleF(rect.X, rect.Y + topheight,
rect.Width, buttomheight);
LinearGradientBrush brushtop = new LinearGradientBrush(recttop, baselightcolor, basecolor, LinearGradientMode.Vertical);
LinearGradientBrush brushbuttom = new LinearGradientBrush(rectbuttom, basecolor, baselightcolor, LinearGradientMode.Vertical);
graphic.FillRectangle(brushbuttom, rectbuttom);
graphic.FillRectangle(brushtop, recttop);
}
break;
}
}
protected virtual void PaintText(Graphics graphic)
{
#region Text
if (!m_PaintText)
{
return;
}
SizeF size = graphic.MeasureString(this.Text, this.Font);
PointF location = new PointF(this.Width / 2.0F - size.Width / 2.0F, this.Height / 2.0F - size.Height / 2.0F);
switch (m_TextAlign)
{
case ContentAlignment.BottomCenter:
location = new PointF(this.Width / 2.0F - size.Width / 2.0F, this.Height - size.Height - 3);
break;
case ContentAlignment.BottomLeft:
location = new PointF(3, this.Height - size.Height - 3);
break;
case ContentAlignment.BottomRight:
location = new PointF(this.Width - size.Width, this.Height - size.Height - 3);
break;
case ContentAlignment.MiddleCenter:
location = new PointF(this.Width / 2.0F - size.Width / 2.0F, this.Height / 2.0F - size.Height / 2.0F);
break;
case ContentAlignment.MiddleLeft:
location = new PointF(3, this.Height / 2.0F - size.Height / 2.0F);
break;
case ContentAlignment.MiddleRight:
location = new PointF(this.Width - size.Width - 3, this.Height / 2.0F - size.Height / 2.0F);
break;
case ContentAlignment.TopCenter:
location = new PointF(this.Width / 2.0F - size.Width / 2.0F, 3);
break;
case ContentAlignment.TopLeft:
location = new PointF(3, 3);
break;
case ContentAlignment.TopRight:
location = new PointF(this.Width - size.Width - 3, 3);
break;
default:
break;
}
graphic.DrawString(this.Text, Font, new SolidBrush(this.ForeColor), location);
#endregion
}
protected virtual void PaintText(Graphics graphic, string text)
{
#region Text
if (!m_PaintText)
{
return;
}
SizeF size = graphic.MeasureString(text, this.Font);
PointF location = new PointF(this.Width / 2.0F - size.Width / 2.0F, this.Height / 2.0F - size.Height / 2.0F);
switch (m_TextAlign)
{
case ContentAlignment.BottomCenter:
location = new PointF(this.Width / 2.0F - size.Width / 2.0F, this.Height - size.Height - 3);
break;
case ContentAlignment.BottomLeft:
location = new PointF(3, this.Height - size.Height - 3);
break;
case ContentAlignment.BottomRight:
location = new PointF(this.Width - size.Width, this.Height - size.Height - 3);
break;
case ContentAlignment.MiddleCenter:
location = new PointF(this.Width / 2.0F - size.Width / 2.0F, this.Height / 2.0F - size.Height / 2.0F);
break;
case ContentAlignment.MiddleLeft:
location = new PointF(3, this.Height / 2.0F - size.Height / 2.0F);
break;
case ContentAlignment.MiddleRight:
location = new PointF(this.Width - size.Width - 3, this.Height / 2.0F - size.Height / 2.0F);
break;
case ContentAlignment.TopCenter:
location = new PointF(this.Width / 2.0F - size.Width / 2.0F, 3);
break;
case ContentAlignment.TopLeft:
location = new PointF(3, 3);
break;
case ContentAlignment.TopRight:
location = new PointF(this.Width - size.Width - 3, 3);
break;
default:
break;
}
graphic.DrawString(text, Font, new SolidBrush(this.ForeColor), location);
#endregion
}
protected virtual void PaintBackGround(Graphics g)
{
PaintRectangle(g, Color.FromArgb(110, Color.LightGray), Color.FromArgb(200, Color.White));
if (m_Enabled)
{
PaintRectangle(g, DarkColor, LightColor);
}
else
{
PaintRectangle(g, DisDarkColor, DisLightColor);
}
}
protected virtual void SendMessage(uint msg, IntPtr lparam, IntPtr wparam)
{
UnsafeMethod.SendMessage(this.Handle, msg, wparam, lparam);
}
protected virtual void SendMessage(WindowsMessage msg, IntPtr lparam, IntPtr wparam)
{
UnsafeMethod.SendMessage(this.Handle, (uint)msg, wparam, lparam);
}
protected virtual void SetCapture()
{
UnsafeMethod.SetCapture(this.Handle);
}
protected virtual void ReleaseCapture()
{
UnsafeMethod.ReleaseCapture();
}
protected virtual IntPtr WndProc(IntPtr hWnd, WindowsMessage msg, IntPtr lParam, IntPtr wParam)
{
if (msg == WindowsMessage.SHOWWINDOW)
{
OnLoad(EventArgs.Empty);
}
if (msg == WindowsMessage.LBUTTONDBLCLK)
{
int x = (int)Win32Helper.UnsafeMethod.LOWORD(lParam);
int y = (int)Win32Helper.UnsafeMethod.HIWORD(lParam);
OnMouseDoubleClick(new MouseEventArgs(System.Windows.Forms.MouseButtons.Left, 2, x, y, 0));
}
return IntPtr.Zero;
}
#endregion
protected override void OnParentChanged(EventArgs e)
{
base.OnParentChanged(e);
if (this.Parent == null)
{
m_ParentHandle = IntPtr.Zero;
}
else
{
m_ParentHandle = this.Parent.Handle;
}
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
PaintBackGround(e.Graphics);
PaintText(e.Graphics);
}
protected override void WndProc(ref Message m)
{
IntPtr resualt = WndProc(m.HWnd, (WindowsMessage)m.Msg, m.LParam, m.WParam);
if (resualt == new IntPtr(2))
{
m.Result = new IntPtr(1);
return;
}
base.WndProc(ref m);
}
}
public enum ControlDirection : uint
{
None = 0x00,
/// <summary>
/// 竖向
/// </summary>
Vertical = 0x01,
/// <summary>
/// 横向
/// </summary>
Horizontal = 0x02,
}
}