Мне нужно определить предпочтительный размер – как ширину, так и высоту – элементов управления в Windows API. Насколько я могу судить, единственным официальным словом по этому вопросу является страница «Макет» Руководства для Windows Desktop Program , документ, который, как представляется, представлен в Windows Vista и эквивалент документов Microsoft Management Console , на котором, как представляется, основывается первое.
На предыдущей странице приведены примеры размеров как в диалоговых windowsх, так и в пикселях (что-то не на последней странице!) Якобы для 9-точечного интерфейса Segoe с разрешением 96 точек на дюйм. Я не знаю, были ли вычисления диалогового блока никогда не обновлены для этого нового значения DPI или нет, но независимо, я пробовал три разных подхода, и ничего не складывается точно.
Эта программа вычисляется двумя способами, как на основе информации здесь, так и здесь . Первый использует поле TEXTMETRICS
структуры TEXTMETRICS
; второй использует GetTextExtentPoint32()
в первой ссылке. Затем он повторяет этот процесс, принимая во внимание древний шрифт системы (см. Первую ссылку).
Запуск этой программы в Windows 7 с
BUTTON_SIZE_X
хранится в 50 (указанная ширина нескольких вещей) BUTTON_SIZE_Y
изменилось на 25 (указанная высота командной строки Vista и выше только с одной строкой текста) так что наш ожидаемый размер, основанный на странице макета, будет 75×41 доходности
GetTextExtentPoint32: Segoe UI 9 | baseX 7 baseY 15 | button 50 x 25 -> 88 x 47 tm.tmAveCharWidth: Segoe UI 9 | baseX 6 baseY 15 | button 50 x 25 -> 75 x 47 with system font: System 9 GetTextExtentPoint32: Segoe UI 9 | cX 7 cY 15 sysX 8 sysY 16 | button 50 x 25 -> 87 x 46 tm.tmAveCharWidth: Segoe UI 9 | cX 6 cY 15 sysX 7 sysY 16 | button 50 x 25 -> 85 x 46
Уже мы видим четыре разных возможных преобразования из диалоговых блоков в пиксели.
Вторая программа просто создает фиктивный диалоговое окно и вызывает MapDialogRect()
для получения координат baseX и baseY в приведенном выше . Это дает
Segoe UI 9 weight:400 italic:0 charset:1 [0 0 8 16]
и если мы вручную выполним вычисления, то первая программа:
width - (50*8)/4 = 100 height - (25*16)/8 = 50
Мне интересно, использовали ли все вычисления (в том числе и для Command Links) Tahoma или MS Sans Serif, шрифты, используемые до Vista … но тогда я не знаю, какой правильный размер!
И это все еще оставляет элементы управления, такие как флажки и элементы управления статическим текстом (и ссылки на команды!), Которые не имеют указанной формулы ширины или ширины. Конечно, для элементов управления статическим текстом я мог просто получить ширину текста и сказать, что это предпочтительная ширина, но это не учитывает любое возможное горизонтальное дополнение, предоставляемое элементом управления. И это не отвечает за флажками, где есть дополнительная ширина для части флажка. (Я нашел способы найти эти координаты, особенно в Stack Overflow, но все они имеют свои недостатки). Даже MMC-документы, о которых я упоминал в начале этого вопроса, говорят много (или, что еще хуже, чтобы сделать все как можно шире, если это подходит для диалогового windows, это полностью работает, когда я пытаюсь выяснить, насколько сделайте диалоговое окно в первую очередь!).
Более того, когда Microsoft создала библиотеку Common Controls версии 6, они решили включить сообщения для определения правильного размера элементов управления! … только некоторые элементы управления:
BCM_GETIDEALSIZE
– кнопки ; перечисленные как неэффективные для других типов кнопок DTM_GETIDEALSIZE
– DTM_GETIDEALSIZE
даты / времени LM_GETIDEALSIZE
– гиперссылки; возвращает только высоту для заданной ширины RBBIM_IDEALSIZE
– элементы управления ReBar; на самом деле не сообщение, а что-то еще TB_GETIDEALSIZE
– панели инструментов Как насчет сравнения с элементами управления в Windows? В Windows XP все хорошо выглядит правильно, но диалоги и другие элементы управления Winodws 7 удивительно непоследовательны (некоторые до сих пор используют Tahoma или даже MS Sans Serif в качестве диалогового шрифта!), И я никогда не могу быть уверен, какой размер кнопки правильный.
Так что я хочу знать, это любая комбинация:
Просто некоторые подсказки:
1. Чтобы получить предпочтительный размер управления windowsми:
Если визуальный стиль включен , используйте GetThemePartSize , иначе вам нужно разработать свою программу для расчета предпочтительного размера. Пожалуйста, обратитесь к исходному коду Firefox.
2. Как настроить элементы управления:
или как определить правильный размер и правильную позицию для элемента управления. Это не простая проблема, вам нужно разработать собственную систему управления макетами, как это делает другая система пользовательского интерфейса. Возьмем андроид в качестве примера,
Для приложения существует множество различных требований к компоновке, поэтому в android разрабатывается множество менеджеров компоновки, таких как LinearLayout, GridLayout и т. Д. То же самое делается и для системы компоновки пользовательского интерфейса Windows и всех других систем компоновки пользовательского интерфейса.
Вам нужно написать много кода, сделайте это правильно. Пожалуйста, обратитесь к исходному коду системы chrome / firefox UI.
3. Решение:
Я думаю, вам лучше использовать существующую систему пользовательского интерфейса, такую как QT / Vxwidgets, чтобы сделать макет управления Windows.