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#语句动态实现wpf的tooltip或popup窗口