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了。