如何创建一个具有CreateWindow
窗口类BUTTON
的按钮控件,该控件具有与其他Windows应用程序一致的标准系统范围(特别是高度)?
我当然应该考虑DPI,可能还有其他设置。
备注:使用
USE_CW_DEFAULT
作为宽度和高度会产生0,0大小的按钮,因此这不是解决方案。
答案 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文档备注。
但,这些指标基于系统字体。如果你的窗口使用了一个shell对话框字体,或者只是一些不会让你的眼睛流血的东西,那你几乎就是你自己。
要获得自己的“对话框”基本单元,您必须使用GetTextMetrics()
检索当前文字指标,并使用{{1}的字符高度和平均宽度(tmHeight
和tmAveCharWidth
分别)和你自己的MulDiv翻译它们,除非你在对话框中,然后TEXTMETRIC
将为你完成所有的工作。
请注意,MapDialogRect()
仅接近实际的平均字符宽度,因此建议在字母字符集上使用GetTextExtentPoint32()
函数。
请参阅:
如果按钮是您想要自动调整大小的唯一控件,您还可以使用BCM_GETIDEALSIZE
消息Button_GetIdealSize()
宏(仅限Windows XP及更高版本)来检索适合按钮所包含内容的最佳宽度和高度虽然它看起来很丑陋但没有在按钮的文本周围应用任何边距。
答案 2 :(得分:1)
@macbirdie:你不应该使用GetDialogBaseUnits(),它基于默认的系统字体(丑陋的位图字体)。您应该使用MapDialogRect()