422 lines
12 KiB
C#
422 lines
12 KiB
C#
/******************************************************************************
|
||
* SunnyUI 开源控件库、工具类库、扩展类库、多页面开发框架。
|
||
* CopyRight (C) 2012-2020 ShenYongHua(沈永华).
|
||
* QQ群:56829229 QQ:17612584 EMail:SunnyUI@qq.com
|
||
*
|
||
* Blog: https://www.cnblogs.com/yhuse
|
||
* Gitee: https://gitee.com/yhuse/SunnyUI
|
||
* GitHub: https://github.com/yhuse/SunnyUI
|
||
*
|
||
* SunnyUI.dll can be used for free under the GPL-3.0 license.
|
||
* If you use this code, please keep this note.
|
||
* 如果您使用此代码,请保留此说明。
|
||
******************************************************************************
|
||
* 文件名称: UIButton.cs
|
||
* 文件说明: 按钮
|
||
* 当前版本: V3.0
|
||
* 创建日期: 2020-01-01
|
||
*
|
||
* 2020-01-01: V2.2.0 增加文件说明
|
||
* 2020-04-25: V2.2.4 更新主题配置类
|
||
* 2020-07-26: V2.2.6 增加Selected及选中颜色配置
|
||
* 2020-08-22: V2.2.7 空格键按下press背景效果,添加双击事件,解决因快速点击导致过慢问题
|
||
* 2020-09-14: V2.2.7 Tips颜色可设置
|
||
******************************************************************************/
|
||
|
||
using System;
|
||
using System.ComponentModel;
|
||
using System.Drawing;
|
||
using System.Drawing.Drawing2D;
|
||
using System.Windows.Forms;
|
||
|
||
// ReSharper disable All
|
||
#pragma warning disable 1591
|
||
|
||
namespace Sunny.UI
|
||
{
|
||
[DefaultEvent("Click")]
|
||
[DefaultProperty("Text")]
|
||
[ToolboxItem(true)]
|
||
public class UIButton : UIControl, IButtonControl
|
||
{
|
||
public UIButton()
|
||
{
|
||
TabStop = true;
|
||
Width = 100;
|
||
Height = 35;
|
||
Cursor = Cursors.Hand;
|
||
|
||
foreHoverColor = UIStyles.Blue.ButtonForeHoverColor;
|
||
forePressColor = UIStyles.Blue.ButtonForePressColor;
|
||
foreSelectedColor = UIStyles.Blue.ButtonForeSelectedColor;
|
||
|
||
rectHoverColor = UIStyles.Blue.RectHoverColor;
|
||
rectPressColor = UIStyles.Blue.RectPressColor;
|
||
rectSelectedColor = UIStyles.Blue.RectSelectedColor;
|
||
|
||
fillHoverColor = UIStyles.Blue.ButtonFillHoverColor;
|
||
fillPressColor = UIStyles.Blue.ButtonFillPressColor;
|
||
fillSelectedColor = UIStyles.Blue.ButtonFillSelectedColor;
|
||
SetStyle(ControlStyles.StandardDoubleClick, UseDoubleClick);
|
||
}
|
||
|
||
private bool isClick;
|
||
|
||
public void PerformClick()
|
||
{
|
||
if (isClick) return;
|
||
if (CanSelect && Enabled)
|
||
{
|
||
isClick = true;
|
||
OnClick(EventArgs.Empty);
|
||
isClick = false;
|
||
}
|
||
}
|
||
|
||
protected override void OnClick(EventArgs e)
|
||
{
|
||
Focus();
|
||
base.OnClick(e);
|
||
}
|
||
|
||
private bool showTips = false;
|
||
|
||
[Description("是否显示角标"), Category("SunnyUI")]
|
||
[DefaultValue(false)]
|
||
public bool ShowTips
|
||
{
|
||
get
|
||
{
|
||
return showTips;
|
||
}
|
||
set
|
||
{
|
||
if (showTips != value)
|
||
{
|
||
showTips = value;
|
||
Invalidate();
|
||
}
|
||
}
|
||
}
|
||
|
||
private string tipsText = "";
|
||
|
||
[Description("角标文字"), Category("SunnyUI")]
|
||
[DefaultValue("")]
|
||
public string TipsText
|
||
{
|
||
get { return tipsText; }
|
||
set
|
||
{
|
||
if (tipsText != value)
|
||
{
|
||
tipsText = value;
|
||
if (ShowTips)
|
||
{
|
||
Invalidate();
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
private Font tipsFont = new Font("Microsoft Sans Serif", 9);
|
||
|
||
[Description("角标文字字体"), Category("SunnyUI")]
|
||
[DefaultValue(typeof(Font), "Microsoft Sans Serif, 9pt")]
|
||
public Font TipsFont
|
||
{
|
||
get { return tipsFont; }
|
||
set
|
||
{
|
||
if (!tipsFont.Equals(value))
|
||
{
|
||
tipsFont = value;
|
||
Invalidate();
|
||
}
|
||
}
|
||
}
|
||
|
||
protected override void OnPaintFill(Graphics g, GraphicsPath path)
|
||
{
|
||
if (!selected)
|
||
{
|
||
base.OnPaintFill(g, path);
|
||
}
|
||
else
|
||
{
|
||
g.FillPath(FillSelectedColor, path);
|
||
}
|
||
}
|
||
|
||
private Color tipsColor = Color.Red;
|
||
|
||
[Description("角标文字颜色"), Category("SunnyUI")]
|
||
[DefaultValue(typeof(Color), "Red")]
|
||
public Color TipsColor
|
||
{
|
||
get => tipsColor;
|
||
set
|
||
{
|
||
tipsColor = value;
|
||
Invalidate();
|
||
}
|
||
}
|
||
|
||
protected override void OnPaint(PaintEventArgs e)
|
||
{
|
||
base.OnPaint(e);
|
||
|
||
if (Enabled && ShowTips && !string.IsNullOrEmpty(TipsText))
|
||
{
|
||
e.Graphics.SetHighQuality();
|
||
SizeF sf = e.Graphics.MeasureString(TipsText, TipsFont);
|
||
float sfMax = Math.Max(sf.Width, sf.Height);
|
||
float x = Width - 1 - 2 - sfMax;
|
||
float y = 1 + 1;
|
||
e.Graphics.FillEllipse(TipsColor, x, y, sfMax, sfMax);
|
||
e.Graphics.DrawString(TipsText, TipsFont, Color.White, x + sfMax / 2.0f - sf.Width / 2.0f, y + sfMax / 2.0f - sf.Height / 2.0f);
|
||
}
|
||
|
||
if (Focused && ShowFocusLine)
|
||
{
|
||
Rectangle rect = new Rectangle(2, 2, Width - 5, Height - 5);
|
||
var path = rect.CreateRoundedRectanglePath(Radius);
|
||
using (Pen pn = new Pen(ForeColor))
|
||
{
|
||
pn.DashStyle = DashStyle.Dot;
|
||
e.Graphics.DrawPath(pn, path);
|
||
}
|
||
|
||
path.Dispose();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 是否选中
|
||
/// </summary>
|
||
[DefaultValue(false)]
|
||
[Description("是否选中"), Category("SunnyUI")]
|
||
public bool Selected
|
||
{
|
||
get => selected;
|
||
set
|
||
{
|
||
if (selected != value)
|
||
{
|
||
selected = value;
|
||
Invalidate();
|
||
}
|
||
}
|
||
}
|
||
|
||
public override void SetStyleColor(UIBaseStyle uiColor)
|
||
{
|
||
base.SetStyleColor(uiColor);
|
||
if (uiColor.IsCustom()) return;
|
||
|
||
fillHoverColor = uiColor.ButtonFillHoverColor;
|
||
rectHoverColor = uiColor.RectHoverColor;
|
||
foreHoverColor = uiColor.ButtonForeHoverColor;
|
||
|
||
fillPressColor = uiColor.ButtonFillPressColor;
|
||
rectPressColor = uiColor.RectPressColor;
|
||
forePressColor = uiColor.ButtonForePressColor;
|
||
|
||
fillSelectedColor = uiColor.ButtonFillSelectedColor;
|
||
foreSelectedColor = uiColor.ButtonForeSelectedColor;
|
||
rectSelectedColor = uiColor.RectSelectedColor;
|
||
|
||
Invalidate();
|
||
}
|
||
|
||
/// <summary>
|
||
/// 填充颜色,当值为背景色或透明色或空值则不填充
|
||
/// </summary>
|
||
[Description("填充颜色"), Category("SunnyUI")]
|
||
[DefaultValue(typeof(Color), "80, 160, 255")]
|
||
public Color FillColor
|
||
{
|
||
get => fillColor;
|
||
set => SetFillColor(value);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 边框颜色
|
||
/// </summary>
|
||
[Description("边框颜色"), Category("SunnyUI")]
|
||
[DefaultValue(typeof(Color), "80, 160, 255")]
|
||
public Color RectColor
|
||
{
|
||
get => rectColor;
|
||
set => SetRectColor(value);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 字体颜色
|
||
/// </summary>
|
||
[Description("字体颜色"), Category("SunnyUI")]
|
||
[DefaultValue(typeof(Color), "White")]
|
||
public override Color ForeColor
|
||
{
|
||
get => foreColor;
|
||
set => SetForeColor(value);
|
||
}
|
||
|
||
[DefaultValue(typeof(Color), "244, 244, 244"), Category("SunnyUI")]
|
||
[Description("不可用时填充颜色")]
|
||
public Color FillDisableColor
|
||
{
|
||
get => fillDisableColor;
|
||
set => SetFillDisableColor(value);
|
||
}
|
||
|
||
[DefaultValue(typeof(Color), "173, 178, 181"), Category("SunnyUI")]
|
||
[Description("不可用时边框颜色")]
|
||
public Color RectDisableColor
|
||
{
|
||
get => rectDisableColor;
|
||
set => SetRectDisableColor(value);
|
||
}
|
||
|
||
[DefaultValue(typeof(Color), "109, 109, 103"), Category("SunnyUI")]
|
||
[Description("不可用时字体颜色")]
|
||
public Color ForeDisableColor
|
||
{
|
||
get => foreDisableColor;
|
||
set => SetForeDisableColor(value);
|
||
}
|
||
|
||
[DefaultValue(typeof(Color), "111, 168, 255"), Category("SunnyUI")]
|
||
[Description("鼠标移上时填充颜色")]
|
||
public Color FillHoverColor
|
||
{
|
||
get => fillHoverColor;
|
||
set => SetFillHoveColor(value);
|
||
}
|
||
|
||
[DefaultValue(typeof(Color), "74, 131, 229"), Category("SunnyUI")]
|
||
[Description("鼠标按下时填充颜色")]
|
||
public Color FillPressColor
|
||
{
|
||
get => fillPressColor;
|
||
set => SetFillPressColor(value);
|
||
}
|
||
|
||
[DefaultValue(typeof(Color), "White"), Category("SunnyUI")]
|
||
[Description("鼠标移上时字体颜色")]
|
||
public Color ForeHoverColor
|
||
{
|
||
get => foreHoverColor;
|
||
set => SetForeHoveColor(value);
|
||
}
|
||
|
||
[DefaultValue(typeof(Color), "White"), Category("SunnyUI")]
|
||
[Description("鼠标按下时字体颜色")]
|
||
public Color ForePressColor
|
||
{
|
||
get => forePressColor;
|
||
set => SetForePressColor(value);
|
||
}
|
||
|
||
[DefaultValue(typeof(Color), "111, 168, 255"), Category("SunnyUI")]
|
||
[Description("鼠标移上时边框颜色")]
|
||
public Color RectHoverColor
|
||
{
|
||
get => rectHoverColor;
|
||
set => SetRectHoveColor(value);
|
||
}
|
||
|
||
[DefaultValue(typeof(Color), "74, 131, 229"), Category("SunnyUI")]
|
||
[Description("鼠标按下时边框颜色")]
|
||
public Color RectPressColor
|
||
{
|
||
get => rectPressColor;
|
||
set => SetRectPressColor(value);
|
||
}
|
||
|
||
[DefaultValue(typeof(Color), "74, 131, 229"), Category("SunnyUI")]
|
||
[Description("选中时填充颜色")]
|
||
public Color FillSelectedColor
|
||
{
|
||
get => fillSelectedColor;
|
||
set => SetFillSelectedColor(value);
|
||
}
|
||
|
||
[DefaultValue(typeof(Color), "White"), Category("SunnyUI")]
|
||
[Description("选中时字体颜色")]
|
||
public Color ForeSelectedColor
|
||
{
|
||
get => foreSelectedColor;
|
||
set => SetForeSelectedColor(value);
|
||
}
|
||
|
||
[DefaultValue(typeof(Color), "74, 131, 229"), Category("SunnyUI")]
|
||
[Description("选中时边框颜色")]
|
||
public Color RectSelectedColor
|
||
{
|
||
get => rectSelectedColor;
|
||
set => SetRectSelectedColor(value);
|
||
}
|
||
|
||
protected override void OnMouseDown(MouseEventArgs e)
|
||
{
|
||
base.OnMouseDown(e);
|
||
IsPress = true;
|
||
Invalidate();
|
||
}
|
||
|
||
protected override void OnMouseUp(MouseEventArgs e)
|
||
{
|
||
base.OnMouseUp(e);
|
||
IsPress = false;
|
||
Invalidate();
|
||
}
|
||
|
||
protected override void OnMouseLeave(EventArgs e)
|
||
{
|
||
base.OnMouseLeave(e);
|
||
IsPress = false;
|
||
IsHover = false;
|
||
Invalidate();
|
||
}
|
||
|
||
protected override void OnMouseEnter(EventArgs e)
|
||
{
|
||
base.OnMouseEnter(e);
|
||
IsHover = true;
|
||
Invalidate();
|
||
}
|
||
|
||
public void NotifyDefault(bool value)
|
||
{
|
||
}
|
||
|
||
[DefaultValue(DialogResult.None)]
|
||
[Description("指定标识符以指示对话框的返回值"), Category("SunnyUI")]
|
||
public DialogResult DialogResult { get; set; } = DialogResult.None;
|
||
|
||
protected override void OnKeyDown(KeyEventArgs e)
|
||
{
|
||
if (Focused && e.KeyCode == Keys.Space)
|
||
{
|
||
IsPress = true;
|
||
Invalidate();
|
||
PerformClick();
|
||
}
|
||
|
||
base.OnKeyDown(e);
|
||
}
|
||
|
||
protected override void OnKeyUp(KeyEventArgs e)
|
||
{
|
||
IsPress = false;
|
||
Invalidate();
|
||
|
||
base.OnKeyUp(e);
|
||
}
|
||
|
||
[DefaultValue(false)]
|
||
[Description("显示激活时边框线"), Category("SunnyUI")]
|
||
public bool ShowFocusLine { get; set; }
|
||
}
|
||
} |