Правильный способ получения предпочтительного размера элементов управления Windows

Мне нужно определить предпочтительный размер – как ширину, так и высоту – элементов управления в 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_GETIDEALSIZEDTM_GETIDEALSIZE даты / времени
  • LM_GETIDEALSIZE – гиперссылки; возвращает только высоту для заданной ширины
  • RBBIM_IDEALSIZE – элементы управления ReBar; на самом деле не сообщение, а что-то еще
  • TB_GETIDEALSIZE – панели инструментов

Как насчет сравнения с элементами управления в Windows? В Windows XP все хорошо выглядит правильно, но диалоги и другие элементы управления Winodws 7 удивительно непоследовательны (некоторые до сих пор используют Tahoma или даже MS Sans Serif в качестве диалогового шрифта!), И я никогда не могу быть уверен, какой размер кнопки правильный.

Так что я хочу знать, это любая комбинация:

  • какой из пяти методов расчета действительно прав, если примеры на странице макетов нет?
  • есть / была ли более авторитетная ссылка на размер управления (и идеально подходит для стимуляции), чем неполные страницы макета и MMC-макета?
  • была ли такая ссылка, которая предшествовала Vista, которая также могла бы дать подсказки?
  • или все это просто безнадежно, и я должен выбрать что-то, что мне кажется, что-то не так.

Просто некоторые подсказки:

1. Чтобы получить предпочтительный размер управления windowsми:

Если визуальный стиль включен , используйте GetThemePartSize , иначе вам нужно разработать свою программу для расчета предпочтительного размера. Пожалуйста, обратитесь к исходному коду Firefox.

2. Как настроить элементы управления:

или как определить правильный размер и правильную позицию для элемента управления. Это не простая проблема, вам нужно разработать собственную систему управления макетами, как это делает другая система пользовательского интерфейса. Возьмем андроид в качестве примера,

  1. Он должен измерять размер элемента управления на основе размера текущего windows и его собственных параметров компоновки (фиксированный / заполняющий-родительский / warp-контент). Для текстовой кнопки необходимо измерить размер текста.
  2. Если сумма всех размеров детей переполняет размер windows, необходимо выполнить некоторую координацию.
  3. Наконец, установите правильный размер и положение для элемента управления.

Для приложения существует множество различных требований к компоновке, поэтому в android разрабатывается множество менеджеров компоновки, таких как LinearLayout, GridLayout и т. Д. То же самое делается и для системы компоновки пользовательского интерфейса Windows и всех других систем компоновки пользовательского интерфейса.

Вам нужно написать много кода, сделайте это правильно. Пожалуйста, обратитесь к исходному коду системы chrome / firefox UI.

3. Решение:

Я думаю, вам лучше использовать существующую систему пользовательского интерфейса, такую ​​как QT / Vxwidgets, чтобы сделать макет управления Windows.