如何创建一个按钮控件(具有CreateWindow
窗口BUTTON
类),它具有与其他 Windows 应用程序一致的标准系统范围大小(尤其是高度)?我当然应该考虑 DPI 和其他设置。
备注:使用
USE_CW_DEFAULT
for 宽度和高度会导致 0、0 大小的按钮,因此这不是解决方案。
如何创建一个按钮控件(具有CreateWindow
窗口BUTTON
类),它具有与其他 Windows 应用程序一致的标准系统范围大小(尤其是高度)?我当然应该考虑 DPI 和其他设置。
备注:使用
USE_CW_DEFAULT
for 宽度和高度会导致 0、0 大小的按钮,因此这不是解决方案。
这就是 MSDN 不得不说的:设计规范和指南 - 视觉设计:布局。
按钮的默认大小为 50x14 DLU,可以使用为GetDialogBaseUnits显示的示例计算像素。
MapDialogRect函数似乎为您进行计算。
要创建标准尺寸按钮,我们必须这样做:
LONG units = GetDialogBaseUnits();
m_hButton = CreateWindow(TEXT("BUTTON"), TEXT("Close"),
WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,
0, 0, MulDiv(LOWORD(units), 50, 4), MulDiv(HIWORD(units), 14, 8),
hwnd, NULL, hInst, NULL);
其中50和14是各自的 DLU 维度,4和8分别是水平和垂直对话模板单元,基于GetDialogBaseUnits()
函数文档注释。
但正如 Anders 指出的那样,这些指标是基于系统字体的。如果您的窗口使用 shell 对话框字体或任何不会让您眼睛流血的字体,那么您几乎只能靠自己了。
要获得您自己的“对话框”基本单位,您必须检索当前文本度量GetTextMetrics()
并使用字符高度和平均宽度(tmHeight
分别tmAveCharWidth
是TEXTMETRIC
结构体)并自己使用 MulDiv 翻译它们,除非您在对话框中,否则MapDialogRect()
将为您完成所有工作。
请注意,它tmAveCharWidth
仅近似于实际的平均字符宽度,因此建议GetTextExtentPoint32()
在字母字符集上使用函数。
看:
如果按钮是您想要自动调整大小的唯一控件,您还可以使用BCM_GETIDEALSIZE
消息Button_GetIdealSize()
宏(仅限 Windows XP 及更高版本)来检索适合按钮包含的任何内容的最佳宽度和高度,尽管在按钮周围没有应用任何边距时它看起来很丑陋文本。
@macbirdie:你不应该使用 GetDialogBaseUnits(),它基于默认的系统字体(丑陋的位图字体)。你应该使用 MapDialogRect()