如何创建一个按钮控件(带有
CreateWindow
窗口类的 BUTTON
),该控件具有与其他 Windows 应用程序一致的标准系统范围尺寸(尤其是高度)?
我当然应该考虑 DPI 以及可能的其他设置。
备注: 使用
表示宽度和高度会导致 0, 0 大小按钮,因此这不是解决方案。USE_CW_DEFAULT
要创建标准尺寸的按钮,我们必须这样做:
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 及更高版本)来检索适合按钮包含的任何内容的最佳宽度和高度如果按钮文本周围没有应用任何边距,它看起来非常难看。
这就是 MSDN 所说的:设计规范和指南 - 视觉设计:布局。
按钮的默认大小为 50x14 DLU,可以使用 GetDialogBaseUnits 所示的示例将其计算为像素。
MapDialogRect函数似乎可以为您进行计算。
@macbirdie:你不应该使用 GetDialogBaseUnits(),它基于默认的系统字体(丑陋的位图字体)。你应该使用MapDialogRect()