如何创建按钮控件(使用 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);

在哪里 5014 是各自的 DLU 尺寸, 48 分别是水平和垂直的对话框模板单元,基于 GetDialogBaseUnits() 功能 文档备注。


没有什么是完美的

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

要获得自己的“对话”基本单位,您必须使用以下命令检索当前文本指标 GetTextMetrics() 并使用字符高度和平均宽度(tmHeighttmAveCharWidthTEXTMETRIC struct 分别)并用您自己的 MulDiv 翻译它们, 除非 你在一个对话框中,然后 MapDialogRect() 将为您完成所有工作。

注意 tmAveCharWidth 仅近似实际的平均字符宽度,因此建议使用 GetTextExtentPoint32() 而是在字母字符集上运行。

看:


更简单的替代方案

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

其他提示

MSDN 上是这么说的: 设计规范和指南 - 视觉设计:布局.

按钮的默认大小为 50x14 DLU,可以使用显示的示例将其计算为像素 获取对话框基本单位.

地图对话框矩形 函数似乎可以帮你计算。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top