如何检索原生Windows控件的正确大小?

我使用这一行来创build一个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 ); 

有两个问题我不明白:

  1. 如果我减less我的COMBOBOX的高度(目前是200),这也限制了实际下拉列表的最大高度。 但是, 没有下拉列表的控件的实际高度根本不受影响。 COMBOBOX是否应该在下拉列表中使用超过给定的高度?

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

我无法find任何有关默认大小的文档,但我希望有一个适当的方法来控制大小。

总结起来,我的问题是:

  1. 我应该将哪个高度应用到我的COMBOBOX以允许下拉列表尽可能地扩大?

  2. 我应该将哪个高度应用到我的EDIT使其具有与COMBOBOXEDIT控件的文本字段相同的高度?

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

我应该将哪个高度应用到我的COMBOBOX,以允许下拉列表尽可能地扩大?

这完全取决于你。 一个理智的选择是至少有8个项目可见。 考虑在其父母的客户区的组合框的位置。 你通常会喜欢留在家长的下拉列表。 但是,这并不总是实际可行的,如果组合框靠近窗口的底部,那么你没有选择,只能让它超出父母的底部。 请注意造成这一问题的可用性问题,如果父窗口位于桌面底部附近,则列表将不会完全可见。

我应该将哪个高度应用到我的EDIT中,使其具有与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。 也就是说,使用一个dialgo box更容易。 您可以使用CreateDialogIndirect函数从资源或动态创建对话框。