题
如何创建按钮控件(使用 CreateWindow
的一个 BUTTON
窗口类)是否具有与其他 Windows 应用程序一致的标准系统范围尺寸(尤其是高度)?我当然应该考虑 DPI 和可能的其他设置。
评论: 使用
USE_CW_DEFAULT
对于宽度和高度会产生 0, 0 大小的按钮,所以这不是解决方案。
解决方案 2
在完美无忧的世界里...
要创建标准尺寸的按钮,我们必须这样做:
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()
功能 文档备注。
没有什么是完美的
但 正如安德斯指出的那样,这些指标基于系统字体。如果您的窗口使用 shell 对话框字体或任何不会让您流血的字体,那么您就只能靠自己了。
要获得自己的“对话”基本单位,您必须使用以下命令检索当前文本指标 GetTextMetrics()
并使用字符高度和平均宽度(tmHeight
和 tmAveCharWidth
的 TEXTMETRIC
struct 分别)并用您自己的 MulDiv 翻译它们, 除非 你在一个对话框中,然后 MapDialogRect()
将为您完成所有工作。
注意 tmAveCharWidth
仅近似实际的平均字符宽度,因此建议使用 GetTextExtentPoint32()
而是在字母字符集上运行。
看:
更简单的替代方案
如果按钮是您想要自动调整大小的唯一控件,您也可以使用 BCM_GETIDEALSIZE
信息 Button_GetIdealSize()
宏(仅限 Windows XP 及更高版本)来检索适合按钮包含的任何内容的最佳宽度和高度,尽管在按钮文本周围没有应用任何边距的情况下看起来相当难看。
其他提示
MSDN 上是这么说的: 设计规范和指南 - 视觉设计:布局.
按钮的默认大小为 50x14 DLU,可以使用显示的示例将其计算为像素 获取对话框基本单位.
这 地图对话框矩形 函数似乎可以帮你计算。
@麦克小鸟:你不应该使用 GetDialogBaseUnits(),它基于默认的系统字体(丑陋的位图字体)。您应该使用 MapDialogRect()