namespace Controls
{
using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Windows.Forms;
public partial class RcButton
{
public RcButton()
{
InitializeComponent();
}
/// <summary>
/// 必需的设计器变量。
/// </summary>
IContainer components = null;
/// <summary>
/// 填充按钮的图片控件
/// </summary>
PictureBox fillImage = new PictureBox();
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region 渐变属性
int _radius = 1;
[Browsable(true), Category("按钮样式属性"), Description("圆角弧度")]
public int Radius
{
get { return _radius; }
set { _radius = value > 0 ? value : 1; }
}
LinearGradientMode _linearGradientMode = LinearGradientMode.Vertical;
[Browsable(true), Category("按钮样式属性"), Description("渐变方向")]
public LinearGradientMode LinearGradientMode
{
get { return _linearGradientMode; }
set { _linearGradientMode = value; }
}
Color _beginColor = Color.LightGray;
[Browsable(true), Category("按钮样式属性"), Description("渐变起始颜色")]
public Color FadeColorStart
{
get { return _beginColor; }
set { _beginColor = value; }
}
Color _endColor = Color.LightGray;
[Browsable(true), Category("按钮样式属性"), Description("渐变结束颜色")]
public Color FadeColorEnd
{
get { return _endColor; }
set { _endColor = value; }
}
#endregion
#region 图片属性
bool _isImageMode = false;
[Browsable(true), Category("按钮样式属性"), Description("启用图片模式")]
public bool IsImageMode
{
get { return _isImageMode; }
set
{
_isImageMode = value;
// 去除触发条件
this.Controls.Remove(fillImage);
this.Paint -= event_paint;
// 添加触发条件
if (_isImageMode)
{
this.Controls.Add(this.fillImage);
}
else
{
this.Paint += event_paint;
}
}
}
Image _normal;
[Browsable(true), Category("按钮样式属性"), Description("默认显示图片")]
public Image ImageNormal
{
get { return _normal; }
set
{
_normal = value;
fillImage.BackgroundImage = _normal;
}
}
Image _enter;
[Browsable(true), Category("按钮样式属性"), Description("鼠标悬停图片")]
public Image ImageEnter
{
get { return _enter; }
set
{
_enter = value;
fillImage.BackgroundImage = _enter;
}
}
Image _click;
[Browsable(true), Category("按钮样式属性"), Description("点击按钮图片")]
public Image ImageClick
{
get { return _click; }
set
{
_click = value;
fillImage.BackgroundImage = _click;
}
}
#endregion
#region 重新调整尺寸
Image resizeImage(Image imgToResize, Size size)
{
if (imgToResize == null) return null;
//期望的宽度
int destWidth = size.Width;
//期望的高度
int destHeight = size.Height;
Bitmap b = new Bitmap(destWidth, destHeight);
Graphics g = Graphics.FromImage(b);
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
//绘制图像
g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
g.Dispose();
return b;
}
#endregion
#region 内部事件
/// <summary>
/// 渲染绘制事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void event_paint(object sender, PaintEventArgs e)
{
// 获取参数
var cr = e.ClipRectangle;
var g = e.Graphics;
// 绘制渐变
var lgb = new LinearGradientBrush(cr, FadeColorStart, FadeColorEnd, LinearGradientMode);
// 绘制圆角矩形
var gp = new GraphicsPath();
gp.AddArc(cr.X, cr.Y, Radius, Radius, 180, 90);
gp.AddArc(cr.Width - Radius, cr.Y, Radius, Radius, 270, 90);
gp.AddArc(cr.Width - Radius, cr.Height - Radius, Radius, Radius, 0, 90);
gp.AddArc(cr.X, cr.Height - Radius, Radius, Radius, 90, 90);
gp.CloseAllFigures();// 闭合连接所有图形(画直线)
// 绘制图形
g.Clear(Parent.BackColor);
g.FillPath(lgb, gp);
var point = g.MeasureString(Text, Font).ToPointF();
var x = (Width - point.X) / 2;
var y = (Height - point.Y) / 2;
// 添加文字
g.DrawString(Text, Font, new SolidBrush(ForeColor), new PointF(x, y));
}
/// <summary>
/// 点击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void fillImage_ImageClick(object sender, EventArgs e)
{
fillImage.BackgroundImage = ImageClick;
}
/// <summary>
/// 鼠标移入事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void fillImage_ImageEnter(object sender, EventArgs e)
{
fillImage.BackgroundImage = ImageEnter;
}
/// <summary>
/// 鼠标离开事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void fillImage_ImageNormal(object sender, EventArgs e)
{
fillImage.BackgroundImage = ImageNormal;
}
/// <summary>
/// 更改尺寸时重置
/// </summary>
/// <param name="e"></param>
protected override void OnResize(EventArgs e)
{
base.OnResize(e);
fillImage.Size = Size;
_normal = resizeImage(_normal, Size);
_enter = resizeImage(_enter, Size);
_click = resizeImage(_click, Size);
fillImage.BackgroundImage = ImageNormal;
}
#endregion
#region 组件设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要修改
/// 使用代码编辑器修改此方法的内容。
/// </summary>
void InitializeComponent()
{
//
// 图片控件
//
((ISupportInitialize)(this.fillImage)).BeginInit();
this.SuspendLayout();
this.fillImage.Name = "fillImage";
this.fillImage.Size = Size;
this.fillImage.Location = Point.Empty;
this.fillImage.SizeMode = PictureBoxSizeMode.CenterImage;
this.fillImage.TabIndex = 0;
this.fillImage.TabStop = false;
// 添加事件
this.fillImage.MouseDown += fillImage_ImageClick;
this.fillImage.MouseUp += fillImage_ImageEnter;
this.fillImage.MouseEnter += fillImage_ImageEnter;
this.fillImage.MouseLeave += fillImage_ImageNormal;
((ISupportInitialize)(this.fillImage)).EndInit();
this.ResumeLayout(false);
}
#endregion
}
}
RcButton按钮控件,可设置渐变色和悬停图片
猜你喜欢
转载自blog.csdn.net/FireGhost57/article/details/79416584
今日推荐
周排行