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/Util/FormBase.cs |  647 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 647 insertions(+), 0 deletions(-)

diff --git a/HotelPms.Share.Windows/Util/FormBase.cs b/HotelPms.Share.Windows/Util/FormBase.cs
new file mode 100644
index 0000000..69abe02
--- /dev/null
+++ b/HotelPms.Share.Windows/Util/FormBase.cs
@@ -0,0 +1,647 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Drawing.Text;
+using System.Linq;
+using System.Runtime.InteropServices;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+
+namespace HotelPms.Share.Windows.Util
+{
+    public partial class FormBase : Form
+    {
+        #region API
+
+        [DllImport("user32.dll")]
+        public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
+
+        [DllImport("user32.dll")]
+        public static extern bool ReleaseCapture();
+
+        [DllImport("user32.dll")]
+        public static extern int TrackPopupMenuEx(IntPtr hmenu, uint fuFlags, int x, int y, IntPtr hwnd, IntPtr lptpm);
+
+        [DllImport("user32.dll")]
+        public static extern IntPtr GetSystemMenu(IntPtr hWnd, bool bRevert);
+
+        [DllImport("user32.dll")]
+        public static extern IntPtr MonitorFromWindow(IntPtr hwnd, uint dwFlags);
+
+        [DllImport("User32.dll", CharSet = CharSet.Auto)]
+        public static extern bool GetMonitorInfo(HandleRef hmonitor, [In, Out] MONITORINFOEX info);
+
+        public const int WM_NCLBUTTONDOWN = 0xA1;
+        public const int HT_CAPTION = 0x2;
+        public const int WM_MOUSEMOVE = 0x0200;
+        public const int WM_LBUTTONDOWN = 0x0201;
+        public const int WM_LBUTTONUP = 0x0202;
+        public const int WM_LBUTTONDBLCLK = 0x0203;
+        public const int WM_RBUTTONDOWN = 0x0204;
+        private const int HTBOTTOMLEFT = 16;
+        private const int HTBOTTOMRIGHT = 17;
+        private const int HTLEFT = 10;
+        private const int HTRIGHT = 11;
+        private const int HTBOTTOM = 15;
+        private const int HTTOP = 12;
+        private const int HTTOPLEFT = 13;
+        private const int HTTOPRIGHT = 14;
+        private const int BORDER_WIDTH = 7;
+
+        private const int WMSZ_TOP = 3;
+        private const int WMSZ_TOPLEFT = 4;
+        private const int WMSZ_TOPRIGHT = 5;
+        private const int WMSZ_LEFT = 1;
+        private const int WMSZ_RIGHT = 2;
+        private const int WMSZ_BOTTOM = 6;
+        private const int WMSZ_BOTTOMLEFT = 7;
+        private const int WMSZ_BOTTOMRIGHT = 8;
+
+        private readonly Dictionary<int, int> _resizingLocationsToCmd = new Dictionary<int, int>
+        {
+            {HTTOP,         WMSZ_TOP},
+            {HTTOPLEFT,     WMSZ_TOPLEFT},
+            {HTTOPRIGHT,    WMSZ_TOPRIGHT},
+            {HTLEFT,        WMSZ_LEFT},
+            {HTRIGHT,       WMSZ_RIGHT},
+            {HTBOTTOM,      WMSZ_BOTTOM},
+            {HTBOTTOMLEFT,  WMSZ_BOTTOMLEFT},
+            {HTBOTTOMRIGHT, WMSZ_BOTTOMRIGHT}
+        };
+
+        private const uint TPM_LEFTALIGN = 0x0000;
+        private const uint TPM_RETURNCMD = 0x0100;
+
+        private const int WM_SYSCOMMAND = 0x0112;
+        private const int WS_MINIMIZEBOX = 0x20000;
+        private const int WS_SYSMENU = 0x00080000;
+
+        private const int MONITOR_DEFAULTTONEAREST = 2;
+
+        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto, Pack = 4)]
+        public class MONITORINFOEX
+        {
+            public int cbSize = Marshal.SizeOf(typeof(MONITORINFOEX));
+            public RECT rcMonitor = new RECT();
+            public RECT rcWork = new RECT();
+            public int dwFlags = 0;
+            [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)]
+            public char[] szDevice = new char[32];
+        }
+
+        [StructLayout(LayoutKind.Sequential)]
+        public struct RECT
+        {
+            public int left;
+            public int top;
+            public int right;
+            public int bottom;
+
+            public int Width()
+            {
+                return right - left;
+            }
+
+            public int Height()
+            {
+                return bottom - top;
+            }
+        }
+
+        #endregion
+
+        private enum ResizeDirection
+        {
+            BottomLeft,
+            Left,
+            Right,
+            BottomRight,
+            Bottom,
+            None
+        }
+
+        private enum ButtonState
+        {
+            XOver,
+            MaxOver,
+            MinOver,
+            HelpOver,
+            XDown,
+            MaxDown,
+            MinDown,
+            HelpDown,
+            None
+        }
+
+        private readonly Cursor[] _resizeCursors = { Cursors.SizeNESW, Cursors.SizeWE, Cursors.SizeNWSE, Cursors.SizeWE, Cursors.SizeNS };
+
+        private ResizeDirection _resizeDir;
+        private ButtonState _buttonState = ButtonState.None;
+
+        private Rectangle _helpButtonBounds;
+        private Rectangle _minButtonBounds;
+        private Rectangle _maxButtonBounds;
+        private Rectangle _xButtonBounds;
+        private Rectangle _statusBarBounds;
+
+        private bool _maximized;
+        private Size _previousSize;
+        private Point _previousLocation;
+        private bool _headerMouseDown;
+
+        private Font helpFont = new Font(FontFamily.GenericSansSerif, 16F);
+        private StringFormat helpFormat = new StringFormat { LineAlignment = StringAlignment.Center, Alignment = StringAlignment.Center, FormatFlags = StringFormatFlags.NoWrap, };
+        private StringFormat titleFormat = new StringFormat { LineAlignment = StringAlignment.Center, FormatFlags = StringFormatFlags.NoWrap, };
+
+        private bool showHelpIcon = false;
+
+        public bool ShowHelpIcon
+        {
+            get { return showHelpIcon; }
+            set { showHelpIcon = value; Invalidate(); }
+        }
+
+        public bool Sizable { get; set; } = true;
+
+        /// <summary>
+        /// フォームの背景色
+        /// </summary>
+        public Color BackgroundColor { get; set; } = Color.FromArgb(255, 43, 43, 43);
+
+        /// <summary>
+        /// タイトルバーの背景色
+        /// </summary>
+        public Color TitleBarColor { get; set; } = Color.FromArgb(255, 60, 63, 65);
+
+        /// <summary>
+        /// 枠線色
+        /// </summary>
+        public Color BorderColor { get; set; } = Color.FromArgb(31, 0, 0, 0);
+
+        /// <summary>
+        /// タイトルバーのマウスHover色
+        /// </summary>
+        public Color TitleBarHoverColor { get; set; } = Color.FromArgb(255, 79, 82, 84);
+
+        /// <summary>
+        /// タイトルバーのマウスDown色
+        /// </summary>
+        public Color TitleBarDownColor { get; set; } = Color.FromArgb(255, 79, 82, 84);
+
+        public int TitlePadding { get; set; } = 14;
+
+        private int titleBarHeight = 36;
+
+        /// <summary>
+        /// タイトルバーの高さ
+        /// </summary>
+        public int TitleBarHeight 
+        {
+            get { return titleBarHeight; } 
+            set { titleBarHeight = value; Invalidate(); } 
+        }
+
+        public event PaintEventHandler DrawTitle;
+        public event MouseEventHandler HelpClick;
+
+        public FormBase()
+        {
+            FormBorderStyle = FormBorderStyle.None;
+            DoubleBuffered = true;
+            SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.ResizeRedraw | ControlStyles.UserPaint, true);
+
+            // This enables the form to trigger the MouseMove event even when mouse is over another control
+            Application.AddMessageFilter(new MouseMessageFilter());
+            MouseMessageFilter.MouseMove += OnGlobalMouseMove;
+            InitializeComponent();
+        }
+
+        protected override void OnKeyDown(KeyEventArgs e)
+        {
+            if (e.Alt && e.KeyCode == Keys.F4 && LoadingObj.Visible) { e.Handled = true; return; }
+            base.OnKeyDown(e);
+        }
+
+        protected void OnGlobalMouseMove(object sender, MouseEventArgs e)
+        {
+            if (IsDisposed) return;
+            // Convert to client position and pass to Form.MouseMove
+            var clientCursorPos = PointToClient(e.Location);
+            var newE = new MouseEventArgs(MouseButtons.None, 0, clientCursorPos.X, clientCursorPos.Y, 0);
+            OnMouseMove(newE);
+        }
+
+        protected override void WndProc(ref Message m)
+        {
+            base.WndProc(ref m);
+            if (DesignMode || IsDisposed) return;
+
+            if (m.Msg == WM_LBUTTONDBLCLK)
+            {
+                MaximizeWindow(!_maximized);
+            }
+            else if (m.Msg == WM_MOUSEMOVE && _maximized &&
+                _statusBarBounds.Contains(PointToClient(Cursor.Position)) &&
+                !(_minButtonBounds.Contains(PointToClient(Cursor.Position)) || _maxButtonBounds.Contains(PointToClient(Cursor.Position)) || _xButtonBounds.Contains(PointToClient(Cursor.Position))))
+            {
+                if (_headerMouseDown)
+                {
+                    _maximized = false;
+                    _headerMouseDown = false;
+
+                    var mousePoint = PointToClient(Cursor.Position);
+                    if (mousePoint.X < Width / 2)
+                        Location = mousePoint.X < _previousSize.Width / 2 ?
+                            new Point(Cursor.Position.X - mousePoint.X, Cursor.Position.Y - mousePoint.Y) :
+                            new Point(Cursor.Position.X - _previousSize.Width / 2, Cursor.Position.Y - mousePoint.Y);
+                    else
+                        Location = Width - mousePoint.X < _previousSize.Width / 2 ?
+                            new Point(Cursor.Position.X - _previousSize.Width + Width - mousePoint.X, Cursor.Position.Y - mousePoint.Y) :
+                            new Point(Cursor.Position.X - _previousSize.Width / 2, Cursor.Position.Y - mousePoint.Y);
+
+                    Size = _previousSize;
+                    ReleaseCapture();
+                    SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
+                }
+            }
+            else if (m.Msg == WM_LBUTTONDOWN &&
+                _statusBarBounds.Contains(PointToClient(Cursor.Position)) &&
+                !(_minButtonBounds.Contains(PointToClient(Cursor.Position)) || _maxButtonBounds.Contains(PointToClient(Cursor.Position)) || _xButtonBounds.Contains(PointToClient(Cursor.Position))))
+            {
+                if (!_maximized)
+                {
+                    ReleaseCapture();
+                    SendMessage(Handle, WM_NCLBUTTONDOWN, HT_CAPTION, 0);
+                }
+                else
+                {
+                    _headerMouseDown = true;
+                }
+            }
+            else if (m.Msg == WM_RBUTTONDOWN)
+            {
+                Point cursorPos = PointToClient(Cursor.Position);
+
+                if (_statusBarBounds.Contains(cursorPos) && !_minButtonBounds.Contains(cursorPos) &&
+                    !_maxButtonBounds.Contains(cursorPos) && !_xButtonBounds.Contains(cursorPos))
+                {
+                    // Show default system menu when right clicking titlebar
+                    var id = TrackPopupMenuEx(GetSystemMenu(Handle, false), TPM_LEFTALIGN | TPM_RETURNCMD, Cursor.Position.X, Cursor.Position.Y, Handle, IntPtr.Zero);
+
+                    // Pass the command as a WM_SYSCOMMAND message
+                    SendMessage(Handle, WM_SYSCOMMAND, id, 0);
+                }
+            }
+            else if (m.Msg == WM_NCLBUTTONDOWN)
+            {
+                // This re-enables resizing by letting the application know when the
+                // user is trying to resize a side. This is disabled by default when using WS_SYSMENU.
+                if (!Sizable) return;
+
+                byte bFlag = 0;
+
+                // Get which side to resize from
+                if (_resizingLocationsToCmd.ContainsKey((int)m.WParam))
+                    bFlag = (byte)_resizingLocationsToCmd[(int)m.WParam];
+
+                if (bFlag != 0)
+                    SendMessage(Handle, WM_SYSCOMMAND, 0xF000 | bFlag, (int)m.LParam);
+            }
+            else if (m.Msg == WM_LBUTTONUP)
+            {
+                _headerMouseDown = false;
+            }
+        }
+
+        protected override CreateParams CreateParams
+        {
+            get
+            {
+                var par = base.CreateParams;
+                // WS_SYSMENU: Trigger the creation of the system menu
+                // WS_MINIMIZEBOX: Allow minimizing from taskbar
+                par.Style = par.Style | WS_MINIMIZEBOX | WS_SYSMENU; // Turn on the WS_MINIMIZEBOX style flag
+                //par.ExStyle |= 0x02000000; // 用双缓冲绘制窗口的所有子控件
+                return par;
+            }
+        }
+
+        private void MaximizeWindow(bool maximize)
+        {
+            if (!MaximizeBox || !ControlBox) return;
+
+            _maximized = maximize;
+
+            if (maximize)
+            {
+                var monitorHandle = MonitorFromWindow(Handle, MONITOR_DEFAULTTONEAREST);
+                var monitorInfo = new MONITORINFOEX();
+                GetMonitorInfo(new HandleRef(null, monitorHandle), monitorInfo);
+                _previousSize = Size;
+                _previousLocation = Location;
+                Size = new Size(monitorInfo.rcWork.Width(), monitorInfo.rcWork.Height());
+                Location = new Point(monitorInfo.rcWork.left, monitorInfo.rcWork.top);
+            }
+            else
+            {
+                Size = _previousSize;
+                Location = _previousLocation;
+            }
+
+        }
+
+        /// <summary>
+        /// 全部ここに初期化が必要!!!
+        /// </summary>
+        /// <param name="e"></param>
+        protected override void OnPaint(PaintEventArgs e)
+        {
+            Padding = new Padding(1, TitleBarHeight, 1, 1);
+            _helpButtonBounds = new Rectangle((Width - TitlePadding / 2) - 4 * TitleBarHeight, 0, TitleBarHeight, TitleBarHeight);
+            _minButtonBounds = new Rectangle((Width - TitlePadding / 2) - 3 * TitleBarHeight, 0, TitleBarHeight, TitleBarHeight);
+            _maxButtonBounds = new Rectangle((Width - TitlePadding / 2) - 2 * TitleBarHeight, 0, TitleBarHeight, TitleBarHeight);
+            _xButtonBounds = new Rectangle((Width - TitlePadding / 2) - TitleBarHeight, 0, TitleBarHeight, TitleBarHeight);
+            _statusBarBounds = new Rectangle(0, 0, Width, TitleBarHeight);
+            var g = e.Graphics;
+            //g.TextRenderingHint = TextRenderingHint.AntiAlias;
+
+            g.Clear(BackgroundColor);
+            using (var titleBarBrush = new SolidBrush(TitleBarColor))
+            {
+                g.FillRectangle(titleBarBrush, _statusBarBounds);
+            }
+
+            using (var borderPen = new Pen(BorderColor, 1))
+            {
+                g.DrawLine(borderPen, new Point(0, Height - 1), new Point(Width - 1, Height - 1));  //Draw border
+            }
+            
+            // Determine whether or not we even should be drawing the buttons.
+            bool showMin = MinimizeBox && ControlBox;
+            bool showMax = MaximizeBox && ControlBox;
+
+            // When MaximizeButton == false, the minimize button will be painted in its place
+            using (var hoverBrush = new SolidBrush(TitleBarHoverColor))
+            {
+                if (_buttonState == ButtonState.MinOver && showMin) { g.FillRectangle(hoverBrush, showMax ? _minButtonBounds : _maxButtonBounds); }                
+                if (_buttonState == ButtonState.MaxOver && showMax) { g.FillRectangle(hoverBrush, _maxButtonBounds); }
+                if (_buttonState == ButtonState.HelpOver && showHelpIcon) { g.FillRectangle(hoverBrush, _helpButtonBounds); }
+            }
+
+            using (var downBrush = new SolidBrush(TitleBarDownColor))
+            {
+                if (_buttonState == ButtonState.MinDown && showMin) { g.FillRectangle(downBrush, showMax ? _minButtonBounds : _maxButtonBounds); }
+                if (_buttonState == ButtonState.MaxDown && showMax) { g.FillRectangle(downBrush, _maxButtonBounds); }
+                if (_buttonState == ButtonState.HelpDown && showHelpIcon) { g.FillRectangle(downBrush, _helpButtonBounds); }
+            }
+
+            if (_buttonState == ButtonState.XOver && ControlBox)
+            {
+                using (var hoverBrushX = new SolidBrush(Color.FromArgb(255, 232, 17, 35)))
+                {
+                    g.FillRectangle(hoverBrushX, _xButtonBounds);
+                }
+            }
+
+            if (_buttonState == ButtonState.XDown && ControlBox) 
+            {
+                using (var downBrushX = new SolidBrush(Color.FromArgb(255, 232, 17, 35)))
+                {
+                    g.FillRectangle(downBrushX, _xButtonBounds);
+                }
+            }
+
+            using (var buttonPen = new Pen(Color.White, 2))
+            {
+                // Minimize button.
+                if (showMin)
+                {
+                    int x = showMax ? _minButtonBounds.X : _maxButtonBounds.X;
+                    int y = showMax ? _minButtonBounds.Y : _maxButtonBounds.Y;
+
+                    g.DrawLine(
+                        buttonPen,
+                        x + (int)(_minButtonBounds.Width * 0.33),
+                        y + (int)(_minButtonBounds.Height * 0.66),
+                        x + (int)(_minButtonBounds.Width * 0.66),
+                        y + (int)(_minButtonBounds.Height * 0.66)
+                    );
+                }
+
+                // Maximize button
+                if (showMax)
+                {
+                    g.DrawRectangle(
+                        buttonPen,
+                        _maxButtonBounds.X + (int)(_maxButtonBounds.Width * 0.33),
+                        _maxButtonBounds.Y + (int)(_maxButtonBounds.Height * 0.36),
+                        (int)(_maxButtonBounds.Width * 0.39),
+                        (int)(_maxButtonBounds.Height * 0.31)
+                    );
+                }
+
+                // Close button
+                if (ControlBox)
+                {
+                    g.DrawLine(
+                        buttonPen,
+                        _xButtonBounds.X + (int)(_xButtonBounds.Width * 0.33),
+                        _xButtonBounds.Y + (int)(_xButtonBounds.Height * 0.33),
+                        _xButtonBounds.X + (int)(_xButtonBounds.Width * 0.66),
+                        _xButtonBounds.Y + (int)(_xButtonBounds.Height * 0.66)
+                    );
+
+                    g.DrawLine(
+                        buttonPen,
+                        _xButtonBounds.X + (int)(_xButtonBounds.Width * 0.66),
+                        _xButtonBounds.Y + (int)(_xButtonBounds.Height * 0.33),
+                        _xButtonBounds.X + (int)(_xButtonBounds.Width * 0.33),
+                        _xButtonBounds.Y + (int)(_xButtonBounds.Height * 0.66));
+                }
+            }
+
+            if (showHelpIcon) { g.DrawString("?", helpFont, Brushes.White, _helpButtonBounds, helpFormat); }
+
+            //Form title
+            if (DrawTitle != null)
+            {
+                DrawTitle(this, e);
+            }
+            else
+            {
+                g.DrawString(Text, this.Font, Brushes.White, new Rectangle(TitlePadding, 0, Width, TitleBarHeight), titleFormat);
+            }
+        }
+
+        protected override void OnMouseUp(MouseEventArgs e)
+        {
+            if (DesignMode) return;
+            UpdateButtons(e, true);
+
+            base.OnMouseUp(e);
+            ReleaseCapture();
+        }
+
+        protected override void OnMouseDown(MouseEventArgs e)
+        {
+            if (DesignMode) return;
+            UpdateButtons(e);
+
+            if (e.Button == MouseButtons.Left && !_maximized)
+                ResizeForm(_resizeDir);
+            base.OnMouseDown(e);
+        }
+
+        protected override void OnMouseLeave(EventArgs e)
+        {
+            base.OnMouseLeave(e);
+            if (DesignMode) return;
+            _buttonState = ButtonState.None;
+            Invalidate();
+        }
+
+        protected override void OnMouseMove(MouseEventArgs e)
+        {
+            base.OnMouseMove(e);
+
+            if (DesignMode) return;
+
+            if (Sizable)
+            {
+                //True if the mouse is hovering over a child control
+                var isChildUnderMouse = GetChildAtPoint(e.Location) != null;
+
+                if (e.Location.X < BORDER_WIDTH && e.Location.Y > Height - BORDER_WIDTH && !isChildUnderMouse && !_maximized)
+                {
+                    _resizeDir = ResizeDirection.BottomLeft;
+                    Cursor = Cursors.SizeNESW;
+                }
+                else if (e.Location.X < BORDER_WIDTH && !isChildUnderMouse && !_maximized)
+                {
+                    _resizeDir = ResizeDirection.Left;
+                    Cursor = Cursors.SizeWE;
+                }
+                else if (e.Location.X > Width - BORDER_WIDTH && e.Location.Y > Height - BORDER_WIDTH && !isChildUnderMouse && !_maximized)
+                {
+                    _resizeDir = ResizeDirection.BottomRight;
+                    Cursor = Cursors.SizeNWSE;
+                }
+                else if (e.Location.X > Width - BORDER_WIDTH && !isChildUnderMouse && !_maximized)
+                {
+                    _resizeDir = ResizeDirection.Right;
+                    Cursor = Cursors.SizeWE;
+                }
+                else if (e.Location.Y > Height - BORDER_WIDTH && !isChildUnderMouse && !_maximized)
+                {
+                    _resizeDir = ResizeDirection.Bottom;
+                    Cursor = Cursors.SizeNS;
+                }
+                else
+                {
+                    _resizeDir = ResizeDirection.None;
+
+                    //Only reset the cursor when needed, this prevents it from flickering when a child control changes the cursor to its own needs
+                    if (_resizeCursors.Contains(Cursor))
+                    {
+                        Cursor = Cursors.Default;
+                    }
+                }
+            }
+
+            UpdateButtons(e);
+        }
+
+        private void UpdateButtons(MouseEventArgs e, bool up = false)
+        {
+            if (DesignMode) return;
+            var oldState = _buttonState;
+            bool showMin = MinimizeBox && ControlBox;
+            bool showMax = MaximizeBox && ControlBox;
+
+            if (e.Button == MouseButtons.Left && !up)
+            {
+                if (showMin && !showMax && _maxButtonBounds.Contains(e.Location)) { _buttonState = ButtonState.MinDown; }
+                else if (showMin && showMax && _minButtonBounds.Contains(e.Location)) { _buttonState = ButtonState.MinDown; }
+                else if (showMax && _maxButtonBounds.Contains(e.Location)) { _buttonState = ButtonState.MaxDown; }
+                else if (ControlBox && _xButtonBounds.Contains(e.Location)) { _buttonState = ButtonState.XDown; }
+                else if (showHelpIcon && _helpButtonBounds.Contains(e.Location)) { _buttonState = ButtonState.HelpDown; }
+                else { _buttonState = ButtonState.None; }
+            }
+            else
+            {
+                if (showMin && !showMax && _maxButtonBounds.Contains(e.Location))
+                {
+                    _buttonState = ButtonState.MinOver;
+
+                    if (oldState == ButtonState.MinDown && up)
+                        WindowState = FormWindowState.Minimized;
+                }
+                else if (showMin && showMax && _minButtonBounds.Contains(e.Location))
+                {
+                    _buttonState = ButtonState.MinOver;
+
+                    if (oldState == ButtonState.MinDown && up)
+                        WindowState = FormWindowState.Minimized;
+                }
+                else if (MaximizeBox && ControlBox && _maxButtonBounds.Contains(e.Location))
+                {
+                    _buttonState = ButtonState.MaxOver;
+
+                    if (oldState == ButtonState.MaxDown && up)
+                        MaximizeWindow(!_maximized);
+
+                }
+                else if (ControlBox && _xButtonBounds.Contains(e.Location))
+                {
+                    _buttonState = ButtonState.XOver;
+
+                    if (oldState == ButtonState.XDown && up && !LoadingObj.Visible) { Close(); }
+                }
+                else if (showHelpIcon && _helpButtonBounds.Contains(e.Location))
+                {
+                    _buttonState = ButtonState.HelpOver;
+                    if (oldState == ButtonState.HelpDown && up && !LoadingObj.Visible && HelpClick != null) { HelpClick(this, new MouseEventArgs(MouseButtons.Left, 0, e.Location.X, e.Location.Y, 0)); }                        
+                }
+                else _buttonState = ButtonState.None;
+            }
+
+            //if (oldState != _buttonState) Invalidate();
+            Invalidate();
+        }
+
+
+        private void ResizeForm(ResizeDirection direction)
+        {
+            if (DesignMode) return;
+            var dir = -1;
+            switch (direction)
+            {
+                case ResizeDirection.BottomLeft:
+                    dir = HTBOTTOMLEFT;
+                    break;
+                case ResizeDirection.Left:
+                    dir = HTLEFT;
+                    break;
+                case ResizeDirection.Right:
+                    dir = HTRIGHT;
+                    break;
+                case ResizeDirection.BottomRight:
+                    dir = HTBOTTOMRIGHT;
+                    break;
+                case ResizeDirection.Bottom:
+                    dir = HTBOTTOM;
+                    break;
+            }
+
+            ReleaseCapture();
+            if (dir != -1)
+            {
+                SendMessage(Handle, WM_NCLBUTTONDOWN, dir, 0);
+            }            
+        }
+
+    }
+}

--
Gitblit v1.10.0