You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
330 lines
10 KiB
C#
330 lines
10 KiB
C#
using System;
|
|
using System.Windows.Forms;
|
|
using System.ComponentModel;
|
|
using System.Drawing;
|
|
using System.Drawing.Drawing2D;
|
|
|
|
namespace Mesnac.Action.Compressor
|
|
{
|
|
internal class KeyboardButton : Button {
|
|
private Color defaultStartColor;
|
|
private Color defautEndColor;
|
|
private Color mouseEnterStartColor;
|
|
private Color mouseEnterEndColor;
|
|
private Color mouseDownStartColor;
|
|
private Color mouseDownEndColor;
|
|
private Color defaultBorderColor;
|
|
private Color mouseEnterBorderColor;
|
|
|
|
private Color currentStartColor;
|
|
private Color currentEndColor;
|
|
private Color currentBorderColor;
|
|
|
|
private bool antialias;
|
|
private bool isChecked;
|
|
private bool showFocusRectangle;
|
|
private short vkCode;
|
|
|
|
private static readonly object EventCheckChanged = new object();
|
|
|
|
public KeyboardButton()
|
|
: base() {
|
|
base.Size = new System.Drawing.Size(107, 31);
|
|
base.Font = new Font("Microsoft Sans Serif", 9.75F, FontStyle.Bold, GraphicsUnit.Point, ((byte)(0)));
|
|
|
|
this.defaultStartColor = Color.FromArgb(214, 230, 251);
|
|
this.defautEndColor = Color.FromArgb(154, 187, 234);
|
|
this.mouseEnterStartColor = Color.FromArgb(255, 240, 197);
|
|
this.mouseEnterEndColor = Color.FromArgb(255, 213, 152);
|
|
this.mouseDownStartColor = Color.FromArgb(254, 151, 84);
|
|
this.mouseDownEndColor = Color.FromArgb(255, 199, 131);
|
|
this.defaultBorderColor = Color.FromArgb(59, 97, 156);
|
|
this.mouseEnterBorderColor = Color.FromArgb(0, 0, 128);
|
|
|
|
this.currentStartColor = this.defaultStartColor;
|
|
this.currentEndColor = this.defautEndColor;
|
|
this.currentBorderColor = this.defaultBorderColor;
|
|
this.antialias = true;
|
|
this.isChecked = false;
|
|
this.showFocusRectangle = false;
|
|
|
|
base.Paint += new PaintEventHandler(LifeButton_Paint);
|
|
}
|
|
|
|
[Category("Data")]
|
|
public short VKCode {
|
|
get {
|
|
return this.vkCode;
|
|
}
|
|
set {
|
|
this.vkCode = value;
|
|
}
|
|
}
|
|
|
|
[Category("Appearance")]
|
|
public Color DefaultStartColor {
|
|
get {
|
|
return this.defaultStartColor;
|
|
}
|
|
set {
|
|
this.defaultStartColor = value;
|
|
}
|
|
}
|
|
|
|
[Category("Appearance")]
|
|
public Color DefautEndColor {
|
|
get {
|
|
return this.defautEndColor;
|
|
}
|
|
set {
|
|
this.defautEndColor = value;
|
|
}
|
|
}
|
|
|
|
[Category("Appearance")]
|
|
public Color MouseEnterStartColor {
|
|
get {
|
|
return this.mouseEnterStartColor;
|
|
}
|
|
set {
|
|
this.mouseEnterStartColor = value;
|
|
}
|
|
}
|
|
|
|
[Category("Appearance")]
|
|
public Color MouseEnterEndColor {
|
|
get {
|
|
return this.mouseEnterEndColor;
|
|
}
|
|
set {
|
|
this.mouseEnterEndColor = value;
|
|
}
|
|
}
|
|
|
|
[Category("Appearance")]
|
|
public Color MouseDownStartColor {
|
|
get {
|
|
return this.mouseDownStartColor;
|
|
}
|
|
set {
|
|
this.mouseDownStartColor = value;
|
|
}
|
|
}
|
|
|
|
[Category("Appearance")]
|
|
public Color MouseDownEndColor {
|
|
get {
|
|
return this.mouseDownEndColor;
|
|
}
|
|
set {
|
|
this.mouseDownEndColor = value;
|
|
}
|
|
}
|
|
|
|
[Category("Appearance")]
|
|
public Color DefaultBorderColor {
|
|
get {
|
|
return this.defaultBorderColor;
|
|
}
|
|
set {
|
|
this.defaultBorderColor = value;
|
|
}
|
|
}
|
|
|
|
[Category("Appearance")]
|
|
public Color MouseEnterBorderColor {
|
|
get {
|
|
return this.mouseEnterBorderColor;
|
|
}
|
|
set {
|
|
this.mouseEnterBorderColor = value;
|
|
}
|
|
}
|
|
|
|
[Browsable(false)]
|
|
public Color CurrentBorderColor {
|
|
get {
|
|
return this.currentBorderColor;
|
|
}
|
|
}
|
|
|
|
[Category("Appearance")]
|
|
public bool AntiAlias {
|
|
get {
|
|
return this.antialias;
|
|
}
|
|
set {
|
|
this.antialias = value;
|
|
this.Invalidate();
|
|
}
|
|
}
|
|
|
|
[Category("Appearance")]
|
|
public bool ShowFocusRectangle {
|
|
get {
|
|
return this.showFocusRectangle;
|
|
}
|
|
set {
|
|
this.showFocusRectangle = value;
|
|
}
|
|
}
|
|
|
|
[Category("Appearance")]
|
|
public bool Checked {
|
|
get {
|
|
return this.isChecked;
|
|
}
|
|
set {
|
|
this.isChecked = value;
|
|
this.Invalidate();
|
|
|
|
CheckChangedEventArgs args = new CheckChangedEventArgs(this.isChecked);
|
|
OnCheckChanged(args);
|
|
}
|
|
}
|
|
|
|
public event EventHandler<CheckChangedEventArgs> CheckChanged {
|
|
add {
|
|
base.Events.AddHandler(EventCheckChanged, value);
|
|
}
|
|
remove {
|
|
base.Events.RemoveHandler(EventCheckChanged, value);
|
|
}
|
|
}
|
|
|
|
protected virtual void OnCheckChanged(CheckChangedEventArgs args) {
|
|
EventHandler<CheckChangedEventArgs> handler = base.Events[EventCheckChanged] as EventHandler<CheckChangedEventArgs>;
|
|
if (handler != null) {
|
|
handler(this, args);
|
|
}
|
|
}
|
|
|
|
private void LifeButton_Paint(object sender, PaintEventArgs pevent) {
|
|
if (this.ClientSize.Width > 3 && this.ClientSize.Height > 3) {
|
|
Graphics g = pevent.Graphics;
|
|
|
|
if (this.antialias) {
|
|
g.SmoothingMode = SmoothingMode.AntiAlias;
|
|
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
|
|
}
|
|
|
|
Rectangle rect = new Rectangle(0, 0, this.ClientSize.Width - 1, this.ClientSize.Height - 1);
|
|
|
|
Brush fillBrush = this.isChecked ?
|
|
new LinearGradientBrush(base.ClientRectangle, this.mouseDownStartColor, this.mouseDownEndColor, LinearGradientMode.Vertical) :
|
|
new LinearGradientBrush(base.ClientRectangle, this.currentStartColor, this.currentEndColor, LinearGradientMode.Vertical);
|
|
|
|
g.FillRectangle(fillBrush, base.ClientRectangle);
|
|
fillBrush.Dispose();
|
|
|
|
if (this.BackgroundImage != null) {
|
|
if (base.Enabled) {
|
|
g.DrawImage(base.BackgroundImage, rect);
|
|
} else {
|
|
Image image = ImageProcessHelper.CreateDisabledImage(base.BackgroundImage);
|
|
g.DrawImage(image, rect);
|
|
image.Dispose();
|
|
}
|
|
}
|
|
|
|
using (Pen pen = new Pen(this.isChecked ? this.mouseEnterBorderColor : this.currentBorderColor, 1)) {
|
|
g.DrawRectangle(pen, rect);
|
|
|
|
if (base.Focused && this.showFocusRectangle) {
|
|
pen.Color = this.defaultBorderColor;
|
|
pen.DashStyle = DashStyle.Dot;
|
|
rect.Inflate(-2, -2);
|
|
|
|
g.DrawRectangle(pen, rect);
|
|
}
|
|
}
|
|
|
|
StringFormat format = new StringFormat();
|
|
SetTextAlign(format);
|
|
format.HotkeyPrefix = System.Drawing.Text.HotkeyPrefix.Show;
|
|
|
|
using (Brush brush = new SolidBrush(base.ForeColor)) {
|
|
if (rect.Width > 4 && rect.Height > 2) {
|
|
rect.Inflate(-4, -2);
|
|
g.DrawString(base.Text, base.Font, (this.Enabled ? brush : Brushes.Gray), rect, format);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
protected override void OnMouseEnter(EventArgs e) {
|
|
this.currentStartColor = this.mouseEnterStartColor;
|
|
this.currentEndColor = this.mouseEnterEndColor;
|
|
this.currentBorderColor = this.mouseEnterBorderColor;
|
|
|
|
this.Invalidate();
|
|
|
|
base.OnMouseEnter(e);
|
|
}
|
|
|
|
protected override void OnMouseLeave(EventArgs e) {
|
|
this.currentStartColor = this.defaultStartColor;
|
|
this.currentEndColor = this.defautEndColor;
|
|
this.currentBorderColor = this.defaultBorderColor;
|
|
|
|
this.Invalidate();
|
|
|
|
base.OnMouseLeave(e);
|
|
}
|
|
|
|
protected override void OnMouseDown(MouseEventArgs mevent) {
|
|
this.currentStartColor = this.mouseDownStartColor;
|
|
this.currentEndColor = this.mouseDownEndColor;
|
|
|
|
this.Invalidate();
|
|
|
|
base.OnMouseDown(mevent);
|
|
}
|
|
|
|
protected override void OnMouseUp(MouseEventArgs mevent) {
|
|
this.currentStartColor = this.mouseEnterStartColor;
|
|
this.currentEndColor = this.mouseEnterEndColor;
|
|
|
|
base.OnMouseUp(mevent);
|
|
}
|
|
|
|
private void SetTextAlign(StringFormat format) {
|
|
string textAlign = base.TextAlign.ToString("G");
|
|
|
|
if (textAlign.IndexOf("Right") >= 0) {
|
|
format.Alignment = StringAlignment.Far;
|
|
} else if (textAlign.IndexOf("Center") >= 0) {
|
|
format.Alignment = StringAlignment.Center;
|
|
} else if (textAlign.IndexOf("Left") >= 0) {
|
|
format.Alignment = StringAlignment.Near;
|
|
}
|
|
|
|
if (textAlign.IndexOf("Bottom") >= 0) {
|
|
format.LineAlignment = StringAlignment.Far;
|
|
} else if (textAlign.IndexOf("Middle") >= 0) {
|
|
format.LineAlignment = StringAlignment.Center;
|
|
} else if (textAlign.IndexOf("Top") >= 0) {
|
|
format.LineAlignment = StringAlignment.Near;
|
|
}
|
|
}
|
|
}
|
|
|
|
public class CheckChangedEventArgs : EventArgs {
|
|
private bool isChecked;
|
|
|
|
public CheckChangedEventArgs(bool isChecked)
|
|
: base() {
|
|
this.isChecked = isChecked;
|
|
}
|
|
|
|
public bool Checked {
|
|
get {
|
|
return this.isChecked;
|
|
}
|
|
set {
|
|
this.isChecked = value;
|
|
}
|
|
}
|
|
}
|
|
}
|