如何检索本机Windows控件的正确大小?

时间:2016-01-15 10:09:25

标签: c windows user-interface winapi

我使用此行创建const intervalID; const doSomething = () => { // do stuff if (isFinished()) { clearInterval(intervalID); // <--jshint complains that intervalID is not defined } } intervalID = setInterval(doSomething, 1000); 控件:

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

我无法弄清楚有两个问题:

  1. 如果我降低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 ); 的高度(目前为200),这也会限制实际下拉列表的最大高度。但是,控件没有下拉列表的实际高度根本不受影响。 COMBOBOX是否应该使用超过下拉列表的给定高度?

  2. 如何使COMBOBOX控件的高度与EDIT控件的文本字段相同?

  3. 我无法找到有关默认尺寸的任何文档,但我希望有适当的方法来控制尺寸。

    总结一下,我的问题是:

    1. 我应该向COMBOBOX应用哪个高度以允许下拉列表尽可能扩展?

    2. 我应该向COMBOBOX应用哪个高度,使EDITCOMBOBOX控件的文字字段具有相同的高度?

2 个答案:

答案 0 :(得分:5)

行为取决于您为组合框选择的样式。如果它是CBS_SIMPLE,则高度由传递给CreateWindowEx()的 nHeight 参数确定。但如果它是CBS_DROPDOWN / LIST,那么 nHeight 设置下拉范围,它自己计算出文本框部分的高度需要是多少。根据字体,发送WM_SETFONT会改变高度。

  

我应该将哪个高度应用于我的COMBOBOX以允许下拉列表尽可能扩展?

这完全取决于你。一个明智的选择是至少可以看到~8个项目。考虑组合框在其父客户区中的位置。您通常喜欢留在父母中的下拉列表。但这并不总是实用的,如果组合框靠近窗口的底部,那么你别无选择,只能让它超出父母的底部。请注意由此导致的可用性问题,如果父窗口位于桌面底部附近,则列表将不会完全可见。

  

我应该将哪个高度应用于我的编辑以使COMBOBOX和EDIT控件的文本字段具有相同的高度?

这往往会让UI设计师变得非常蹩脚,当您为这些控件提供相同的字体时,您无法获得相同的高度。组合框将高两个像素。然而,文本正确对齐。奇怪的怪癖和我没有很好的解释,30年的appcompat很难逆向工程。我假设它与CBS_DROPDOWNLIST样式中显示的焦点矩形所需的空间有关。你可以修补字体,给组合框一个有意的小字体,但看起来也不是很好。 Anyhoo,使用WM_SETFONT确保组合框和文本框以相同的字体显示文本。

答案 1 :(得分:0)

  

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函数从资源创建对话框或动态创建对话框。