C#:关于WinForm中ComboBox的探究

来源:互联网 发布:和女友重口味玩法知乎 编辑:程序博客网 时间:2024/05/22 07:50

ComboBox就是.net里面用于做下拉菜单的控件。

平时用得很多,却对它知道的很少。

 

其实ComboBox并不像平常以为的那样是一整个控件。而是由其他控件复合而成的。

其中,下拉菜单的那个三角形按钮和输入框的边框都是ComboBox的整体。是绘制出来的。

而,那个可以输入的部分则是由一个无边框的Edit控件构成的。

 

知道了这一点就可以去解释一个问题。

 

我们发现,当ComboBox的Enable设置为False的时候,整个控件会变成灰色。

在有的情况下,我们需要改变ComboBox在不可用状态下的颜色。

我们可以去继承它,然后重绘它的外观。比如:

 

 

 

经过绘制了边框和填充了背景色之后,我们发现ComboBox在不可用状态下的样子有点让人不解

 

 

也就是说,经过绘制,我们没有把那个按钮画出来,然后边框画成了蓝色,背景画成了红色。

 

但是,中间那块灰色区域是怎么回事?

 

这就是因为。ComboBox会把自己的Enable属性赋值给Edit控件。从而导致Edit控件也出现了不可用。

但是由于重绘的时候只能重绘ComboBox,里面的Edit的样式是自动由系统绘制的,所以控制不到。

对于这一点应该怎么办呢?

 

既然里面是一个控件。那么就应该可以拿到它的句柄。方法如下,先声明API:

 

 

 

在适当的地方调用

 

 

就可以得到里面的Edit的句柄。

值得注意的是,上面这句只有在ComboBox的外部调用的时候才行。如果是在ComboBox内部调用。会出错。

所以可以在ComboBox的外面再包一层用户控件。在Enable属性被更改的时候来做这个。

拿到Edit的句柄之后,我们只要用API ShowWindow来隐藏掉它。然后再自己重绘Text到ComboBox的背景上,就可以做出一个可以改变颜色的不可用ComboBox了。

原创粉丝点击