From 1a1c8e71fcd14858f595029f089b2d4a00202b32 Mon Sep 17 00:00:00 2001
From: ogi <Administrator@S-OGI-PC>
Date: Fri, 05 Dec 2025 09:24:16 +0900
Subject: [PATCH] プロジェクトファイルを追加。

---
 HotelPms.Share.Windows/Component/MaterialButton.cs |  269 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 269 insertions(+), 0 deletions(-)

diff --git a/HotelPms.Share.Windows/Component/MaterialButton.cs b/HotelPms.Share.Windows/Component/MaterialButton.cs
new file mode 100644
index 0000000..657e187
--- /dev/null
+++ b/HotelPms.Share.Windows/Component/MaterialButton.cs
@@ -0,0 +1,269 @@
+using System.ComponentModel;
+using System.Drawing;
+using System.Drawing.Drawing2D;
+using System.Drawing.Text;
+using System.Windows.Forms;
+using HotelPms.Share.Windows.Animations;
+using System;
+using System.Drawing.Imaging;
+
+namespace HotelPms.Share.Windows.Component
+{
+    public class MaterialButton : Button
+    {
+        private float radius = 10F;
+
+        /// <summary>
+        /// 半径
+        /// </summary>
+        public float Radius
+        { 
+            get { return radius; }
+            set { radius = value; Invalidate(); }                 
+        }
+
+        private readonly AnimationManager _animationManager;
+
+        private bool m_Selected = false;
+        private bool m_MouseFocused = false;
+        private StringFormat m_StringFormat = new StringFormat();
+
+        //public event EventHandler ClickFinished;
+        public new event EventHandler Click;
+
+        public MaterialButton()
+        {
+            BackColor = Color.FromArgb(255, 0, 105, 217);
+            ForeColor = Color.White;
+            Cursor = Cursors.Hand;
+            _animationManager = new AnimationManager(false)
+            {
+                Increment = 0.03,
+                AnimationType = AnimationType.EaseOut
+            };
+            _animationManager.OnAnimationProgress += sender => Invalidate();
+            _animationManager.OnAnimationFinished += _animationManager_OnAnimationFinished;
+
+            FlatStyle = FlatStyle.Flat;
+            //AutoSizeMode = AutoSizeMode.GrowAndShrink;
+            //AutoSize = true;
+        }
+
+        private void _animationManager_OnAnimationFinished(object sender)
+        {
+            Click?.Invoke(this, new EventArgs());
+            //ClickFinished?.Invoke(this, new EventArgs());
+        }
+
+        protected override void Dispose(bool disposing)
+        {
+            m_StringFormat.Dispose();
+            base.Dispose(disposing);
+        }
+
+        public override string Text
+        {
+            get { return base.Text; }
+            set
+            {
+                base.Text = value;
+                Invalidate();
+            }
+        }
+
+        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 OnMouseUp(MouseEventArgs mevent)
+        {
+            base.OnMouseUp(mevent);
+
+            _animationManager.StartNewAnimation(AnimationDirection.In, mevent.Location);
+        }
+
+        protected override void OnPreviewKeyDown(PreviewKeyDownEventArgs e)
+        {
+            base.OnPreviewKeyDown(e);
+
+            if (e.KeyCode == Keys.Enter)
+            {
+                _animationManager.StartNewAnimation(AnimationDirection.In, new Point(Width / 2, Height / 2));
+            }
+        }
+
+        protected override void OnPaint(PaintEventArgs pevent)
+        {
+            var g = pevent.Graphics;
+            g.SmoothingMode = SmoothingMode.AntiAlias;
+
+            g.Clear(Parent.BackColor);
+
+            if (radius.CompareTo(0F) <= 0)
+            {
+                Color beginColor = m_MouseFocused ? (FlatAppearance.MouseOverBackColor == Color.Empty ? ControlPaint.Light(BackColor) : FlatAppearance.MouseOverBackColor) : m_Selected ? (FlatAppearance.MouseDownBackColor == Color.Empty ? ControlPaint.Light(BackColor) : FlatAppearance.MouseDownBackColor) : BackColor;
+                using (SolidBrush backBrush = new SolidBrush(beginColor))
+                {
+                    g.FillRectangle(backBrush, ClientRectangle);
+                }
+
+                //線
+                if (this.FlatAppearance.BorderSize > 0 && !this.FlatAppearance.BorderColor.Equals(Color.Empty))
+                {
+                    using (Pen pen = new Pen(this.FlatAppearance.BorderColor, this.FlatAppearance.BorderSize))
+                    {
+                        g.DrawRectangle(pen, ClientRectangle);
+                    }
+                }
+            }
+            else
+            {
+                using (var backgroundPath = CreateRoundRect(ClientRectangle.X, ClientRectangle.Y, ClientRectangle.Width - 1, ClientRectangle.Height - 1, radius))
+                {
+                    Color beginColor = m_MouseFocused ? (FlatAppearance.MouseOverBackColor == Color.Empty ? ControlPaint.Light(BackColor) : FlatAppearance.MouseOverBackColor) : m_Selected ? (FlatAppearance.MouseDownBackColor == Color.Empty ? ControlPaint.LightLight(BackColor) : FlatAppearance.MouseDownBackColor) : BackColor;
+                    using (SolidBrush backBrush = new SolidBrush(beginColor))
+                    {
+                        g.FillPath(backBrush, backgroundPath);
+                    }
+
+                    //線
+                    if (this.FlatAppearance.BorderSize > 0 && !this.FlatAppearance.BorderColor.Equals(Color.Empty))
+                    {
+                        using (Pen pen = new Pen(this.FlatAppearance.BorderColor, this.FlatAppearance.BorderSize))
+                        {
+                            g.DrawPath(pen, backgroundPath);
+                        }
+                    }
+                }
+            }
+
+            if (_animationManager.IsAnimating())
+            {
+                for (int i = 0; i < _animationManager.GetAnimationCount(); i++)
+                {
+                    var animationValue = _animationManager.GetProgress(i);
+                    var animationSource = _animationManager.GetSource(i);
+                    using (var rippleBrush = new SolidBrush(Color.FromArgb((int)(51 - (animationValue * 50)), Color.White)))
+                    {
+                        var rippleSize = (int)(animationValue * Width * 2);
+                        g.FillEllipse(rippleBrush, new Rectangle(animationSource.X - rippleSize / 2, animationSource.Y - rippleSize / 2, rippleSize, rippleSize));
+                    }
+                }
+            }
+
+            Rectangle textR = ClientRectangle;
+            if (Image != null)
+            {
+                int x = 5;
+                float rate = 0.5F;
+                int width = (int)(ClientRectangle.Width * 0.3) - x;
+                int height = (int)(ClientRectangle.Height * rate);
+
+                //Zoom
+                if ((double)Image.Width / (double)Image.Height > (double)width / (double)height) // image is wider 
+                {
+                    height = (int)((double)Image.Height / (double)Image.Width * (double)width);
+                }
+                else
+                {
+                    width = (int)((double)Image.Width / (double)Image.Height * (double)height);
+                }
+
+                //居中
+                Rectangle imgRect = new Rectangle(x, (ClientRectangle.Height - height) / 2, width, height);
+                ImageAttributes vAttr = new ImageAttributes();
+                vAttr.SetColorKey((Image as Bitmap).GetPixel(0, 0), (Image as Bitmap).GetPixel(0, 0));
+                pevent.Graphics.DrawImage(Image, imgRect, 0, 0, Image.Width, Image.Height, GraphicsUnit.Pixel, vAttr);
+
+                textR = new Rectangle(new Point(x + ClientRectangle.X + width, ClientRectangle.Y), new Size(ClientRectangle.Width - width, ClientRectangle.Height));
+            }
+
+            SetStringFormat();
+            using (SolidBrush foreBrush = new SolidBrush(this.ForeColor))
+            {
+                g.DrawString(Text, Font, foreBrush, textR, m_StringFormat);
+            }
+        }
+
+        public static GraphicsPath CreateRoundRect(float x, float y, float width, float height, float radius)
+        {
+            var gp = new GraphicsPath();
+            gp.AddLine(x + radius, y, x + width - (radius * 2), y);
+            gp.AddArc(x + width - (radius * 2), y, radius * 2, radius * 2, 270, 90);
+            gp.AddLine(x + width, y + radius, x + width, y + height - (radius * 2));
+            gp.AddArc(x + width - (radius * 2), y + height - (radius * 2), radius * 2, radius * 2, 0, 90);
+            gp.AddLine(x + width - (radius * 2), y + height, x + radius, y + height);
+            gp.AddArc(x, y + height - (radius * 2), radius * 2, radius * 2, 90, 90);
+            gp.AddLine(x, y + height - (radius * 2), x, y + radius);
+            gp.AddArc(x, y, radius * 2, radius * 2, 180, 90);
+            gp.CloseFigure();
+            return gp;
+        }
+
+        public static GraphicsPath CreateRoundRect(Rectangle rect, float radius)
+        {
+            return CreateRoundRect(rect.X, rect.Y, rect.Width, rect.Height, radius);
+        }
+
+        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;
+            }
+        }
+    }
+}

--
Gitblit v1.10.0