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

jus*_*.me 9 c windows user-interface winapi

我用这一行来创建一个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
);
Run Code Online (Sandbox Code Playgroud)

旁边有一个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
);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

总结一下,我的问题是:

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

  2. 我应该在哪个高度应用于我和控件EDIT的文本字段具有相同的高度?COMBOBOXEDIT

Han*_*ant 5

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

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

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

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

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