Вопрос

Как создать элемент управления «Кнопка» (с помощью 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() вместо этого функция работает с алфавитным набором символов.

Видеть:


Более простая альтернатива

Если кнопки — единственный элемент управления, размер которого вы хотите изменить автоматически, вы также можете использовать BCM_GETIDEALSIZE сообщение Button_GetIdealSize() макрос (только для Windows XP и более поздних версий) для получения оптимальной ширины и высоты, подходящей для всего, что содержит кнопка, хотя он выглядит довольно некрасиво без каких-либо полей вокруг текста кнопки.

Другие советы

Вот что говорит MSDN: Спецификации и рекомендации по проектированию – Визуальный дизайн:Макет.

Размер кнопки по умолчанию составляет 50x14 DLU, который можно пересчитать в пикселях, используя примеры, показанные для GetDialogBaseUnits.

А КартаДиалогРект функция, похоже, выполняет вычисления за вас.

@macbirdie:вам НЕ следует использовать GetDialogBaseUnits(), он основан на системном шрифте по умолчанию (растровый шрифт Ugly).Вы должны использовать MapDialogRect()

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top