c#美化窗体----------WinForm控件开发系列

  /// <summary>
  /// 标题栏控件管理
  /// </summary>
  internal class ControlBoxManager : IDisposable
  {
    private SkinForm _owner;
    private ControlBoxState _closeBoxState;
    private ControlBoxState _minimizeBoxState;
    private ControlBoxState _maximizeBoxState;
    private bool _mouseDown;

    public ControlBoxManager(SkinForm owner)
    {
      this._owner = owner;
    }

    /// <summary>
    /// 是否显示按钮栏
    /// </summary>
    public bool ControlBoxVisibale
    {
      get { return this._owner.ControlBox; }
    }

    /// <summary>
    /// 是否显示关闭按钮
    /// </summary>
    public bool CloseBoxVisibale
    {
      get { return this._owner.ControlBox && this._owner.CloseBox; }
    }

    /// <summary>
    /// 是否显示最小化按钮
    /// </summary>
    public bool MinimizeBoxVisibale
    {
      get { return this._owner.ControlBox && this._owner.MinimizeBox; }
    }

    /// <summary>
    /// 是否显示最大化按钮
    /// </summary>
    public bool MaximizeBoxVisibale
    {
      get { return this._owner.ControlBox && this._owner.MaximizeBox; }
    }

    /// <summary>
    /// 关闭按钮Rect
    /// </summary>
    public Rectangle CloseBoxRect
    {
      get
      {
        if (this.CloseBoxVisibale)
        {
          int x = this._owner.Width - this._owner.CloseBoxSize.Width - this._owner.CloseBoxTopRight.X;
          return new Rectangle(x, this._owner.CloseBoxTopRight.Y, this._owner.CloseBoxSize.Width, this._owner.CloseBoxSize.Height);
        }
        return Rectangle.Empty;
      }
    }

    /// <summary>
    /// 最大按钮Rect
    /// </summary>
    public Rectangle MaximizeBoxRect
    {
      get
      {
        if (this.MaximizeBoxVisibale)
        {
          int x = this._owner.Width - this._owner.MaximizeBoxSize.Width - this._owner.MaximizeBoxTopRight.X;
          if (this.CloseBoxVisibale)
          {
            x = x - this._owner.CloseBoxSize.Width - this._owner.CloseBoxTopRight.X;
          }
          return new Rectangle(x, this._owner.MaximizeBoxTopRight.Y, this._owner.MaximizeBoxSize.Width, this._owner.MaximizeBoxSize.Height);
        }
        return Rectangle.Empty;
      }
    }

    /// <summary>
    /// 最小化按钮Rect
    /// </summary>
    public Rectangle MinimizeBoxRect
    {
      get
      {
        if (this.MinimizeBoxVisibale)
        {
          int x = this._owner.Width - this._owner.MinimizeBoxSize.Width - this._owner.MinimizeBoxTopRight.X;
          if (this.CloseBoxVisibale)
          {
            x = x - this._owner.CloseBoxSize.Width - this._owner.CloseBoxTopRight.X;
          }
          if (this.MaximizeBoxVisibale)
          {
            x = x - this._owner.MaximizeBoxSize.Width - this._owner.MaximizeBoxTopRight.X;
          }
          return new Rectangle(x, this._owner.MinimizeBoxTopRight.Y, this._owner.MinimizeBoxSize.Width, this._owner.MinimizeBoxSize.Height);
        }
        return Rectangle.Empty;
      }
    }

    /// <summary>
    /// 标题栏控件状态
    /// </summary>
    public ControlBoxState CloseBoxState
    {
      get { return this._closeBoxState; }
      protected set
      {
        if (this._closeBoxState != value)
        {
          this._closeBoxState = value;
          if (_owner != null)
          {
            this.Invalidate(this.CloseBoxRect);
          }
        }
      }
    }

    /// <summary>
    /// 最大按钮状态
    /// </summary>
    public ControlBoxState MaximizeBoxState
    {
      get { return this._maximizeBoxState; }
      protected set
      {
        if (this._maximizeBoxState != value)
        {
          this._maximizeBoxState = value;
          if (_owner != null)
          {
            this.Invalidate(this.MaximizeBoxRect);
          }
        }
      }
    }

    /// <summary>
    /// 最小化状态
    /// </summary>
    public ControlBoxState MinimizeBoxState
    {
      get { return this._minimizeBoxState; }
      protected set
      {
        if (this._minimizeBoxState != value)
        {
          this._minimizeBoxState = value;
          if (_owner != null)
          {
            this.Invalidate(this.MinimizeBoxRect);
          }
        }
      }
    }

    /// <summary>
    ///
    /// </summary>
    /// <param name="mousePoint"></param>
    /// <param name="operate"></param>
    public void ProcessMouseOperate(Point mousePoint, ControlBoxBoxStatus operate)
    {
      if (!this._owner.ControlBox)
      {
        return;
      }

      Rectangle closeBoxRect = this.CloseBoxRect;
      Rectangle minimizeBoxRect = this.MinimizeBoxRect;
      Rectangle maximizeBoxRect = this.MaximizeBoxRect;

      bool closeBoxVisibale = this.ControlBoxVisibale;
      bool minimizeBoxVisibale = this.MinimizeBoxVisibale;
      bool maximizeBoxVisibale = this.MaximizeBoxVisibale;

      switch (operate)
      {
        case ControlBoxBoxStatus.Move:
          this.ProcessMouseMove(mousePoint, closeBoxRect, minimizeBoxRect, maximizeBoxRect, closeBoxVisibale, minimizeBoxVisibale, maximizeBoxVisibale);
          break;
        case ControlBoxBoxStatus.Down:
          this.ProcessMouseDown(mousePoint, closeBoxRect, minimizeBoxRect, maximizeBoxRect, closeBoxVisibale, minimizeBoxVisibale, maximizeBoxVisibale);
          break;
        case ControlBoxBoxStatus.Up:
          this.ProcessMouseUP(mousePoint, closeBoxRect, minimizeBoxRect, maximizeBoxRect, closeBoxVisibale, minimizeBoxVisibale, maximizeBoxVisibale);
          break;
        case ControlBoxBoxStatus.Leave:
          this.ProcessMouseLeave(closeBoxVisibale, minimizeBoxVisibale, maximizeBoxVisibale);
          break;
        case ControlBoxBoxStatus.Hover:
          break;
      }
    }

    /// <summary>
    ///
    /// </summary>
    /// <param name="mousePoint"></param>
    /// <param name="closeBoxRect"></param>
    /// <param name="minimizeBoxRect"></param>
    /// <param name="maximizeBoxRect"></param>
    /// <param name="closeBoxVisibale"></param>
    /// <param name="minimizeBoxVisibale"></param>
    /// <param name="maximizeBoxVisibale"></param>
    private void ProcessMouseDown(Point mousePoint, Rectangle closeBoxRect, Rectangle minimizeBoxRect, Rectangle maximizeBoxRect, bool closeBoxVisibale, bool minimizeBoxVisibale, bool maximizeBoxVisibale)
    {
      this._mouseDown = true;

      if (closeBoxVisibale)
      {
        if (closeBoxRect.Contains(mousePoint))
        {
          this.CloseBoxState = ControlBoxState.Down;
          return;
        }
      }

      if (maximizeBoxVisibale)
      {
        if (maximizeBoxRect.Contains(mousePoint))
        {
          this.MaximizeBoxState = ControlBoxState.Down;
          return;
        }
      }

      if (minimizeBoxVisibale)
      {
        if (minimizeBoxRect.Contains(mousePoint))
        {
          this.MinimizeBoxState = ControlBoxState.Down;
          return;
        }
      }

    }

    /// <summary>
    ///
    /// </summary>
    /// <param name="mousePoint"></param>
    /// <param name="closeBoxRect"></param>
    /// <param name="minimizeBoxRect"></param>
    /// <param name="maximizeBoxRect"></param>
    /// <param name="closeBoxVisibale"></param>
    /// <param name="minimizeBoxVisibale"></param>
    /// <param name="maximizeBoxVisibale"></param>
    private void ProcessMouseUP(Point mousePoint, Rectangle closeBoxRect, Rectangle minimizeBoxRect, Rectangle maximizeBoxRect, bool closeBoxVisibale, bool minimizeBoxVisibale, bool maximizeBoxVisibale)
    {
      this._mouseDown = false;

      if (closeBoxVisibale)
      {
        if (closeBoxRect.Contains(mousePoint))
        {
          if (this.CloseBoxState == ControlBoxState.Down)
          {
            this._owner.Close();
            this.CloseBoxState = ControlBoxState.Normal;
            return;
          }
        }
        this.CloseBoxState = ControlBoxState.Normal;
      }

      if (maximizeBoxVisibale)
      {
        if (maximizeBoxRect.Contains(mousePoint))
        {
          if (this.MaximizeBoxState == ControlBoxState.Down)
          {
            if (this._owner.WindowState == FormWindowState.Maximized)
            {
              this._owner.WindowState = FormWindowState.Normal;
            }
            else
            {
              this._owner.WindowState = FormWindowState.Maximized;
            }
            this.MaximizeBoxState = ControlBoxState.Normal;
            return;
          }
        }
        this.MaximizeBoxState = ControlBoxState.Normal;
      }

      if (minimizeBoxVisibale)
      {
        if (minimizeBoxRect.Contains(mousePoint))
        {
          if (this.MinimizeBoxState == ControlBoxState.Down)
          {
            this._owner.WindowState = FormWindowState.Minimized;
            this.MinimizeBoxState = ControlBoxState.Normal;
            return;
          }
        }
        this.MinimizeBoxState = ControlBoxState.Normal;
      }

    }

    /// <summary>
    ///
    /// </summary>
    /// <param name="closeBoxVisibale"></param>
    /// <param name="minimizeBoxVisibale"></param>
    /// <param name="maximizeBoxVisibale"></param>
    private void ProcessMouseLeave(bool closeBoxVisibale, bool minimizeBoxVisibale, bool maximizeBoxVisibale)
    {
      if (closeBoxVisibale)
      {
        if (this.CloseBoxState == ControlBoxState.Down)
        {
          this.CloseBoxState = ControlBoxState.Up;
        }
        else
        {
          this.CloseBoxState = ControlBoxState.Normal;
        }
      }

      if (maximizeBoxVisibale)
      {
        if (this.MaximizeBoxState == ControlBoxState.Down)
        {
          this.MaximizeBoxState = ControlBoxState.Up;
        }
        else
        {
          this.MaximizeBoxState = ControlBoxState.Normal;
        }
      }

      if (minimizeBoxVisibale)
      {
        if (this.MinimizeBoxState == ControlBoxState.Down)
        {
          this.MinimizeBoxState = ControlBoxState.Up;
        }
        else
        {
          this.MinimizeBoxState = ControlBoxState.Normal;
        }
      }

      this.HideToolTip();
    }

    /// <summary>
    ///
    /// </summary>
    /// <param name="mousePoint"></param>
    /// <param name="closeBoxRect"></param>
    /// <param name="minimizeBoxRect"></param>
    /// <param name="maximizeBoxRect"></param>
    /// <param name="closeBoxVisibale"></param>
    /// <param name="minimizeBoxVisibale"></param>
    /// <param name="maximizeBoxVisibale"></param>
    private void ProcessMouseMove(Point mousePoint, Rectangle closeBoxRect, Rectangle minimizeBoxRect, Rectangle maximizeBoxRect, bool closeBoxVisibale, bool minimizeBoxVisibale, bool maximizeBoxVisibale)
    {
      string text = string.Empty;
      bool hide = true;
      if (closeBoxVisibale)
      {
        if (closeBoxRect.Contains(mousePoint))
        {
          hide = false;
          if (!_mouseDown)
          {
            if (CloseBoxState != ControlBoxState.Enter)
            {
              text = "关闭";
            }
            CloseBoxState = ControlBoxState.Enter;
          }
          else
          {
            if (CloseBoxState == ControlBoxState.Up)
            {
              CloseBoxState = ControlBoxState.Down;
            }
          }
        }
        else
        {
          if (!_mouseDown)
          {
            CloseBoxState = ControlBoxState.Normal;
          }
          else
          {
            if (CloseBoxState == ControlBoxState.Down)
            {
              CloseBoxState = ControlBoxState.Up;
            }
          }
        }
      }

      if (maximizeBoxVisibale)
      {
        if (maximizeBoxRect.Contains(mousePoint))
        {
          hide = false;
          if (!_mouseDown)
          {
            if (MaximizeBoxState != ControlBoxState.Enter)
            {
              bool maximize =
                  this._owner.WindowState == FormWindowState.Maximized;
              text = maximize ? "还原" : "最大化";
            }
            MaximizeBoxState = ControlBoxState.Enter;
          }
          else
          {
            if (MaximizeBoxState == ControlBoxState.Up)
            {
              MaximizeBoxState = ControlBoxState.Down;
            }
          }
        }
        else
        {
          if (!_mouseDown)
          {
            MaximizeBoxState = ControlBoxState.Normal;
          }
          else
          {
            if (MaximizeBoxState == ControlBoxState.Down)
            {
              MaximizeBoxState = ControlBoxState.Up;
            }
          }
        }
      }

      if (minimizeBoxVisibale)
      {
        if (minimizeBoxRect.Contains(mousePoint))
        {
          hide = false;
          if (!_mouseDown)
          {
            if (MinimizeBoxState != ControlBoxState.Enter)
            {
              text = "最小化";
            }
            MinimizeBoxState = ControlBoxState.Enter;
          }
          else
          {
            if (MinimizeBoxState == ControlBoxState.Up)
            {
              MinimizeBoxState = ControlBoxState.Down;
            }
          }
        }
        else
        {
          if (!_mouseDown)
          {
            MinimizeBoxState = ControlBoxState.Normal;
          }
          else
          {
            if (MinimizeBoxState == ControlBoxState.Down)
            {
              MinimizeBoxState = ControlBoxState.Up;
            }
          }
        }
      }

      if (text != string.Empty)
      {
        HideToolTip();
        ShowTooTip(text);
      }

      if (hide)
      {
        HideToolTip();
      }
    }

    /// <summary>
    /// 重新绘制窗体控件指定rect
    /// </summary>
    /// <param name="rect"></param>
    private void Invalidate(Rectangle rect)
    {
      this._owner.Invalidate(rect);
    }

    /// <summary>
    /// 显示提示
    /// </summary>
    /// <param name="toolTipText"></param>
    private void ShowTooTip(string toolTipText)
    {
      if (this._owner != null)
      {
        this._owner.ToolTip.Active = true;
        this._owner.ToolTip.SetToolTip(this._owner, toolTipText);
      }
    }

    /// <summary>
    /// 隐藏提示
    /// </summary>
    private void HideToolTip()
    {
      if (this._owner != null)
      {
        this._owner.ToolTip.Active = false;
      }
    }

    /// <summary>
    ///
    /// </summary>
    public void Dispose()
    {
      this._owner = null;
    }

  }

源码下载地址:CSharp窗体美化.zip

原文地址:https://www.cnblogs.com/tlmbem/p/11258324.html

时间: 2024-10-18 09:05:09

c#美化窗体----------WinForm控件开发系列的相关文章

数字时间控件----------WinForm控件开发系列

/// <summary> /// 数字时间控件 /// </summary> [ToolboxItem(true)] [DefaultProperty("Value")] [DefaultEvent("ValueChanged")] [Description("数字时间控件")] public partial class TimeExt : Control { public delegate void EventHand

MAC鱼眼效果菜单控件----------WinForm控件开发系列

/// <summary> /// 鱼眼菜单 /// </summary> [DefaultProperty("Items")] [DefaultEvent("FisheyeItemClick")] [Description("鱼眼菜单")] public partial class FisheyeBarExt : Control { public delegate void EventHandler(object sen

按钮动画控件----------WinForm控件开发系列

public partial class ButtonExt : Button { private AnimationTimer _Animation; /// <summary> /// 动画组件对象 /// </summary> [Description("动画组件对象")] [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public AnimationT

雷达扫描控件----------WinForm控件开发系列

/// <summary> /// 雷达扫描控件 /// </summary> [ToolboxItem(true)] [DefaultProperty("Items")] [Description("雷达扫描控件")] public partial class RadarExt : Control { #region private Color areaColor = Color.LawnGreen; /// <summary>

TabPanel美化控件----------WinForm控件开发系列

/// <summary> /// TabControl /// </summary> [ToolboxItem(true)] [Description("TabControl")] public partial class TabControlExt : TabControl { #region private AnimationTimer animation; /// <summary> /// 动画组件对象 /// </summary&g

Chart实时段分析控件----------WinForm控件开发系列

/// <summary> /// 实时段进度控件 /// </summary> [ToolboxItem(true)] [Description("实时段进度控件")] public partial class ChartExt : Control { #region private Timer interval; /// <summary> /// 定时刷新 /// </summary> [Browsable(false)] [Des

加载等待控件----------WinForm控件开发系列

/// <summary> /// 加载进度控件 /// </summary> [ToolboxItem(true)] [Description("加载进度控件")] [DefaultProperty("Active")] public partial class LoadProgressExt : Control { #region 属性 private LoadProgressType progressType = LoadProgres

温度计控件----------WinForm控件开发系列

/// <summary> /// 温度计控件 /// </summary> [ToolboxItem(true)] [DefaultProperty("Value")] [DefaultEvent("ValueChanged")] [Description("温度计控件")] public partial class ThermometerExt : Control { public delegate void Even

走马灯图片轮播控件----------WinForm控件开发系列

/// <summary> /// 走马灯图片轮播控件 /// </summary> [ToolboxItem(true)] [DefaultProperty("Images")] [Description("走马灯图片轮播控件")] public partial class ImageCarouselExt : Control { #region private bool barShow = true; /// <summary>