using HotelPms.Share.Windows.GraphicsApi; using HotelPms.Share.Windows.Util; using System; using System.ComponentModel; using System.Drawing; using System.Drawing.Drawing2D; using System.Windows.Forms; namespace HotelPms.Share.Windows.Component { public class ButtonFlat : System.Windows.Forms.Button { private bool m_DisableClickEvent = true; /// /// Click連打禁止 【※注意:ボタンイベントの中でFrom.Show()を使うとShownイベントなども消える場合があります。】 /// [Description("Click連打禁止 【※注意:ボタンイベントの中でFrom.Show()を使うとShownイベントなども消える場合があります。】"), Category("拡張動作"), DefaultValue(true)] public bool DisableClickEvent { get { return m_DisableClickEvent; } set { m_DisableClickEvent = value; } } private LinearGradientMode m_GradientMode = LinearGradientMode.Horizontal; [Description("GradientMode"), Category("拡張動作"), DefaultValue(LinearGradientMode.Horizontal)] public LinearGradientMode GradientMode { get { return m_GradientMode; } set { m_GradientMode = value; Invalidate(); } } private Color m_GradientColor = Color.Empty; [Description("GradientColor"), Category("拡張動作")] public Color GradientColor { get { return m_GradientColor; } set { m_GradientColor = value; Invalidate(); } } private bool m_Selected = false; private bool m_MouseFocused = false; private StringFormat m_StringFormat = new StringFormat(); private Image imgEllipse = null; protected override void Dispose(bool disposing) { if (imgEllipse != null) { imgEllipse.Dispose(); } m_StringFormat.Dispose(); base.Dispose(disposing); } protected override void OnPaint(PaintEventArgs pevent) { base.OnPaint(pevent); if (this.FlatStyle != FlatStyle.Flat) { return; } //ControlPaint.Light Color beginColor = this.m_MouseFocused ? (FlatAppearance.MouseOverBackColor == Color.Empty ? ControlPaint.Light(this.BackColor) : FlatAppearance.MouseOverBackColor) : m_Selected ? (FlatAppearance.MouseDownBackColor == Color.Empty ? ControlPaint.Light(this.BackColor) : FlatAppearance.MouseDownBackColor) : this.BackColor; Color endColor = m_GradientColor == Color.Empty ? beginColor : this.m_MouseFocused ? ControlPaint.LightLight(m_GradientColor) : m_Selected ? ControlPaint.Light(m_GradientColor) : m_GradientColor; //using (LinearGradientBrush brush = new LinearGradientBrush(this.ClientRectangle, Color.FromArgb(0, 136, 0), Color.FromArgb(0, 166, 0), m_GradientMode)) using (LinearGradientBrush brush = new LinearGradientBrush(this.ClientRectangle, beginColor, endColor, m_GradientMode)) { pevent.Graphics.FillRectangle(brush, this.ClientRectangle); } //線 if (this.FlatAppearance.BorderSize > 0 && !this.FlatAppearance.BorderColor.Equals(Color.Empty)) { using (Pen pen = new Pen(this.FlatAppearance.BorderColor, this.FlatAppearance.BorderSize)) { pevent.Graphics.DrawRectangle(pen, new Rectangle(this.ClientRectangle.X, this.ClientRectangle.Y, this.ClientRectangle.Width - this.FlatAppearance.BorderSize, this.ClientRectangle.Height - this.FlatAppearance.BorderSize)); } } Rectangle textRect = ClientRectangle; if (Image != null && imgEllipse == null) { imgEllipse = GdiPlus.CutEllipse(Image, new Rectangle(0, 0, Image.Size.Width, Image.Size.Height), Image.Size); } if (imgEllipse != null) { //高さの80%で出力 int imgHeight = (int)(ClientRectangle.Height * 0.8F); int adding = (int)(textRect.Height - imgHeight) / 2; pevent.Graphics.DrawImage(imgEllipse, new Rectangle(adding, adding, imgHeight, imgHeight)); textRect = new Rectangle(new Point(textRect.Location.X + textRect.Height, 0), new Size(textRect.Width - textRect.Height, textRect.Height)); } SetStringFormat(); using (SolidBrush foreBrush = new SolidBrush(this.ForeColor)) { pevent.Graphics.DrawString(this.Text, this.Font, foreBrush, textRect, m_StringFormat); } } private void SetStringFormat() { switch (this.TextAlign) { case ContentAlignment.BottomCenter: case ContentAlignment.BottomLeft: case ContentAlignment.BottomRight: m_StringFormat.LineAlignment = StringAlignment.Far; break; case ContentAlignment.MiddleCenter: case ContentAlignment.MiddleLeft: case ContentAlignment.MiddleRight: m_StringFormat.LineAlignment = StringAlignment.Center; break; case ContentAlignment.TopCenter: case ContentAlignment.TopLeft: case ContentAlignment.TopRight: m_StringFormat.LineAlignment = StringAlignment.Near; break; } switch (this.TextAlign) { case ContentAlignment.TopLeft: case ContentAlignment.BottomLeft: case ContentAlignment.MiddleLeft: m_StringFormat.Alignment = StringAlignment.Near; break; case ContentAlignment.MiddleCenter: case ContentAlignment.BottomCenter: case ContentAlignment.TopCenter: m_StringFormat.Alignment = StringAlignment.Center; break; case ContentAlignment.BottomRight: case ContentAlignment.MiddleRight: case ContentAlignment.TopRight: m_StringFormat.Alignment = StringAlignment.Far; break; } } protected override void OnEnter(EventArgs e) { base.OnEnter(e); m_Selected = true; } protected override void OnLeave(EventArgs e) { base.OnLeave(e); m_Selected = false; } protected override void OnMouseEnter(EventArgs e) { base.OnMouseEnter(e); m_MouseFocused = true; } protected override void OnMouseLeave(EventArgs e) { base.OnMouseLeave(e); m_MouseFocused = false; } protected override void OnClick(EventArgs e) { //System.Diagnostics.Debug.WriteLine("base.OnClick begin"); base.OnClick(e); //System.Diagnostics.Debug.WriteLine("base.OnClick end "); //保留されているメッセージを削除し、2度押しを許可しない if (m_DisableClickEvent) { RemovePeekMessage.Invoke(); } } } }