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.
344 lines
11 KiB
344 lines
11 KiB
#if NETFX || NETCORE
|
|
|
|
using System;
|
|
using System.Drawing;
|
|
using System.Windows.Forms;
|
|
|
|
namespace Apewer.Surface
|
|
{
|
|
|
|
/// <summary></summary>
|
|
public class BlockButton : BaseControl
|
|
{
|
|
|
|
#region definition
|
|
|
|
private BlockBox _border = new BlockBox();
|
|
private BlockLabel _caption = new BlockLabel();
|
|
|
|
private Color _normaltext = FormsUtility.Black;
|
|
private Color _hovertext = FormsUtility.Black;
|
|
private Color _lockedtext = FormsUtility.GraceLocked;
|
|
|
|
#endregion
|
|
|
|
#region this
|
|
|
|
private void VarInit(string caption)
|
|
{
|
|
this.Controls.Add(_border);
|
|
_border.Controls.Add(_caption);
|
|
|
|
this.Size = new Size(120, 40);
|
|
|
|
_border.Dock = DockStyle.Fill;
|
|
_border.Padding = new Padding(1, 1, 1, 1);
|
|
_border.HaveBorder = true;
|
|
|
|
_caption.Dock = DockStyle.Fill;
|
|
_caption.TextAlign = ContentAlignment.MiddleCenter;
|
|
_caption.Caption = string.IsNullOrEmpty(caption) ? "" : caption;
|
|
|
|
UpdateColor();
|
|
EventInit();
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public BlockButton()
|
|
{
|
|
VarInit(this.Name);
|
|
}
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
/// <param name="caption"></param>
|
|
public BlockButton(string caption)
|
|
{
|
|
VarInit(caption);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region event
|
|
|
|
private void EventInit()
|
|
{
|
|
this.LockedChanged += Event_LockedChanged;
|
|
|
|
this.MouseMove += Event_This_MouseMove;
|
|
this.MouseLeave += Event_This_MouseLeave;
|
|
|
|
{
|
|
|
|
_border.MouseClick += Event_Caption_MouseClick;
|
|
_border.MouseDoubleClick += Event_Caption_MouseDoubleClick;
|
|
_border.MouseDown += Event_Caption_MouseDown;
|
|
_border.MouseUp += Event_Caption_MouseUp;
|
|
_border.MouseMove += Event_Border_MouseMove;
|
|
_border.MouseWheel += Event_Caption_MouseWheel;
|
|
|
|
_border.Click += Event_Caption_Click;
|
|
_border.DoubleClick += Event_Caption_DoubleClick;
|
|
_border.MouseCaptureChanged += Event_Caption_MouseCaptureChanged;
|
|
_border.MouseEnter += Event_Caption_MouseEnter;
|
|
_border.MouseHover += Event_Caption_MouseHover;
|
|
_border.MouseLeave += Event_Caption_MouseLeave;
|
|
|
|
_border.PreviewKeyDown += Event_Caption_PreviewKeyDown;
|
|
|
|
}
|
|
|
|
{
|
|
_caption.MouseClick += Event_Caption_MouseClick;
|
|
_caption.MouseDoubleClick += Event_Caption_MouseDoubleClick;
|
|
_caption.MouseDown += Event_Caption_MouseDown;
|
|
_caption.MouseUp += Event_Caption_MouseUp;
|
|
_caption.MouseMove += Event_Caption_MouseMove;
|
|
_caption.MouseWheel += Event_Caption_MouseWheel;
|
|
|
|
_caption.Click += Event_Caption_Click;
|
|
_caption.DoubleClick += Event_Caption_DoubleClick;
|
|
_caption.MouseCaptureChanged += Event_Caption_MouseCaptureChanged;
|
|
_caption.MouseEnter += Event_Caption_MouseEnter;
|
|
_caption.MouseHover += Event_Caption_MouseHover;
|
|
_caption.MouseLeave += Event_Caption_MouseLeave;
|
|
|
|
_caption.PreviewKeyDown += Event_Caption_PreviewKeyDown;
|
|
|
|
}
|
|
}
|
|
|
|
private void Event_Border_MouseMove(object sender, MouseEventArgs e)
|
|
{
|
|
this.OnMouseMove(e);
|
|
}
|
|
|
|
private void Event_This_MouseMove(object sender, EventArgs e)
|
|
{
|
|
Hover = true;
|
|
}
|
|
|
|
private void Event_This_MouseLeave(object sender, EventArgs e)
|
|
{
|
|
Hover = false;
|
|
}
|
|
|
|
private void Event_LockedChanged(object sender, EventArgs e)
|
|
{
|
|
_caption.ForeColor = Locked ? Color.Gray : NormalText;
|
|
UpdateColor();
|
|
}
|
|
|
|
private void Event_Caption_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
|
|
{
|
|
if (!Locked) this.OnPreviewKeyDown(e);
|
|
}
|
|
|
|
private void Event_Caption_DoubleClick(object sender, EventArgs e)
|
|
{
|
|
if (!Locked) this.OnDoubleClick(e);
|
|
}
|
|
|
|
private void Event_Caption_Click(object sender, EventArgs e)
|
|
{
|
|
if (!Locked) this.OnClick(e);
|
|
}
|
|
|
|
private void Event_Caption_MouseWheel(object sender, MouseEventArgs e)
|
|
{
|
|
if (!Locked)
|
|
{
|
|
int voffset = HaveBorder ? 1 : 0;
|
|
this.OnMouseWheel(new MouseEventArgs(e.Button, e.Clicks, e.X + voffset, e.Y + voffset, e.Delta));
|
|
}
|
|
}
|
|
|
|
private void Event_Caption_MouseMove(object sender, MouseEventArgs e)
|
|
{
|
|
if (!Locked)
|
|
{
|
|
int voffset = HaveBorder ? 1 : 0;
|
|
this.OnMouseMove(new MouseEventArgs(e.Button, e.Clicks, e.X + voffset, e.Y + voffset, e.Delta));
|
|
}
|
|
}
|
|
|
|
private void Event_Caption_MouseLeave(object sender, EventArgs e)
|
|
{
|
|
if (!Locked)
|
|
{
|
|
if (!Locked) this.OnMouseLeave(e);
|
|
}
|
|
}
|
|
|
|
private void Event_Caption_MouseHover(object sender, EventArgs e)
|
|
{
|
|
if (!Locked) this.OnMouseHover(e);
|
|
}
|
|
|
|
private void Event_Caption_MouseEnter(object sender, EventArgs e)
|
|
{
|
|
if (!Locked) this.OnMouseEnter(e);
|
|
}
|
|
|
|
private void Event_Caption_MouseDoubleClick(object sender, MouseEventArgs e)
|
|
{
|
|
if (!Locked)
|
|
{
|
|
int voffset = HaveBorder ? 1 : 0;
|
|
this.OnMouseDoubleClick(new MouseEventArgs(e.Button, e.Clicks, e.X + voffset, e.Y + voffset, e.Delta));
|
|
}
|
|
}
|
|
|
|
private void Event_Caption_MouseCaptureChanged(object sender, EventArgs e)
|
|
{
|
|
if (!Locked) this.OnMouseCaptureChanged(e);
|
|
}
|
|
|
|
private void Event_Caption_MouseUp(object sender, MouseEventArgs e)
|
|
{
|
|
if (!Locked)
|
|
{
|
|
int voffset = HaveBorder ? 1 : 0;
|
|
this.OnMouseUp(new MouseEventArgs(e.Button, e.Clicks, e.X + voffset, e.Y + voffset, e.Delta));
|
|
}
|
|
}
|
|
|
|
private void Event_Caption_MouseClick(object sender, MouseEventArgs e)
|
|
{
|
|
if (!Locked)
|
|
{
|
|
int voffset = HaveBorder ? 1 : 0;
|
|
this.OnMouseClick(new MouseEventArgs(e.Button, e.Clicks, e.X + voffset, e.Y + voffset, e.Delta));
|
|
}
|
|
}
|
|
|
|
private void Event_Caption_MouseDown(object sender, MouseEventArgs e)
|
|
{
|
|
if (!Locked)
|
|
{
|
|
int voffset = HaveBorder ? 1 : 0;
|
|
this.OnMouseDown(new MouseEventArgs(e.Button, e.Clicks, e.X + voffset, e.Y + voffset, e.Delta));
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region accessor
|
|
|
|
/// <summary>
|
|
///
|
|
/// </summary>
|
|
public string Caption { get { return _caption.Text; } set { _caption.Text = string.IsNullOrEmpty(value) ? "" : value; } }
|
|
|
|
/// <summary>鼠标悬停时的背景颜色。</summary>
|
|
public Color HoverWall { get { return _border.HoverWall; } set { _border.HoverWall = value; UpdateColor(); } }
|
|
|
|
/// <summary>鼠标悬停时的文本颜色。</summary>
|
|
public Color HoverText { get { return _hovertext; } set { _hovertext = value; UpdateColor(); } }
|
|
|
|
/// <summary>鼠标悬停时的边框颜色。</summary>
|
|
public Color HoverBorder { get { return _border.HoverBorder; } set { _border.HoverBorder = value; UpdateColor(); } }
|
|
|
|
/// <summary>默认背景颜色。</summary>
|
|
public Color NormalWall { get { return _border.NormalWall; } set { _border.NormalWall = value; UpdateColor(); } }
|
|
|
|
/// <summary>默认文本颜色。</summary>
|
|
public Color NormalText { get { return _normaltext; } set { _normaltext = value; UpdateColor(); } }
|
|
|
|
/// <summary>默认边框颜色。</summary>
|
|
public Color NormalBorder { get { return _border.NormalBorder; } set { _border.NormalBorder = value; UpdateColor(); } }
|
|
|
|
/// <summary>锁定时的背景颜色。</summary>
|
|
public Color LockedWall { get { return _border.LostWall; } set { _border.LostWall = value; UpdateColor(); } }
|
|
|
|
/// <summary>锁定时的文本颜色。</summary>
|
|
public Color LockedText { get { return _lockedtext; } set { _lockedtext = value; UpdateColor(); } }
|
|
|
|
/// <summary>锁定时的边框颜色。</summary>
|
|
public Color LockedlBorder { get { return _border.LostBorder; } set { _border.LostBorder = value; UpdateColor(); } }
|
|
|
|
/// <summary>包含边框。</summary>
|
|
public bool HaveBorder { get { return _border.HaveBorder; } set { _border.HaveBorder = value; UpdateColor(); } }
|
|
|
|
/// <summary>获取 Label 控件。</summary>
|
|
public Label Label { get { return _caption; } }
|
|
|
|
/// <summary>文本的对齐方式。</summary>
|
|
public ContentAlignment TextAlign { get { return _caption.TextAlign; } set { _caption.TextAlign = value; } }
|
|
|
|
/// <summary>锁定按钮,禁止点击。</summary>
|
|
public new bool Locked
|
|
{
|
|
get { return base.Locked; }
|
|
set { base.Locked = value; if (value) _hover = false; UpdateColor(); }
|
|
}
|
|
|
|
/// <summary>文本的外边距。</summary>
|
|
public Padding BodyMargin
|
|
{
|
|
get
|
|
{
|
|
var vmargin = new Padding(_border.Padding.Left + 1, _border.Padding.Top + 1, _border.Padding.Right + 1, _border.Padding.Bottom + 1);
|
|
return vmargin;
|
|
}
|
|
set
|
|
{
|
|
if (value == null) return;
|
|
_border.Padding = new Padding(value.Left - 1, value.Top - 1, value.Right - 1, value.Bottom - 1);
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region private
|
|
|
|
private bool _hover = false;
|
|
|
|
private bool Hover
|
|
{
|
|
get { return _hover; }
|
|
set
|
|
{
|
|
if (Locked) return;
|
|
if (_hover != value)
|
|
{
|
|
_hover = value;
|
|
UpdateColor();
|
|
}
|
|
}
|
|
}
|
|
|
|
private void UpdateColor()
|
|
{
|
|
if (Locked)
|
|
{
|
|
_border.GoLost();
|
|
_caption.ForeColor = _lockedtext;
|
|
_caption.BackColor = _border.LostWall;
|
|
}
|
|
else
|
|
{
|
|
if (_hover)
|
|
{
|
|
_border.GoHover();
|
|
_caption.ForeColor = HoverText;
|
|
_caption.BackColor = _border.HoverWall;
|
|
}
|
|
else
|
|
{
|
|
_border.GoNormal();
|
|
_caption.ForeColor = NormalText;
|
|
_caption.BackColor = _border.NormalWall;
|
|
}
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|