要做一个自定义控件,效果是:可以选择三种不同的类型的按钮,并各自实现功能
三种按钮通过枚举类型
-
取反式
功能:点击置位,再次点击复位
思路:利用click事件,标志位取反来实现 -
点击式
功能:点击置位,松开复位
思路:挂载鼠标按下,鼠标松开事件 -
延时式
功能:当到达预设时间后才可置位,松开复位
思路:定义一个刷新计数countTime,通过countTime >= 设定的延时时间(ms) / 定时器刷新时间, 即到达延时时间,触发,也是鼠标按下,松开事件
1.枚举三种按钮
public enum ButtonType
{
ClickButton,
HoldButton,
DelayButton
}
2.添加三种按钮有的属性
延时式按钮的延时触发时间
private int delayTime = 1000;
[Category("Customer"), Description("指定的延时触发时间(毫秒)")]
public int DelayTime
{
get {
return delayTime; }
set {
delayTime = value; }
}
按钮按下设置
private bool _isClick;
public bool IsClick {
}
按钮按下,弹起时的背景颜色
private Color _trueColor;
public Color TrueColor{
}
private Color _falseColor;
public Color FalseColor{
}
按钮内部文本
private string _content;
public string Content{
}
按钮边框设置
//边框宽度
private int _borderWidth;
public int BorderWidth{
}
//边框颜色
private Color _borderColor;
public Color BorderColor{
}
//边框圆角半径
private int _cornerRadius;
private int CornerRadius{
}
3.绘制按钮
using System.Drawing;
using System.Drawing.Drawing2D;
using XCore.Controls.Unity;
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
var g = e.Graphics;
g.CompositingQuality = CompositingQuality.HighQuality;
g.SmoothingMode = SmoothingMode.HighQuality;
// 生成背景色
g.FillPath(new SolidBrush(_isClick ? _trueColor : _falseColor),
UiHelper.RoundRectangle(0, 0, Width, Height, _cornerRadius));
// 生成边框颜色
g.DrawPath(new Pen(new SolidBrush(_borderColor), _borderWidth),
UiHelper.RoundRectangle(0, 0, Width - _borderWidth, Height - _borderWidth, _cornerRadius));
// 生成文字
var sizeF = g.MeasureString(_content, Font);
g.DrawString(_content, Font, new SolidBrush(ForeColor), (Width - sizeF.Width) / 2, (Height - sizeF.Height) / 2);
}
4.添加定时器
//全局定时器
public Timer timer;
//定义刷新计数
private int countTime;
public ChooseButtom()
{