9

如何创建一个按钮控件(具有CreateWindow窗口BUTTON类),它具有与其他 Windows 应用程序一致的标准系统范围大小(尤其是高度)?我当然应该考虑 DPI 和其他设置。

备注:使用USE_CW_DEFAULTfor 宽度和高度会导致 0、0 大小的按钮,因此这不是解决方案。

4

3 回答 3

9

这就是 MSDN 不得不说的:设计规范和指南 - 视觉设计:布局

按钮的默认大小为 50x14 DLU,可以使用为GetDialogBaseUnits显示的示例计算像素。

MapDialogRect函数似乎为您进行计算

于 2008-09-12T10:36:16.173 回答
9

在完美无忧的世界...

要创建标准尺寸按钮,我们必须这样做:

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);

其中5014是各自的 DLU 维度,48分别是水平和垂直对话模板单元,基于GetDialogBaseUnits()函数文档注释。


没有什么是完美的

正如 Anders 指出的那样,这些指标是基于系统字体的。如果您的窗口使用 shell 对话框字体或任何不会让您眼睛流血的字体,那么您几乎只能靠自己了。

要获得您自己的“对话框”基本单位,您必须检索当前文本度量GetTextMetrics()并使用字符高度和平均宽度(tmHeight分别tmAveCharWidthTEXTMETRIC结构体)并自己使用 MulDiv 翻译它们,除非您在对话框中,否则MapDialogRect()将为您完成所有工作。

请注意,它tmAveCharWidth仅近似于实际的平均字符宽度,因此建议GetTextExtentPoint32()在字母字符集上使用函数。

看:


更简单的选择

如果按钮是您想要自动调整大小的唯一控件,您还可以使用BCM_GETIDEALSIZE消息Button_GetIdealSize()宏(仅限 Windows XP 及更高版本)来检索适合按钮包含的任何内容的最佳宽度和高度,尽管在按钮周围没有应用任何边距时它看起来很丑陋文本。

于 2008-09-12T11:03:03.470 回答
1

@macbirdie:你不应该使用 GetDialogBaseUnits(),它基于默认的系统字体(丑陋的位图字体)。你应该使用 MapDialogRect()

于 2008-09-12T15:55:42.613 回答