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

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

作者:BlogUpdater |  时间:2023-07-20 |  浏览:686 |  评论已关闭 条评论

最近有很多人对这种现象感到吃惊:当创建一个组合框控件(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?》

最近我写了个东西
正如你们所知道的,拓扑梅尔智慧办公平台(Topomel Box)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。

标签:

评论已关闭。