现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

自绘下拉列表框

2013-12-06 00:18 工业·编程 ⁄ 共 777字 ⁄ 字号 暂无评论

下拉列表框,又称组合列表框,他是一个较为复杂的控件。它有三种状态,simple、drop down、drop list。由三个控件组成,编辑框、下拉按钮、listbox。所以,要实现下拉列表框的综合自绘,其工作量是蛮大的。而且,在一些特殊场合,要求下拉列表框具有一些特殊要求,所以想在一个例子中完全实现下拉列表框的所有功能也不太现实。基于上述愿因,本例中只是简单地实现了drop list状态下的,显示部分的控件的重绘,其中包括只读的编辑框和下拉按钮,例子中并未重绘listbox。
        明确了目标,我们就可以开始工作了。首先还是观察,下拉列表框和编辑框一样都有一个3D的外观。不一样的时,在“自绘编辑框”一文中我提到过,编辑框的3D外观是非客户区。而通过实验我发现,在下拉列表框中3D外观属于客户区,这样一来我们必须重载OnPaint函数来进行重绘。说到这大家应该明白了,在这个例子中,我只是重绘了下拉列表框的客户区,这其中包括按钮和编辑框。
        重绘客户区去掉3D外观,我们需要绘制边框,绘制背景,绘制显示文字,绘制按钮。前三项都好说,有一点绘图经验的人都不会对如何绘制这些东西有疑问。但是,对于下拉按钮的绘制就存在一些问题,按钮的区域多大?按钮的状态如何确定?下拉按钮是一个CButton么?
        为了解决按钮绘制的问题,我用了COMBOBOXINFO结构,同过GetComboBoxInfo函数获取到了下拉列表框的相关信息,这个结构中包含了stateButton(按钮状态)和rcButton(按钮区域)。这样就可以很好的解决按钮的绘制问题。具体实现请参考源码。
        正如文章开始所说,下拉列表框得重绘是较为复杂的,本文只是简单地实现了客户区的自绘。希望这篇文章能起到抛砖引玉的作用,期待和大家共同讨论,共同提高。

源文件

给我留言

留言无头像?