为什么组合框的大小包括下拉列表的大小?

最近有很多人对这种现象感到吃惊:当创建一个组合框控件(Combo Box)时(不管是通过 CreateWindow 调用直接进行创建还是通过对话框模板间接创建),我们所指定的控件大小实际上是包含了组合框的下拉列表的,即使这个下拉框在屏幕上没有显示出来,也是如此 。这是为什么?
我们先举个例子理解理解 。
假设 , 你希望创建一个高度为 200 个像素的组合框控件 , 则当它显示出来的时候,它的高度实际上只有 20 个像素,当用户点击下拉箭头显示下拉列表时,这个列表的高度将为 180 个像素 。
这种看似有点怪异的行为 , 带来一个不幸的结果:即如果你没有考虑到这一点,在对话框模板中指定一个 20 像素高的组合框,你最终会得到一个组合框,其下拉列表框高度为零像素! 这种组合框可不是我们想要的,对吧?
【为什么组合框的大小包括下拉列表的大小?】那些切换到公共控件库( Common Control Library )版本 6 的人可能已经注意到,版本 6 组合框检测到这个常见错误并“自动修复”它:如果它检测到组合框创建者指定的高度小得离谱,它会尝试自动将其放大到更合理的值 。这是应用户界面设计人员的要求完成的,他们厌倦了在一个又一个程序中苦苦挣扎 , 这些程序将组合框的高度设置得太小,最终显示没有列表框的组合框 。
例如 , 想象一下,一个”选择你所在的省份”的组合框,其中下拉列表一次只显示两个省份!(出于兼容性原因,未对版本 6 之前的组合框进行更改 。)
但我仍然没有回答本文开头提出的问题: “为什么组合框的大小要包括下拉列表的大小?”
原因在于: 原版的组合框控件压根就没有下拉列表 。最初设计的时候,组合框只是一个编辑控件和一个粘在一起的列表框 。
(你仍然可以在记事本的“字体”对话框中看到这种”老式组合框”)。
你可以将原始组合框视为新式组合框,其中下拉列表已固定打开 。
在此原始设计下 , 组合框的大小同时包含编辑控件和列表框是合理的,因为这是它占用的空间 。
当组合框的 “drop-down” 样式被引入后,设计人员希望尽可能轻松地从”旧时组合框”过渡到”光滑的新下拉组合框” , 因此保留了大小调整行为,以便代码和对话框不必更改以利用新的下拉样式组合框,除了更改调用CreateWindow 时使用的CBS_DROPDOWNLIST 或 CBS_DROPDOWN 风格参数 。
这就是为什么组合框的大小包括下拉列表的大小 。这是一个向后兼容性链,一直追溯到组合框学会如何下拉之前的旧时代 。

总结

虽然新版本共用控件库已经帮我们自动解决了此问题,但是知道它的来龙去脉,也是不错的 。

最后

Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识 , 对于广大Windows平台开发者来说,确实十分有帮助 。
本文来自:《Why does the size of a combo box include the size of the drop-down?》
为什么组合框的大小包括下拉列表的大小?

相关经验推荐