C# WinForm控件美化扩展系列之给ComboBox加水印
- 摘要:前面两篇文章介绍了给TextBox 和RichTextBox 加水印,这篇文章将介绍怎样给ComboBox加水印。给ComboBox加水印要比给TextBox和RichTextBox 加水印麻烦很多,因为他是一个复合控件,我们要找到他的输入框才能进行一些操作,下面就介绍怎样来实现这个控件。
前面两篇文章介绍了给TextBox 和RichTextBox 加水印,这篇文章将介绍怎样给ComboBox加水印。
给ComboBox加水印要比给TextBox 和RichTextBox 加水印麻烦很多,因为他是一个复合控件,我们要找到他的输入框才能进行一些操作,下面就介绍怎样来实现这个控件。
第一步:我们建一个继承 ComboBox的类,命名为WatermakComboBox。
第二步:给这个类添加两个属性,一个是EmptyTextTip,就是当控件没有输入内容和没有焦点的时候显示的提示文本,也就是水印了;另一个是EmptyTextTipColor,就是提示文本的颜色。
第三步:我们先要得到ComboBox中的输入框句柄。我们可以通过API函数 GetComboBoxInfo 得到ComboBox 的信息,打架可以通过 Baidu 和 Google 搜索,了解这个函数的具体信息。得到输入框的句柄后,我们就可以用API函数GetWindowRect 来得到他的大小了,这个我们在绘制水印的时候需要用到的。
第四步:继承 NativeWindow,实现一个EditNativeWindow 类,通过这个类来截取输入框的WM_PAINT消息来绘制水印。在绘制的时候需要用到两个API函数GetDC 和 ReleaseDC。
第五步:重写ComboBox的OnHandleCreated 和 OnHandleDestroyed 方法,当控件句柄创建后,我们需要得到ComboBox的信息和截取输入框的消息,来看看代码:
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
ComboBoxInfo cbi = new ComboBoxInfo();
cbi.cbSize = Marshal.SizeOf(cbi);
GetComboBoxInfo(base.Handle, ref cbi);
_editHandle = cbi.hwndEdit;
if (DropDownStyle != ComboBoxStyle.DropDownList)
{
_editNativeWindow = new EditNativeWindow(this);
}
}
protected override void OnHandleDestroyed(EventArgs e)
{
base.OnHandleDestroyed(e);
if (_editNativeWindow != null)
{
_editNativeWindow.Dispose();
_editNativeWindow = null;
}
}
通过以上五个步骤,就可以实现给ComboBox 加水印了,完整的代码就到附件列表中下载吧。来看一下效果:
声明:
本文版权归作者和CS 程序员之窗所有,欢迎转载,转载必须保留以下版权信息,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
作者:Starts_2000
出处:http://www.csharpwin.com CS 程序员之窗。
你可以免费使用或修改提供的源代码,但请保留源代码中的版权信息,详情请查看: