Размер кнопки по умолчанию? - PullRequest
8 голосов
/ 12 сентября 2008

Как создать элемент управления кнопки (с CreateWindow класса окна BUTTON), который имеет стандартный общесистемный размер (особенно высоту), совместимый с остальными приложениями Windows? Конечно, я должен учитывать DPI и, возможно, другие настройки.

Примечание: Использование USE_CW_DEFAULT для ширины и высоты приводит к кнопке размера 0, 0, так что это не решение.

Ответы [ 3 ]

8 голосов
/ 12 сентября 2008

Вот что говорит MSDN: Технические характеристики и рекомендации по проектированию - Визуальный дизайн: макет .

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

Функция MapDialogRect , кажется, выполняет вычисления за вас.

7 голосов
/ 12 сентября 2008

В идеальном, простом мире ...

Чтобы создать кнопку стандартного размера, мы должны сделать это:

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 и выше) для получения оптимальной ширины и высота, которая подходит для всего, что содержит кнопка, хотя выглядит довольно некрасиво без наложения полей вокруг текста кнопки.

1 голос
/ 12 сентября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...