默认按钮大小?

时间:2008-09-12 10:25:32

标签: winapi

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

  

备注:使用USE_CW_DEFAULT作为宽度和高度会产生0,0大小的按钮,因此这不是解决方案。

3 个答案:

答案 0 :(得分:8)

这就是MSDN所说的:Design Specifications and Guidelines - Visual Design: Layout

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

MapDialogRect函数似乎在为你计算。

答案 1 :(得分:7)

在完美无忧的世界......

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

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() function文档备注。


没有什么是完美的

Anders指出,

,这些指标基于系统字体。如果你的窗口使用了一个shell对话框字体,或者只是一些不会让你的眼睛流血的东西,那你几乎就是你自己。

要获得自己的“对话框”基本单元,您必须使用GetTextMetrics()检索当前文字指标,并使用{{1}的字符高度和平均宽度(tmHeighttmAveCharWidth分别)和你自己的MulDiv翻译它们,除非你在对话框中,然后TEXTMETRIC将为你完成所有的工作。

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

请参阅:


更简单的替代

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

答案 2 :(得分:1)

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