2017-01-29 18 views
2

Дополнительно справочная информацияИмеют ли дочерние окна один и тот же DPI, что и их родители, в приложении, предназначенном для каждого монитора?

Некоторое время назад я спросил this question, который специально говорит о текстовых размеров и DLUs, и было сделано без меня понимая, что на самом деле имел в виду каждое осознание DPI. Однако это никуда не делось. Скорее всего, я виноват, что не писал четкого вопроса, задавая вопрос о моей конкретной конкретной проблеме, а не об общей проблеме, которая выходит из нее («проблема xX»?).

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

Конечно, этот тип вещей выходит за рамки вычисления только DLU. Например, окно, которое рисует изображения на обеих вертикальных половинах, должно будет беспокоиться о том, что DPI каждого монитора изменяется прямо вниз по середине. Поэтому позвольте мне задать общий, недвусмысленный вопрос.


Фактический вопрос

Сегодня я нашел эти две статьи MSDN:

После прочтения, я теперь понимаю, это много о системе DPI awarenesses:

  • PROCESS_SYSTEM_DPI_AWARE
    • при запросе ДОИ чего-то, система даст ДОИ основного монитора
    • это значение не может и, следовательно, не будет меняться на протяжении всего срока службы программы
    • эквивалентно вызову старшего SetProcessDPIAware()
  • PROCESS_DPI_UNAWARE
    • как PROCESS_SYSTEM_DPI_AWARE кроме DPI фиксируется на 96
  • PROCESS_PER_MONITOR_DPI_AWARE
    • система дает ДОИ любой монитор окно случается на; когда это изменяется, отправляется WM_DPICHANGED
    • страница на этом сообщении говорит, что это также может произойти, если изменяется DPI монитора; Я не знаю, что вы могли бы сделать это сейчас

То, что я хотел бы знать:

В случае PROCESS_PER_MONITOR_DPI_AWARE, является DPI всех детей (не принадлежит) окна окно такое же, как у родительского окна?

Обратите внимание на превосходство: часть о DPI, не меняющаяся на весь срок службы программы, означает, что ответ «да» для двух других значений осведомленности.

Или, как еще один пример, предположим, что у меня есть окно шириной 300 пикселей с двумя элементами управления, шириной 100 пикселей, на противоположных краях. Если я перетащил это окно между двумя мониторами с разными DPI, чтобы один из элементов управления находился на одном мониторе, а другой - на другом, а затем запросил их DPI (используя GetDC() и GetDeviceCaps()), будут ли они такими же?

Если да, то мне не нужно беспокоиться о преобразовании координат между родительскими окнами и дочерними окнами.

Если ответ отрицательный, то следующий вопрос будет WM_DPICHANGED, отправленный дочерним окнам, или только до верхнего уровня?Потому что мне все-таки понадобится способ узнать, когда изменился ДПИ детей, поэтому я могу по крайней мере попробовать, чтобы переставить его, чтобы выглядеть правильно (что я еще не понял, как это сделать, и который является еще одним вопросом, но я предполагаю, что это должно быть только MulDiv()).

Спасибо.

+0

Я еще не пишу код, поддерживающий DPI, и я всегда задавался вопросом, как окно с поддержкой DPI обрабатывает случай, когда он охватывает несколько мониторов разных DPI. –

ответ

1

Когда система решает, что большая часть окна перешла на другой монитор, окно верхнего уровня отправляется WM_DPICHANGED, и ожидается, что все окно будет изменено для нового DPI.

Иными словами, система не пытается иметь окна со смешанным DPI.

+0

И, таким образом, в дополнение, все дети имеют DPI верхнего уровня. Благодаря! (Я полагаю, что люди, держащие окна на полпути между мониторами, будут удивлены тем, что половина выглядит размытой из-за этого масштабирования, но я точно не знаю, поскольку у меня нет монитора с высоким разрешением DPI: /) – andlabs

+1

для тестирования необходимо иметь высокий монитор DPI. Вам просто нужны два монитора. Ударьте один из них настолько высоко, насколько сможете. Наверняка это выглядит глупо, но вы можете проверить систему. –

+1

Рассмотрите также покрытие случая, о котором OP не думал, контекстное меню. –