В идеальном, простом мире ...
Чтобы создать кнопку стандартного размера, мы должны сделать это:
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()
функция замечания по документации.
Ничто не идеально
НО , как указал Андерс, эти показатели основаны на системном шрифте. Если в вашем окне используется шрифт диалогового окна оболочки или просто что-то, что не вызывает у вас кровотечения, вы в значительной степени сами по себе.
Чтобы получить свои собственные «диалоговые» базовые единицы, вы должны извлечь текущие текстовые метрики с помощью GetTextMetrics()
и использовать высоту и среднюю ширину символов (tmHeight
и tmAveCharWidth
структуры TEXTMETRIC
соответственно) и перевести их с MulDiv самостоятельно, , если вы не находитесь в диалоговом окне, тогда MapDialogRect()
сделает всю работу за вас.
Обратите внимание, что tmAveCharWidth
только приближает фактическую среднюю ширину символа, поэтому рекомендуется использовать функцию GetTextExtentPoint32()
для набора буквенных символов.
См:
Более простая альтернатива
Если кнопки являются единственным элементом управления, размер которого вы хотите изменить автоматически, вы также можете использовать BCM_GETIDEALSIZE
сообщение Button_GetIdealSize()
макрос (только для Windows XP и выше) для получения оптимальной ширины и высота, которая подходит для всего, что содержит кнопка, хотя выглядит довольно некрасиво без наложения полей вокруг текста кнопки.