默认按钮大小?
如何创建按钮控件(带有" 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()