C语言 如何检索本机 Windows 控件的正确大小



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

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

我找不到任何有关默认大小的文档,但我希望有一种正确的方法来调整控件的大小。

总结一下,我的问题是:

  1. 我应该对COMBOBOX应用什么高度,以允许下拉列表根据需要扩展?

  2. 我应该对EDIT应用哪个高度,以使COMBOBOXEDIT控件的文本字段具有相同的高度?

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

我应该向我的 COMBBOBOX 应用什么高度,以允许下拉列表根据需要扩展?

这完全取决于你。 一个明智的选择是至少 ~8 个项目可见。考虑组合框在其父级工作区中的位置。 您通常倾向于将下拉列表保留在父项中。 但这并不总是实用的,如果组合框靠近窗口的底部,那么您别无选择,只能让它延伸到父窗口的底部之外。 请注意这导致的可用性问题,如果父窗口位于桌面底部附近,则列表将不完全可见。

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

这往往会使UI设计师变得非常糟糕,当您为这些控件提供相同的字体时,您无法获得相同的高度。 组合框将高两个像素。 但是,文本可以正确对齐。 奇怪的怪癖,我对此没有很好的解释,30 年的兼容性可能很难逆向工程。 我认为这与以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 函数动态创建对话框。

最新更新