[英]How do I retrieve the correct size of native Windows controls?
我用这一行来创建一个EDIT
控件:
hMyEdit = CreateWindowEx(
WS_EX_CLIENTEDGE,
L"EDIT",
L"",
WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_LEFT,
10,
10,
200,
25,
hParentWnd,
(HMENU)IDC_MY_EDIT,
hInst,
NULL
);
在它旁边,有一个COMBOBOX
:
hMyCombo = CreateWindowEx(
WS_EX_CLIENTEDGE,
L"COMBOBOX",
L"",
WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | WS_VSCROLL | ES_LEFT | CBS_DROPDOWNLIST| CBS_HASSTRINGS,
220,
10,
90,
200,
hParentWnd,
(HMENU)IDC_MY_COMBO,
hInst, NULL
);
我无法弄清楚有两个问题:
如果我减小COMBOBOX
的高度(当前为200),这也会限制实际下拉列表的最大高度。 但是, 没有下拉列表的控件的实际高度根本不受影响。 COMBOBOX
是否应该使用超过给定高度的下拉列表?
如何使我的EDIT
控件与COMBOBOX
控件的文本字段的高度相同?
我无法找到任何有关默认大小的文档,但我希望有适当的方法来控制大小。
总结一下,我的问题是:
我应该将哪个高度应用于我的COMBOBOX
以允许下拉列表尽可能扩展?
我应该将哪个高度应用于我的EDIT
以使COMBOBOX
和EDIT
控件的文本字段具有相同的高度?
行为取决于您为组合框选择的样式。 如果它是CBS_SIMPLE,则高度由传递给CreateWindowEx()的nHeight参数确定。 但是如果它是CBS_DROPDOWN / LIST,那么nHeight设置下拉范围,它自己计算出文本框部分的高度需要是什么。 根据字体,发送WM_SETFONT会改变高度。
我应该将哪个高度应用于我的COMBOBOX以允许下拉列表尽可能扩展?
这完全取决于你。 一个明智的选择是至少可以看到~8个项目。 考虑组合框在其父客户区中的位置。 您通常喜欢留在父母中的下拉列表。 但这并不总是实用的,如果组合框靠近窗口的底部,那么你别无选择,只能让它超出父母的底部。 请注意由此导致的可用性问题,如果父窗口位于桌面底部附近,则列表将不会完全可见。
我应该将哪个高度应用于我的编辑以使COMBOBOX和EDIT控件的文本字段具有相同的高度?
这往往会让UI设计师变得非常蹩脚,当您为这些控件提供相同的字体时,您无法获得相同的高度。 组合框将高两个像素。 然而,文本正确对齐。 奇怪的怪癖和我没有很好的解释,30年的appcompat很难逆向工程。 我假设它与CBS_DROPDOWNLIST样式中显示的焦点矩形所需的空间有关。 你可以修补字体,给组合框一个有意的小字体,但看起来也不是很好。 Anyhoo,使用WM_SETFONT确保组合框和文本框以相同的字体显示文本。
COMBOBOX
是否应该使用超过给定高度的下拉列表?
不,当内容不适合列表框部分时,将出现滚动条。 您甚至可以添加CBS_DISABLENOSCROLL
以强制滚动条始终可见。
如何使我的
EDIT
控件与COMBOBOX
控件的文本字段的高度相同?
编辑:使用GetComboBoxInfo获取组合框的编辑部分的句柄(以及其他内容),然后使用GetWindowRect获取其矩形:
COMBOBOXINFO cbi;
cbi.cbSize = sizeof(cbi);
GetComboBoxInfo(hMyCombo, &cbi);
GetWindowRect(cbi.hwndCombo, &r);
现在高度是r.bottom - r.top
并且在我的测试中返回24
,这非常接近你通过实验获得的25。 也就是说,使用拨号盒更容易。 您可以使用CreateDialogIndirect函数从资源创建对话框或动态创建对话框。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.