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

Posted tlmbem

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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控件开发系列的主要内容,如果未能解决你的问题,请参考以下文章

C#中textBox控件为怎么进行提示

怎样在用C#语句动态实现wpf的tooltip或popup窗口

c#winform中label 标签 鼠标悬浮上去,怎么出现一个提示框!

为啥我的 Tooltip 不显示其提示?

c# winform 如何实现弹出气泡状的提示框

怎样可以让ToolTip直接显示 而不用将鼠标放上去