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;
|
|
/// <summary>
|
/// Click連打禁止 【※注意:ボタンイベントの中でFrom.Show()を使うとShownイベントなども消える場合があります。】
|
/// </summary>
|
[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(); }
|
}
|
}
|
}
|