ToolTip提示美化控件----------WinForm控件开发系列

ToolTip提示美化控件----------WinForm控件开发系列

  /// <summary>
  /// 提示信息控件
  /// </summary>
  [ToolboxItem(true)]
  [DefaultProperty("TitleShow")]
  [DefaultEvent("Popup")]
  [Description("提示信息控件")]
  public partial class ToolTipExt : ToolTip
  {
    #region

    private ToolTipAnchor toolAnchor = ToolTipAnchor.TopCenter;
    /// <summary>
    /// 提示框位置
    /// </summary>
    [Browsable(false)]
    [DefaultValue(ToolTipAnchor.TopCenter)]
    [Description("提示框位置")]
    public ToolTipAnchor ToolAnchor
    {
      get { return this.toolAnchor; }
      set
      {
        if (this.toolAnchor == value)
          return;
        this.toolAnchor = value;
        this.InitializeComponent();
      }
    }

    private int anchorDistance = 20;
    /// <summary>
    /// 提示框位置距离
    /// </summary>
    [DefaultValue(20)]
    [Description("提示框位置距离")]
    public int AnchorDistance
    {
      get { return this.anchorDistance; }
      set
      {
        if (this.anchorDistance == value || value < 0)
          return;
        this.anchorDistance = value;
        this.InitializeComponent();
      }
    }

    private int padding = 3;
    /// <summary>
    /// 内边距
    /// </summary>
    [DefaultValue(3)]
    [Description("内边距")]
    public int Padding
    {
      get { return this.padding; }
      set
      {
        if (this.padding == value || value < 0)
          return;
        this.padding = value;
        this.InitializeComponent();
      }
    }

    private Size minSize = new Size(20, 10);
    /// <summary>
    /// 内容最小大小
    /// </summary>
    [DefaultValue(typeof(Size), "20,10")]
    [Description("内容最小大小")]
    public Size MinSize
    {
      get { return this.minSize; }
      set
      {
        if (this.minSize == value || value.Width < 0 || value.Height < 0)
          return;
        this.minSize = value;
        this.InitializeComponent();
      }
    }

    private Size maxSize = new Size(0, 0);
    /// <summary>
    /// 内容最大大小
    /// </summary>
    [DefaultValue(typeof(Size), "0,0")]
    [Description("内容最大大小")]
    public Size MaxSize
    {
      get { return this.maxSize; }
      set
      {
        if (this.maxSize == value || value.Width < 0 || value.Height < 0)
          return;
        this.maxSize = value;
        this.InitializeComponent();
      }
    }

    #region 标题

    private bool titleShow = false;
    /// <summary>
    /// 是否显示标题
    /// </summary>
    [DefaultValue(false)]
    [Description("是否显示标题")]
    public bool TitleShow
    {
      get { return this.titleShow; }
      set
      {
        if (this.titleShow == value)
          return;
        this.titleShow = value;
        this.InitializeComponent();
      }
    }

    private int titleHeight = 26;
    /// <summary>
    /// 标题高度
    /// </summary>
    [DefaultValue(26)]
    [Description("标题高度")]
    public int TitleHeight
    {
      get { return this.titleHeight; }
      set
      {
        if (this.titleHeight == value)
          return;
        this.titleHeight = value;
        this.InitializeComponent();
      }
    }

    private TiTleAnchor titleStation = TiTleAnchor.Top;
    /// <summary>
    /// 提示框标题位置
    /// </summary>
    [DefaultValue(TiTleAnchor.Top)]
    [Description("提示框标题位置")]
    public TiTleAnchor TitleStation
    {
      get { return this.titleStation; }
      set
      {
        if (this.titleStation == value)
          return;
        this.titleStation = value;
        this.InitializeComponent();
      }
    }

    private Font titleFont = new Font("宋体", 11);
    /// <summary>
    /// 标题字体
    /// </summary>
    [DefaultValue(typeof(Font), "宋体, 11pt")]
    [Description("标题字体")]
    public Font TitleFont
    {
      get { return this.titleFont; }
      set
      {
        if (this.titleFont == value)
          return;
        this.titleFont = value;
        this.InitializeComponent();
      }
    }

    private Color titleBackColor = Color.FromArgb(192, 206, 55);
    /// <summary>
    /// 标题背景颜色
    /// </summary>
    [DefaultValue(typeof(Color), "192, 206, 55")]
    [Description("标题背景颜色")]
    public Color TitleBackColor
    {
      get { return this.titleBackColor; }
      set
      {
        if (this.titleBackColor == value)
          return;
        this.titleBackColor = value;
        this.InitializeComponent();
      }
    }

    private Color titleColor = Color.FromArgb(255, 255, 255);
    /// <summary>
    /// 标题颜色
    /// </summary>
    [DefaultValue(typeof(Color), "255, 255, 255")]
    [Description("标题颜色")]
    public Color TitleColor
    {
      get { return this.titleColor; }
      set
      {
        if (this.titleColor == value)
          return;
        this.titleColor = value;
        this.InitializeComponent();
      }
    }

    #endregion

    #region 文本

    private Font font = new Font("宋体", 10);
    /// <summary>
    /// 文本字体
    /// </summary>
    [DefaultValue(typeof(Font), "宋体, 10pt")]
    [Description("文本字体")]
    public Font Font
    {
      get { return this.font; }
      set
      {
        if (this.font == value)
          return;
        this.font = value;
        this.InitializeComponent();
      }
    }

    #endregion

    #endregion

    public ToolTipExt()
    {
      this.OwnerDraw = true;
      this.BackColor = Color.FromArgb(255, 255, 255);
      this.ForeColor = Color.FromArgb(245, 168, 154);
      this.Popup += new PopupEventHandler(this.ToolTipExt_Popup);
      this.Draw += new System.Windows.Forms.DrawToolTipEventHandler(this.ToolTipExt_Draw);
    }

    private void ToolTipExt_Popup(object sender, PopupEventArgs e)
    {
      e.ToolTipSize = this.GetToolTipSize(e.AssociatedControl);
    }

    private void ToolTipExt_Draw(object sender, DrawToolTipEventArgs e)
    {

      #region 背景

      SolidBrush back_sb = new SolidBrush(this.BackColor);
      e.Graphics.FillRectangle(back_sb, e.Bounds);
      back_sb.Dispose();

      #endregion

      #region 标题

      Rectangle titleback_rect = new Rectangle();
      if (this.TitleShow)
      {
        StringFormat title_sf = new StringFormat();
        if (this.TitleStation == TiTleAnchor.Left || this.TitleStation == TiTleAnchor.Right)
          title_sf.FormatFlags = StringFormatFlags.DirectionVertical;
        Size title_size = e.Graphics.MeasureString(this.ToolTipTitle, this.TitleFont, 0, title_sf).ToSize();


        Rectangle title_rect = new Rectangle();
        if (this.TitleStation == TiTleAnchor.Top)
        {
          titleback_rect = new Rectangle(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, this.TitleHeight);
          title_rect = new Rectangle(titleback_rect.X + this.Padding, titleback_rect.Y + (titleback_rect.Height - title_size.Height) / 2, titleback_rect.Width - this.Padding * 2, titleback_rect.Height - this.Padding * 2);
        }
        else if (this.TitleStation == TiTleAnchor.Bottom)
        {
          titleback_rect = new Rectangle(e.Bounds.X, e.Bounds.Bottom - this.TitleHeight, e.Bounds.Width, this.TitleHeight);
          title_rect = new Rectangle(titleback_rect.X + this.Padding, e.Bounds.Bottom - titleback_rect.Height + (titleback_rect.Height - title_size.Height) / 2, titleback_rect.Width - this.Padding * 2, titleback_rect.Height - this.Padding * 2);
        }
        else if (this.TitleStation == TiTleAnchor.Left)
        {
          titleback_rect = new Rectangle(e.Bounds.X, e.Bounds.Y, this.TitleHeight, e.Bounds.Height);
          title_rect = new Rectangle(titleback_rect.X + (titleback_rect.Width - title_size.Width) / 2, titleback_rect.Y + this.Padding, titleback_rect.Width - this.Padding * 2, titleback_rect.Height - this.Padding * 2);
        }
        else if (this.TitleStation == TiTleAnchor.Right)
        {
          titleback_rect = new Rectangle(e.Bounds.Right - this.TitleHeight, e.Bounds.Y, this.TitleHeight, e.Bounds.Height);
          title_rect = new Rectangle(titleback_rect.Right - titleback_rect.Width + (titleback_rect.Width - title_size.Width) / 2, titleback_rect.Y + this.Padding, titleback_rect.Width - this.Padding * 2, titleback_rect.Height - this.Padding * 2);
        }

        if (this.TitleBackColor != Color.Empty)
        {
          SolidBrush titleback_sb = new SolidBrush(this.TitleBackColor);
          e.Graphics.FillRectangle(titleback_sb, titleback_rect);
          titleback_sb.Dispose();
        }

        SolidBrush title_sb = new SolidBrush(this.TitleColor);
        e.Graphics.DrawString(this.ToolTipTitle, this.TitleFont, title_sb, title_rect, title_sf);
        title_sb.Dispose();
        title_sf.Dispose();
      }

      #endregion

      #region 内容

      Size text_size = e.Graphics.MeasureString(e.ToolTipText, this.Font).ToSize();
      Rectangle text_rect = new Rectangle();
      if (this.TitleStation == TiTleAnchor.Top)
      {
        text_rect = new Rectangle(e.Bounds.X + this.Padding, titleback_rect.Bottom + this.Padding, e.Bounds.Width, e.Bounds.Height - titleback_rect.Height);
      }
      else if (this.TitleStation == TiTleAnchor.Bottom)
      {
        text_rect = new Rectangle(e.Bounds.X + this.Padding, e.Bounds.Y + this.Padding, e.Bounds.Width, e.Bounds.Height - titleback_rect.Height);
      }
      else if (this.TitleStation == TiTleAnchor.Left)
      {
        text_rect = new Rectangle(e.Bounds.X + titleback_rect.Width + this.Padding, e.Bounds.Y + this.Padding, e.Bounds.Width, e.Bounds.Height - titleback_rect.Height);
      }
      else if (this.TitleStation == TiTleAnchor.Right)
      {
        text_rect = new Rectangle(e.Bounds.X + this.Padding, e.Bounds.Y + this.Padding, e.Bounds.Width, e.Bounds.Height - titleback_rect.Height);
      }

      SolidBrush text_sb = new SolidBrush(this.ForeColor);
      e.Graphics.DrawString(e.ToolTipText, this.Font, text_sb, text_rect);
      text_sb.Dispose();

      #endregion

    }

    /// <summary>
    /// 设置与指定控件关联的工具提示文本,然后在指定的相对位置以模式方式显示该工具提示。
    /// </summary>
    /// <param name="text">包含新工具提示文本的 System.String。</param>
    /// <param name="window">要为其显示工具提示的 System.Windows.Forms.Control。</param>
    /// <param name="anchor">工具提示的位置</param>
    public void Show(string text, IWin32Window window, ToolTipAnchor anchor)
    {
      this.toolAnchor = anchor;
      Control control = (Control)window;
      Size size = this.GetToolTipSize(control, text);
      Point point = new Point(0, 0);
      if (this.ToolAnchor == ToolTipAnchor.TopCenter)
      {
        point = new Point((control.Width - size.Width) / 2, -this.AnchorDistance - size.Height);
      }
      else if (this.ToolAnchor == ToolTipAnchor.BottomCenter)
      {
        point = new Point((control.Width - size.Width) / 2, control.Height + this.AnchorDistance);
      }
      else if (this.ToolAnchor == ToolTipAnchor.LeftCenter)
      {
        point = new Point(-(size.Width + this.AnchorDistance), (control.Height - size.Height) / 2);
      }
      else if (this.ToolAnchor == ToolTipAnchor.RightCenter)
      {
        point = new Point(control.Width + this.AnchorDistance, (control.Height - size.Height) / 2);
      }
      this.Show(text, window, point);
    }

    /// <summary>
    /// 设置与指定控件关联的工具提示文本,然后在指定的相对位置以模式方式显示该工具提示。
    /// </summary>
    /// <param name="text">包含新工具提示文本的 System.String。</param>
    /// <param name="window">要为其显示工具提示的 System.Windows.Forms.Control。</param>
    /// <param name="anchor">工具提示的位置</param>
    /// <param name="duration">包含工具提示持续显示时间(以毫秒为单位)的 System.Int32。</param>
    public void Show(string text, IWin32Window window, ToolTipAnchor anchor, int duration)
    {
      this.toolAnchor = anchor;
      Control control = (Control)window;
      Size size = this.GetToolTipSize(control, text);
      Point point = new Point(0, 0);
      if (this.ToolAnchor == ToolTipAnchor.TopCenter)
      {
        point = new Point((control.Width - size.Width) / 2, -this.AnchorDistance - size.Height);
      }
      else if (this.ToolAnchor == ToolTipAnchor.BottomCenter)
      {
        point = new Point((control.Width - size.Width) / 2, control.Height + this.AnchorDistance);
      }
      else if (this.ToolAnchor == ToolTipAnchor.LeftCenter)
      {
        point = new Point(-this.AnchorDistance - size.Width, (control.Height - size.Height) / 2);
      }
      else if (this.ToolAnchor == ToolTipAnchor.RightCenter)
      {
        point = new Point(control.Width + this.AnchorDistance, (control.Height - size.Height) / 2);
      }

      this.Show(text, window, point, duration);
    }

    /// <summary>
    /// 通过文本计算工具提示大小(text为null时根据control的文本计算)
    /// </summary>
    /// <param name="control">要为其检索 System.Windows.Forms.ToolTip 文本的 System.Windows.Forms.Control。</param>
    /// <param name="text">要计算的文本</param>
    /// <returns></returns>
    private Size GetToolTipSize(Control control, string text = null)
    {
      string text_str = text == null ? this.GetToolTip(control) : text;
      Size text_size = TextRenderer.MeasureText(text_str, this.Font);
      text_size.Width += this.Padding * 2;
      text_size.Height += this.Padding * 2;

      if (this.MinSize.Width > 0 && this.MinSize.Width > text_size.Width)
        text_size.Width = this.MinSize.Width;
      if (this.MinSize.Height > 0 && this.MinSize.Height > text_size.Height)
        text_size.Height = this.MinSize.Height;

      if (this.MaxSize.Width > 0 && text_size.Width > this.MaxSize.Width)
        text_size.Width = this.MaxSize.Width;
      if (this.MaxSize.Height > 0 && text_size.Height > this.MaxSize.Height)
        text_size.Height = this.MaxSize.Height;

      if (this.TitleShow)
      {
        if (this.TitleStation == TiTleAnchor.Top || this.TitleStation == TiTleAnchor.Bottom)
        {
          text_size.Height += this.TitleHeight;
        }
        else
        {
          text_size.Width += this.TitleHeight;
        }
      }
      return text_size;
    }

    protected override void Dispose(bool disposing)
    {
      if (disposing && (components != null))
      {
        components.Dispose();
      }
      base.Dispose(disposing);
    }

    /// <summary>
    /// 提示框标题位置
    /// </summary>
    [Description("提示框标题位置")]
    public enum TiTleAnchor
    {
      /// <summary>
      /// 顶部
      /// </summary>
      Top,
      /// <summary>
      /// 左边
      /// </summary>
      Left,
      /// <summary>
      /// 右边
      /// </summary>
      Right,
      /// <summary>
      /// 下边
      /// </summary>
      Bottom
    }

    /// <summary>
    /// 提示框位置
    /// </summary>
    [Description("提示框位置")]
    public enum ToolTipAnchor
    {
      /// <summary>
      /// 顶部居中
      /// </summary>
      TopCenter,
      /// <summary>
      /// 左边居中
      /// </summary>
      LeftCenter,
      /// <summary>
      /// 右边居中
      /// </summary>
      RightCenter,
      /// <summary>
      /// 下边居中
      /// </summary>
      BottomCenter
    }
  }

源码下载:ToolTip提示美化控件.zip

ToolTip提示美化控件----------WinForm控件开发系列

上一篇:安装WIN10+Ubuntu18.04安装教程(实测有效)


下一篇:C# Newtonsoft.Json解析json字符串处理 - JToken 用法