为什么组合框的大小包括下拉列表的大小?
最近有很多人对这种现象感到吃惊:当创建一个组合框控件(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)是一款绿色软件,主要面向经常使用电脑的朋友。它提供了各种提升办公效率的小功能,同时操作上尽可能地简单方便。
我想:你值得拥有。
- 下一篇: 向API添加标志位并不具备扩展性
- 上一篇: Visual Studio 中的新特性:可视化宏扩展
相关推荐
- 对话框管理器第八章:对话框中的自定义导航
- Posted on 08月17日
- 有关调用约定的历史 – 第一部分
- Posted on 09月22日
- 技法:对你的应用添加键盘加速键
- Posted on 06月20日
- 错误信息:无法使用内置管理员账户打开IE
- Posted on 05月20日
评论已关闭。