【问题标题】:How do I retrieve the correct size of native Windows controls?如何检索本机 Windows 控件的正确大小?
【发布时间】:2016-04-20 21:45:06
【问题描述】:

我使用这一行来创建一个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 控件的文本字段具有相同的高度?

【问题讨论】:

  • 组合框是复合控件。有子 (WS_CHILD) 控件 - 您可以获取它们的大小。请参阅GetWindowGW_CHILD
  • 谢谢@i486!你能帮我解决我的问题吗?
  • 在带有资源文件的对话框中创建类似的控件。然后阅读它们的实际尺寸(这是第二个问题)。请注意,在不同的 Windows 版本或屏幕方案/DPI 大小上,控件可能看起来非常不同。
  • @i486 我认为必须有一种更舒适的方法来确定默认控件大小。例如,COMBOBOX 如何获得文本字段的标准大小?
  • @i486:您应该使用GetComboBoxInfo(),而不是使用GetWindow(GW_CHILD)。它返回子控件的所有 HWND,以及编辑字段和箭头按钮的RECT 坐标。

标签: c windows user-interface winapi


【解决方案1】:

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 函数动态创建。

【讨论】:

  • 我已经使用cbircItem 字段做出了先前的回答,然后调用AdjustWindowRect 来考虑组合框的编辑控件的样式和ex 样式,但是这个新的GetWindowRect 的版本实际上更简单。
【解决方案2】:

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

我应该对我的 COMBOBOX 应用哪个高度以允许下拉列表根据需要展开?

这完全取决于您。一个明智的选择是至少有 8 个项目可见。考虑组合框在其父客户区中的位置。您通常倾向于将下拉列表留在父级中。但这并不总是实用的,如果组合框靠近窗口底部,那么您别无选择,只能让它超出父级的底部。当心这导致的可用性问题,如果父窗口位于桌面底部附近,列表将不会完全可见。

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

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

【讨论】:

  • 谢谢,我不得不考虑切换到更现代的 GUI 框架。
猜你喜欢
  • 2014-07-30
  • 1970-01-01
  • 2016-12-17
  • 2021-06-28
  • 1970-01-01
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多