C# 使用GDI+绘制漂亮的ToolTip控件
- 摘要:本文介绍C#使用GDI+重绘工具提示控件ToolTip,实现ToolTip自定义图标、大图标、小图标和透明显示,并可以轻松的更换ToolTip背景和边框颜色。
在前面的文章《C# 用ToolStripDropDown实现任意Windows控件弹出显示》中,我们通过继承ToolStripDropDown实现了一个PopupControlHost宿主类,使用它可以非常方便地实现弹出信息显示,支持不规则外观的控件,还允许用户进行相关操作。但如果只需要用来作信息的简短提示,用ToolTip工具提示控件就行了,.NET自带的ToolTip控件可以显示系统图标、标题和提示信息,但是要显示自定义图标、大图标和漂亮的背景就不太方便了,接下来就介绍怎样扩展ToolTip控件,实现显示自定义图标、大图标、小图标、透明背景和个性化的背景和边框。
首先,来看看扩展的ToolTipEx控件的几种显示效果:
ToolTipEx提供了几个基本的属性,方便用户设置其显示效果,以下是ToolTipEx的类视图:
各属性简单介绍:
1、ColorTable:获取工具提示的颜色表单。
2、Handle:获取该工具提示的句柄。
3、Image:获取或设置工具提示自定义图标。
4、ImageSize:获取或设置自定义图标大小(16 x 16 - 32 x 32)。
5、Opacity:获取或设置工具提示的透明度。
6、TitleFont:获取或设置工具提示标题的字体。
下面介绍实现扩展ToolTip控件的几个要点:
1、 ToolTip实现重绘,需要设置OwnerDraw 为 true,并通过Draw事件来重绘ToolTip。
2、 ToolTip控件不像一般的继承Control的控件那样,可以得到控件的句柄(Handle),.NET实现ToolTip的句柄是internal修饰的,利用反射可以得到它的句柄,代码如下:
protected IntPtr Handle
{
get
{
if (!DesignMode)
{
Type t = typeof(ToolTip);
PropertyInfo pi = t.GetProperty(
"Handle",
BindingFlags.NonPublic | BindingFlags.Instance);
IntPtr handle = (IntPtr)pi.GetValue(this, null);
return handle;
}
return IntPtr.Zero;
}
}
3、 ToolTip控件实现透明显示的实现。上面获取ToolTip控件的句柄就是为了实现透明背景所需要的。ToolTip还有一个Popup事件,这个事件注释入下:在工具提示最初显示之前发生。在ToolTip将要显示之前,获取它的位置和大小,然后截取这个位置和大小对应的屏幕的图像,并把这个图像作为ToolTip的背景,这样我们就可以实现ToolTip控件透明显示了。看看Popup事件的实现代码:
private void ToolTipExPopup(
object sender, PopupEventArgs e)
{
if (_opacity < 1D)
{
//如果使用背景透明,获取背景图。
TipCapture();
}
}
4、 实现透明图标显示。通过颜色矩阵实现绘制透明图像,具体实现请参考RenderHelper类的RenderAlphaImage方法。
更多详细的实现代码,大家可以下载ToolTipEx源码参考。到此,对ToolTip的美化就算完成,希望对您有所帮助。
最后,感谢John(杨剑)为我写了这篇文章的原稿,让我稍加修改就可以发布了。
声明:
本文版权归作者和CS 程序员之窗所有,欢迎转载,转载必须保留以下版权信息,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
作者:Starts_2000
出处:CS 程序员之窗 http://www.csharpwin.com。
你可以免费使用或修改提供的源代码,但请保留源代码中的版权信息,详情请查看:
CS程序员之窗开源协议 http://www.csharpwin.com/csol.html。
- C# 实现滚动条(ScrollBar)控件美化换肤
- C# WinForm控件美化扩展系列之实现点击收缩的SplitContainer控..
- C# 使用GDI+实现ProgressBar控件美化换肤
- C# 实现TrackBar控件美化换肤
- C# 使用GDI+绘制漂亮的ToolStrip和StatusStrip皮肤
- C# 使用GDI+绘制漂亮的MenuStrip和ContextMenuStrip皮肤
- C# WinForm控件美化扩展系列之ImageComboBox
- C# WinForm控件美化扩展系列之ListBox(续)-显示图标项
- C# WinForm控件美化扩展系列之ListView(4)-实现所有样式的美..