You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
401 lines
13 KiB
401 lines
13 KiB
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Drawing;
|
|
using System.Data;
|
|
using System.Drawing.Drawing2D;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Windows.Forms;
|
|
|
|
namespace Customize.Controls
|
|
{
|
|
[DefaultEvent("Click")]
|
|
[ToolboxBitmap(typeof(Button))]
|
|
public partial class CcButton : Button
|
|
{
|
|
#region attribute
|
|
|
|
/// <summary>
|
|
/// 圆角值
|
|
/// </summary>
|
|
private int _CornerRadius = 2;
|
|
|
|
/// <summary>
|
|
/// 内容边距间隔
|
|
/// </summary>
|
|
private int _Margin = 4;
|
|
|
|
/// <summary>
|
|
/// 图标大小
|
|
/// </summary>
|
|
private Size _ImageSize = new Size(16, 16);
|
|
|
|
/// <summary>
|
|
/// 控件的状态
|
|
/// </summary>
|
|
private EnumControlState _ControlState;
|
|
|
|
#endregion
|
|
|
|
#region Initializes
|
|
|
|
/// <summary>
|
|
/// (构造函数).Initializes a new instance of the <see cref="TXButton"/> class.
|
|
/// </summary>
|
|
/// User:Ryan CreateTime:2011-08-01 16:15.
|
|
public CcButton()
|
|
{
|
|
this.SetStyle(ControlStyles.UserPaint, true);
|
|
this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
|
|
this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
|
|
this.SetStyle(ControlStyles.DoubleBuffer, true);
|
|
this.SetStyle(ControlStyles.ResizeRedraw, true);
|
|
this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);
|
|
//this.UpdateStyles();
|
|
this._ControlState = EnumControlState.Default;
|
|
base.TextImageRelation = TextImageRelation.ImageBeforeText;
|
|
this.Size = new Size(100, 30);
|
|
this.ResetRegion();
|
|
}
|
|
#endregion
|
|
|
|
#region Properties
|
|
|
|
[Category("CCProperties")]
|
|
[Description("圆角的半径值")]
|
|
[DefaultValue(2)]
|
|
public int CornerRadius
|
|
{
|
|
get { return this._CornerRadius; }
|
|
set
|
|
{
|
|
this._CornerRadius = value;
|
|
this.Invalidate();
|
|
}
|
|
}
|
|
|
|
[Category("CCProperties")]
|
|
[Browsable(true)]
|
|
[Description("图标大小")]
|
|
[DefaultValue(typeof(Size), "16,16")]
|
|
public Size ImageSize
|
|
{
|
|
get { return this._ImageSize; }
|
|
set { this._ImageSize = value; this.Invalidate(); }
|
|
}
|
|
|
|
[Category("CCProperties")]
|
|
[Browsable(true)]
|
|
[Description("图标")]
|
|
public new Image Image
|
|
{
|
|
get { return base.Image; }
|
|
set
|
|
{
|
|
base.Image = value;
|
|
this.Invalidate();
|
|
}
|
|
}
|
|
|
|
[Category("CCProperties")]
|
|
[Browsable(true)]
|
|
[DefaultValue(typeof(TextImageRelation), "ImageBeforeText")]
|
|
public new TextImageRelation TextImageRelation
|
|
{
|
|
get { return base.TextImageRelation; }
|
|
set { base.TextImageRelation = value; }
|
|
}
|
|
|
|
[Browsable(false)]
|
|
public new Color BackColor
|
|
{
|
|
get { return base.BackColor; }
|
|
}
|
|
|
|
[Browsable(false)]
|
|
public new ContentAlignment TextAlign
|
|
{
|
|
get { return base.TextAlign; }
|
|
}
|
|
|
|
[Browsable(false)]
|
|
public new ContentAlignment ImageAlign
|
|
{
|
|
get { return base.ImageAlign; }
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Override methods
|
|
|
|
protected override void OnMouseEnter(EventArgs e)
|
|
{
|
|
base.OnMouseEnter(e);
|
|
this._ControlState = EnumControlState.HeightLight;
|
|
this.Invalidate();
|
|
}
|
|
|
|
protected override void OnMouseDown(MouseEventArgs e)
|
|
{
|
|
base.OnMouseDown(e);
|
|
if (e.Button == MouseButtons.Left)
|
|
{
|
|
this._ControlState = EnumControlState.Focused;
|
|
this.Invalidate();
|
|
}
|
|
}
|
|
|
|
protected override void OnMouseLeave(EventArgs e)
|
|
{
|
|
base.OnMouseLeave(e);
|
|
this._ControlState = EnumControlState.Default;
|
|
this.Invalidate();
|
|
}
|
|
|
|
protected override void OnMouseUp(MouseEventArgs e)
|
|
{
|
|
base.OnMouseUp(e);
|
|
if (e.Button == MouseButtons.Left)
|
|
{
|
|
this._ControlState = EnumControlState.HeightLight;
|
|
this.Invalidate();
|
|
}
|
|
}
|
|
|
|
protected override void OnKeyDown(KeyEventArgs e)
|
|
{
|
|
base.OnKeyDown(e);
|
|
if (e.KeyCode == Keys.Space)
|
|
{
|
|
this._ControlState = EnumControlState.Focused;
|
|
this.Invalidate();
|
|
}
|
|
}
|
|
|
|
protected override void OnKeyUp(KeyEventArgs e)
|
|
{
|
|
base.OnKeyUp(e);
|
|
if (e.KeyCode == Keys.Space)
|
|
{
|
|
this._ControlState = EnumControlState.Default;
|
|
this.Invalidate();
|
|
this.OnClick(e);
|
|
}
|
|
}
|
|
|
|
protected override void OnGotFocus(EventArgs e)
|
|
{
|
|
base.OnGotFocus(e);
|
|
this._ControlState = EnumControlState.HeightLight;
|
|
this.Invalidate();
|
|
}
|
|
|
|
protected override void OnLostFocus(EventArgs e)
|
|
{
|
|
base.OnLostFocus(e);
|
|
this._ControlState = EnumControlState.Default;
|
|
this.Invalidate();
|
|
}
|
|
|
|
protected override void OnResize(EventArgs e)
|
|
{
|
|
base.OnResize(e);
|
|
this.ResetRegion();
|
|
}
|
|
|
|
protected override void OnCreateControl()
|
|
{
|
|
base.OnCreateControl();
|
|
this.ResetRegion();
|
|
}
|
|
|
|
protected override void OnPaint(PaintEventArgs e)
|
|
{
|
|
base.OnPaint(e);
|
|
base.OnPaintBackground(e);
|
|
this.ResetRegion();
|
|
Graphics g = e.Graphics;
|
|
this.DrawBackGround(g);
|
|
this.DrawContent(g);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Private methods
|
|
|
|
#region DrawBackGround
|
|
|
|
/// <summary>
|
|
/// 绘制背景和边框等
|
|
/// </summary>
|
|
/// <param name="g">The Graphics.</param>
|
|
private void DrawBackGround(Graphics g)
|
|
{
|
|
GDIHelper.InitializeGraphics(g);
|
|
Rectangle rect = new Rectangle(1, 1, this.Width - 3, this.Height - 3);
|
|
RoundRectangle roundRect = new RoundRectangle(rect, new CornerRadius(this._CornerRadius));
|
|
switch (this._ControlState)
|
|
{
|
|
case EnumControlState.Default:
|
|
if (this.FlatStyle != FlatStyle.Flat)
|
|
{
|
|
GDIHelper.FillRectangle(g, roundRect, SkinManager.CurrentSkin.DefaultControlColor);
|
|
GDIHelper.DrawPathBorder(g, roundRect, SkinManager.CurrentSkin.BorderColor);
|
|
}
|
|
break;
|
|
case EnumControlState.HeightLight:
|
|
GDIHelper.FillRectangle(g, roundRect, SkinManager.CurrentSkin.HeightLightControlColor);
|
|
GDIHelper.DrawPathBorder(g, roundRect);
|
|
break;
|
|
case EnumControlState.Focused:
|
|
GDIHelper.FillRectangle(g, roundRect, SkinManager.CurrentSkin.FocusedControlColor);
|
|
GDIHelper.DrawPathBorder(g, roundRect);
|
|
GDIHelper.DrawPathInnerBorder(g, roundRect);
|
|
break;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region DrawContent
|
|
|
|
/// <summary>
|
|
/// 绘制按钮的内容:图标和文字
|
|
/// </summary>
|
|
/// <param name="g">The Graphics.</param>
|
|
private void DrawContent(Graphics g)
|
|
{
|
|
Rectangle imageRect;
|
|
Rectangle textRect;
|
|
this.CalculateRect(out imageRect, out textRect);
|
|
if (this.Image != null)
|
|
{
|
|
g.DrawImage(this.Image, imageRect, 0, 0, this._ImageSize.Width, this._ImageSize.Height, GraphicsUnit.Pixel);
|
|
}
|
|
|
|
Color forceColor = this.Enabled ? this.ForeColor : SkinManager.CurrentSkin.UselessColor;
|
|
TextRenderer.DrawText(g, this.Text, this.Font, textRect, forceColor, TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region CalculateRect
|
|
|
|
/// <summary>
|
|
/// 计算图标和文字的区域
|
|
/// </summary>
|
|
/// <param name="imageRect">The image rect.</param>
|
|
/// <param name="textRect">The text rect.</param>
|
|
private void CalculateRect(out Rectangle imageRect, out Rectangle textRect)
|
|
{
|
|
imageRect = Rectangle.Empty;
|
|
textRect = Rectangle.Empty;
|
|
if (Image == null)
|
|
{
|
|
textRect = new Rectangle(
|
|
this._Margin,
|
|
this._Margin,
|
|
this.Width - this._Margin * 2,
|
|
this.Height - this._Margin * 2);
|
|
return;
|
|
}
|
|
Size textSize = TextRenderer.MeasureText(this.Text, this.Font);
|
|
int textMaxWidth = this.Width - this._ImageSize.Width - this._Margin * 3;
|
|
int textWidth = textSize.Width >= textMaxWidth ? textMaxWidth : textSize.Width;
|
|
int contentWidth = this._Margin + this._ImageSize.Width + textWidth;
|
|
switch (TextImageRelation)
|
|
{
|
|
case TextImageRelation.Overlay:
|
|
imageRect = new Rectangle(
|
|
this._Margin,
|
|
(this.Height - this._ImageSize.Height) / 2,
|
|
this._ImageSize.Width,
|
|
this._ImageSize.Height);
|
|
textRect = new Rectangle(
|
|
this._Margin,
|
|
this._Margin,
|
|
this.Width - this._Margin * 2,
|
|
this.Height);
|
|
break;
|
|
case TextImageRelation.ImageAboveText:
|
|
imageRect = new Rectangle(
|
|
(this.Width - this._ImageSize.Width) / 2,
|
|
this._Margin,
|
|
this._ImageSize.Width,
|
|
this._ImageSize.Height);
|
|
textRect = new Rectangle(
|
|
this._Margin,
|
|
imageRect.Bottom,
|
|
this.Width - this._Margin * 2,
|
|
this.Height - imageRect.Bottom - this._Margin);
|
|
break;
|
|
case TextImageRelation.ImageBeforeText:
|
|
imageRect = new Rectangle(
|
|
(this.Width - contentWidth) / 2,
|
|
(this.Height - this._ImageSize.Height) / 2,
|
|
this._ImageSize.Width,
|
|
this._ImageSize.Height);
|
|
textRect = new Rectangle(
|
|
imageRect.Right + this._Margin,
|
|
this._Margin,
|
|
textWidth,
|
|
this.Height - this._Margin * 2);
|
|
break;
|
|
case TextImageRelation.TextAboveImage:
|
|
imageRect = new Rectangle(
|
|
(this.Width - this._ImageSize.Width) / 2,
|
|
this.Height - this._ImageSize.Height - this._Margin,
|
|
this._ImageSize.Width,
|
|
this._ImageSize.Height);
|
|
textRect = new Rectangle(
|
|
this._Margin,
|
|
this._Margin,
|
|
this.Width - this._Margin * 2,
|
|
this.Height - imageRect.Y - this._Margin);
|
|
break;
|
|
case TextImageRelation.TextBeforeImage:
|
|
imageRect = new Rectangle(
|
|
(this.Width + contentWidth) / 2 - this._ImageSize.Width,
|
|
(this.Height - this._ImageSize.Height) / 2,
|
|
this._ImageSize.Width,
|
|
this._ImageSize.Height);
|
|
textRect = new Rectangle(
|
|
(this.Width - contentWidth) / 2,
|
|
this._Margin,
|
|
textWidth,
|
|
this.Height - this._Margin * 2);
|
|
break;
|
|
}
|
|
|
|
if (RightToLeft == RightToLeft.Yes)
|
|
{
|
|
imageRect.X = this.Width - imageRect.Right;
|
|
textRect.X = this.Width - textRect.Right;
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#region ResetRegion
|
|
|
|
private void ResetRegion()
|
|
{
|
|
if (this._CornerRadius > 0)
|
|
{
|
|
Rectangle rect = new Rectangle(Point.Empty, this.Size);
|
|
//rect.Height--;
|
|
//rect.Width--;
|
|
RoundRectangle roundRect = new RoundRectangle(rect, new CornerRadius(this._CornerRadius));
|
|
if (this.Region != null)
|
|
{
|
|
this.Region.Dispose();
|
|
}
|
|
|
|
this.Region = new Region(roundRect.ToGraphicsBezierPath());
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#endregion
|
|
}
|
|
}
|