Вопрос
Как создать элемент управления «Кнопка» (с помощью CreateWindow
из BUTTON
класс окна), который имеет стандартный общесистемный размер (особенно высоту), соответствующий остальным приложениям Windows?Конечно, мне следует принять во внимание DPI и, возможно, другие настройки.
Примечание: С использованием
USE_CW_DEFAULT
для ширины и высоты получается кнопка размера 0, 0, так что это не решение.
Решение 2
В идеальном, беззаботном мире...
Чтобы создать кнопку стандартного размера, нам нужно сделать следующее:
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
struct соответственно) и самостоятельно перевести их с помощью MulDiv, пока не вы находитесь в диалоге, тогда MapDialogRect()
сделает всю работу за вас.
Обратите внимание, что tmAveCharWidth
лишь приблизительно соответствует фактической средней ширине символов, поэтому рекомендуется использовать GetTextExtentPoint32()
вместо этого функция работает с алфавитным набором символов.
Видеть:
- Как рассчитать единицы измерения диалогового окна на основе текущего шрифта в Visual C++
- Как рассчитать базовые единицы диалога с несистемным шрифтом
Более простая альтернатива
Если кнопки — единственный элемент управления, размер которого вы хотите изменить автоматически, вы также можете использовать BCM_GETIDEALSIZE
сообщение Button_GetIdealSize()
макрос (только для Windows XP и более поздних версий) для получения оптимальной ширины и высоты, подходящей для всего, что содержит кнопка, хотя он выглядит довольно некрасиво без каких-либо полей вокруг текста кнопки.
Другие советы
Вот что говорит MSDN: Спецификации и рекомендации по проектированию – Визуальный дизайн:Макет.
Размер кнопки по умолчанию составляет 50x14 DLU, который можно пересчитать в пикселях, используя примеры, показанные для GetDialogBaseUnits.
А КартаДиалогРект функция, похоже, выполняет вычисления за вас.
@macbirdie:вам НЕ следует использовать GetDialogBaseUnits(), он основан на системном шрифте по умолчанию (растровый шрифт Ugly).Вы должны использовать MapDialogRect()