默认按钮大小?

时间:2020-03-05 18:52:06  来源:igfitidea点击:

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

Remark: Using USE_CW_DEFAULT for width and height results in a 0, 0 size button, so that's not a solution.

解决方案

回答

这就是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分别是水平和垂直对话框模板单元。

没有完美的

但是正如Anders指出的那样,这些指标是基于系统字体的。如果窗口使用的是shell对话框字体,或者只是使用任何不会使眼睛流血的字体,那么我们就完全可以依靠自己了。

为了获得自己的"对话"基本单位,我们必须使用GetTextMetrics()检索当前的文本度量,并使用字符高度和平均宽度(分别为TEXTMETRIC结构的tmHeight和tmAveCharWidth)并使用除非我们在对话框中,否则我们可以自行使用MulDiv,然后MapDialogRect()将为我们完成所有工作。

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

看:

  • 如何基于Visual C ++中的当前字体计算对话框单位
  • 如何计算基于非系统字体的对话框基本单位

更简单的选择

如果按钮是我们要自动调整大小的唯一控件,则还可以使用BCM_GETIDEALSIZE消息Button_GetIdealSize()宏(仅适用于Windows XP及更高版本)来检索适合按钮所包含内容的最佳宽度和高度,尽管看起来很漂亮丑陋,按钮的文字周围没有任何空白。

回答

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