378 lines
14 KiB
C#
378 lines
14 KiB
C#
|
using System;
|
|||
|
using System.ComponentModel;
|
|||
|
using System.Drawing;
|
|||
|
using System.Windows.Forms;
|
|||
|
|
|||
|
namespace RyzStudio.Windows.Forms
|
|||
|
{
|
|||
|
public class TImageButton : System.Windows.Forms.Label
|
|||
|
{
|
|||
|
public enum TImageBoxState
|
|||
|
{
|
|||
|
Disabled = 0,
|
|||
|
Normal,
|
|||
|
Hover,
|
|||
|
Active
|
|||
|
}
|
|||
|
|
|||
|
protected bool isEnabled = true;
|
|||
|
protected bool isHover = false;
|
|||
|
protected Color foreColor = Color.Black;
|
|||
|
protected string text;
|
|||
|
protected Size textSize = new Size();
|
|||
|
protected DockStyle textAlign = DockStyle.Fill;
|
|||
|
protected TImageBoxState controlState = TImageBoxState.Normal;
|
|||
|
|
|||
|
|
|||
|
public TImageButton()
|
|||
|
{
|
|||
|
this.AutoEllipsis = true;
|
|||
|
this.AutoSize = false;
|
|||
|
this.BackColor = Color.Transparent;
|
|||
|
//this.BackgroundImage = Properties.Resources.circle;
|
|||
|
this.BackgroundImageLayout = ImageLayout.Center;
|
|||
|
this.BorderStyle = BorderStyle.None;
|
|||
|
this.CausesValidation = true;
|
|||
|
this.DoubleBuffered = true;
|
|||
|
this.FlatStyle = FlatStyle.Flat;
|
|||
|
this.ForeColor = Color.Black;
|
|||
|
this.ImageAlign = ContentAlignment.MiddleCenter;
|
|||
|
//this.Margin = new Padding(0);
|
|||
|
//this.MaximumSize = new Size(135, 135);
|
|||
|
//this.MinimumSize = this.MaximumSize;
|
|||
|
//this.Padding = new Padding(0);
|
|||
|
//this.Size = this.MaximumSize;
|
|||
|
base.TextAlign = ContentAlignment.MiddleCenter;
|
|||
|
this.TextAlign = DockStyle.Fill;
|
|||
|
this.UseCompatibleTextRendering = false;
|
|||
|
this.UseMnemonic = true;
|
|||
|
|
|||
|
this.DisabledForeColor = Color.Black;
|
|||
|
this.ControlState = TImageBoxState.Normal;
|
|||
|
}
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public override bool AllowDrop { get => base.AllowDrop; set => base.AllowDrop = value; }
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public new bool AutoEllipsis { get => base.AutoEllipsis; set => base.AutoEllipsis = value; }
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public override bool AutoSize { get => base.AutoSize; set => base.AutoSize = value; }
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public override Color BackColor { get => base.BackColor; set => base.BackColor = value; }
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public override Image BackgroundImage { get => base.BackgroundImage; set => base.BackgroundImage = value; }
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public override ImageLayout BackgroundImageLayout { get => base.BackgroundImageLayout; set => base.BackgroundImageLayout = value; }
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public new BorderStyle BorderStyle { get => base.BorderStyle; set => base.BorderStyle = value; }
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public new bool CausesValidation { get => base.CausesValidation; set => base.CausesValidation = value; }
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public override Cursor Cursor { get => base.Cursor; set => base.Cursor = value; }
|
|||
|
|
|||
|
//[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public new bool Enabled
|
|||
|
{
|
|||
|
get => isEnabled;
|
|||
|
set
|
|||
|
{
|
|||
|
isEnabled = value;
|
|||
|
|
|||
|
this.ControlState = (isEnabled ? TImageBoxState.Normal : TImageBoxState.Disabled);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public new FlatStyle FlatStyle { get => base.FlatStyle; set => base.FlatStyle = value; }
|
|||
|
|
|||
|
//[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
//public override Font Font { get => base.Font; set => base.Font = value; }
|
|||
|
|
|||
|
//[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public override Color ForeColor { get => foreColor; set => foreColor = value; }
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public new Image Image { get => base.Image; set => base.Image = value; }
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public new ContentAlignment ImageAlign { get => base.ImageAlign; set => base.ImageAlign = value; }
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public new string ImageKey { get => base.ImageKey; set => base.ImageKey = value; }
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public new int ImageIndex { get => base.ImageIndex; set => base.ImageIndex = value; }
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public new ImageList ImageList { get => base.ImageList; set => base.ImageList = value; }
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public new ImeMode ImeMode { get => base.ImeMode; set => base.ImeMode = value; }
|
|||
|
|
|||
|
//[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
//public new Padding Margin { get => base.Margin; set => base.Margin = value; }
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public override Size MaximumSize { get => base.MaximumSize; set => base.MaximumSize = value; }
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public override Size MinimumSize { get => base.MinimumSize; set => base.MinimumSize = value; }
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public new Padding Padding { get => base.Padding; set => base.Padding = value; }
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public override RightToLeft RightToLeft { get => base.RightToLeft; set => base.RightToLeft = value; }
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public new object Tag { get => base.Tag; set => base.Tag = value; }
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
//public new string Text { get => base.Text; set => base.Text = value; }
|
|||
|
public new string Text { get => base.Text; set => base.Text = string.Empty; }
|
|||
|
|
|||
|
[Category("Appearance")]
|
|||
|
public string Text2
|
|||
|
{
|
|||
|
get => text;
|
|||
|
set
|
|||
|
{
|
|||
|
base.Text = string.Empty;
|
|||
|
|
|||
|
text = value ?? string.Empty;
|
|||
|
textSize = TextRenderer.MeasureText(text, this.Font);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
//public new ContentAlignment TextAlign { get => base.TextAlign; set => base.TextAlign = value; }
|
|||
|
|
|||
|
[Category("Appearance")]
|
|||
|
public new DockStyle TextAlign { get => textAlign; set => textAlign = value; }
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public new bool UseCompatibleTextRendering { get => base.UseCompatibleTextRendering; set => base.UseCompatibleTextRendering = value; }
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public new bool UseMnemonic { get => base.UseMnemonic; set => base.UseMnemonic = value; }
|
|||
|
|
|||
|
[Browsable(false), EditorBrowsable(EditorBrowsableState.Never)]
|
|||
|
public new bool UseWaitCursor { get => base.UseWaitCursor; set => base.UseWaitCursor = value; }
|
|||
|
|
|||
|
protected override void OnPaint(PaintEventArgs e)
|
|||
|
{
|
|||
|
base.OnPaint(e);
|
|||
|
|
|||
|
Graphics g = e.Graphics;
|
|||
|
|
|||
|
Point pos = calcTextPosition();
|
|||
|
|
|||
|
TextRenderer.DrawText(e.Graphics, this.Text2, this.Font, pos, base.ForeColor);
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnClick(EventArgs e)
|
|||
|
{
|
|||
|
if (this.Enabled || this.AllowClickOnDisabled)
|
|||
|
{
|
|||
|
base.OnClick(e);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnDoubleClick(EventArgs e)
|
|||
|
{
|
|||
|
if (this.Enabled || this.AllowClickOnDisabled)
|
|||
|
{
|
|||
|
base.OnDoubleClick(e);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnFontChanged(EventArgs e)
|
|||
|
{
|
|||
|
base.OnFontChanged(e);
|
|||
|
|
|||
|
this.Text2 = this.Text2;
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnMouseClick(MouseEventArgs e)
|
|||
|
{
|
|||
|
if (!this.Enabled && !this.AllowClickOnDisabled) return;
|
|||
|
if (e.Button != MouseButtons.Left) return;
|
|||
|
|
|||
|
base.OnMouseClick(e);
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnMouseDoubleClick(MouseEventArgs e)
|
|||
|
{
|
|||
|
if (!this.Enabled && !this.AllowClickOnDisabled) return;
|
|||
|
if (e.Button != MouseButtons.Left) return;
|
|||
|
|
|||
|
base.OnMouseDoubleClick(e);
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnMouseDown(MouseEventArgs e)
|
|||
|
{
|
|||
|
if (e.Button != MouseButtons.Left) return;
|
|||
|
|
|||
|
this.ControlState = (this.Enabled ? TImageBoxState.Active : TImageBoxState.Disabled);
|
|||
|
|
|||
|
base.OnMouseDown(e);
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnMouseEnter(EventArgs e)
|
|||
|
{
|
|||
|
isHover = true;
|
|||
|
|
|||
|
this.ControlState = (this.Enabled ? (isHover ? TImageBoxState.Hover : TImageBoxState.Normal) : TImageBoxState.Disabled);
|
|||
|
|
|||
|
base.OnMouseEnter(e);
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnMouseLeave(EventArgs e)
|
|||
|
{
|
|||
|
isHover = false;
|
|||
|
|
|||
|
this.ControlState = (this.Enabled ? (isHover ? TImageBoxState.Hover : TImageBoxState.Normal) : TImageBoxState.Disabled);
|
|||
|
|
|||
|
base.OnMouseLeave(e);
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnMouseUp(MouseEventArgs e)
|
|||
|
{
|
|||
|
this.ControlState = (this.Enabled ? (isHover ? TImageBoxState.Hover : TImageBoxState.Normal) : TImageBoxState.Disabled);
|
|||
|
|
|||
|
base.OnMouseUp(e);
|
|||
|
}
|
|||
|
|
|||
|
protected override void OnCreateControl()
|
|||
|
{
|
|||
|
base.OnCreateControl();
|
|||
|
|
|||
|
this.ControlState = this.ControlState;
|
|||
|
this.AutoSize = false;
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
[Category("Appearance (Background)")]
|
|||
|
public bool UseBackImage { get; set; } = true;
|
|||
|
|
|||
|
[Category("Appearance (Foreground)")]
|
|||
|
public bool UseForeImage { get; set; } = false;
|
|||
|
|
|||
|
[Category("Appearance")]
|
|||
|
public Color DisabledForeColor { get; set; }
|
|||
|
|
|||
|
[Category("Appearance")]
|
|||
|
public int TextOffset { get; set; } = 0;
|
|||
|
|
|||
|
[Category("Behavior")]
|
|||
|
public bool AllowClickOnDisabled { get; set; } = false;
|
|||
|
|
|||
|
[Category("Appearance (Foreground)")]
|
|||
|
public Image NormalImage { get; set; } = null;
|
|||
|
|
|||
|
[Category("Appearance (Foreground)")]
|
|||
|
public Image HoverImage { get; set; } = null;
|
|||
|
|
|||
|
[Category("Appearance (Foreground)")]
|
|||
|
public Image ActiveImage { get; set; } = null;
|
|||
|
|
|||
|
[Category("Appearance (Foreground)")]
|
|||
|
public Image DisabledImage { get; set; } = null;
|
|||
|
|
|||
|
[Category("Appearance (Background)")]
|
|||
|
public Image NormalBackImage { get; set; } = null;
|
|||
|
|
|||
|
[Category("Appearance (Background)")]
|
|||
|
public Image HoverBackImage { get; set; } = null;
|
|||
|
|
|||
|
[Category("Appearance (Background)")]
|
|||
|
public Image ActiveBackImage { get; set; } = null;
|
|||
|
|
|||
|
[Category("Appearance (Background)")]
|
|||
|
public Image DisabledBackImage { get; set; } = null;
|
|||
|
|
|||
|
|
|||
|
protected TImageBoxState ControlState
|
|||
|
{
|
|||
|
get => controlState;
|
|||
|
set
|
|||
|
{
|
|||
|
controlState = value;
|
|||
|
|
|||
|
switch (controlState)
|
|||
|
{
|
|||
|
case TImageBoxState.Disabled:
|
|||
|
if (this.UseBackImage) this.BackgroundImage = this.DisabledBackImage;
|
|||
|
if (this.UseForeImage) this.Image = this.DisabledImage;
|
|||
|
base.ForeColor = this.DisabledForeColor;
|
|||
|
|
|||
|
break;
|
|||
|
case TImageBoxState.Normal:
|
|||
|
if (this.UseBackImage) this.BackgroundImage = this.NormalBackImage;
|
|||
|
if (this.UseForeImage) this.Image = this.NormalImage;
|
|||
|
base.ForeColor = this.ForeColor;
|
|||
|
|
|||
|
break;
|
|||
|
case TImageBoxState.Hover:
|
|||
|
if (this.UseBackImage) this.BackgroundImage = this.HoverBackImage;
|
|||
|
if (this.UseForeImage) this.Image = this.HoverImage;
|
|||
|
base.ForeColor = this.ForeColor;
|
|||
|
|
|||
|
break;
|
|||
|
case TImageBoxState.Active:
|
|||
|
if (this.UseBackImage) this.BackgroundImage = this.ActiveBackImage;
|
|||
|
if (this.UseForeImage) this.Image = this.ActiveImage;
|
|||
|
base.ForeColor = this.ForeColor;
|
|||
|
|
|||
|
break;
|
|||
|
default: break;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
protected Point calcTextPosition()
|
|||
|
{
|
|||
|
Point rs = new Point();
|
|||
|
|
|||
|
switch (this.TextAlign)
|
|||
|
{
|
|||
|
case DockStyle.Top:
|
|||
|
rs.X = ((this.DisplayRectangle.Width - textSize.Width) / 2);
|
|||
|
rs.Y = ((this.DisplayRectangle.Height / 2) - textSize.Height - this.TextOffset);
|
|||
|
break;
|
|||
|
case DockStyle.Bottom:
|
|||
|
rs.X = ((this.DisplayRectangle.Width - textSize.Width) / 2);
|
|||
|
rs.Y = ((this.DisplayRectangle.Height / 2) + this.TextOffset);
|
|||
|
break;
|
|||
|
case DockStyle.Left:
|
|||
|
rs.X = ((this.DisplayRectangle.Width / 2) - textSize.Width - this.TextOffset);
|
|||
|
rs.Y = ((this.DisplayRectangle.Height - textSize.Height) / 2);
|
|||
|
break;
|
|||
|
case DockStyle.Right:
|
|||
|
rs.X = ((this.DisplayRectangle.Width / 2) + this.TextOffset);
|
|||
|
rs.Y = ((this.DisplayRectangle.Height - textSize.Height) / 2);
|
|||
|
break;
|
|||
|
case DockStyle.Fill:
|
|||
|
case DockStyle.None:
|
|||
|
default:
|
|||
|
rs.X = ((this.DisplayRectangle.Width - textSize.Width) / 2);
|
|||
|
rs.Y = ((this.DisplayRectangle.Height - textSize.Height) / 2);
|
|||
|
break;
|
|||
|
}
|
|||
|
|
|||
|
return rs;
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
}
|