О проблеме DPI - PullRequest
       19

О проблеме DPI

2 голосов
/ 21 февраля 2009

У меня есть WIN32 SW, пользовательский интерфейс которого был спроектирован в 96 DPI, поэтому, когда пользователь изменяет DPI для Windows с 96 на 120 или более, пользовательский интерфейс будет неправильным. Я хочу знать, есть ли API, чтобы заставить мое ПО отображать пользовательский интерфейс с 96DPI.

Ответы [ 3 ]

2 голосов
/ 21 февраля 2009

Начиная с Windows Vista, масштабирование для DPI должно происходить автоматически. У меня нет никакого прямого опыта, чтобы знать, как хорошо это работает, но вот страница, которая объясняет, как это отключить:

http://msdn.microsoft.com/en-us/library/ms701681(VS.85).aspx

2 голосов
/ 21 февраля 2009

Вы также можете добавить ключ appcompat для своего приложения. Место для этого в реестре:

HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers

Это настройки для каждого пользователя, такая же клавиша есть в HKEY_LOCAL_MACHINE, но, конечно, это системная настройка, которая требует повышенных привилегий для записи. Добавляем ключ вот так:

"C:\path\to\app.exe"="HIGHDPIAWARE"

Включит этот флаг совместимости для вашей программы, что отключит масштабирование DPI. Это для Vista +.

SetProcessDPIAware также является опцией, но учтите, что существует опасность возникновения состояния гонки, согласно документации.

1 голос
/ 21 февраля 2009

Нет API, который бы заставлял ваше приложение показывать в 96DPI. DPI является настройкой устройства и не может управляться приложением.

Если вы можете изменить свою программу, вы можете масштабировать свой интерфейс, чтобы он выглядел правильно при высоком DPI. Вам нужно позвонить GetDeviceCaps; более конкретно, вам нужно вычислить шкалу X и Y, используя число, возвращаемое для LOGPIXELSX и LOGPIXELSY. Примерно так:

HDC hdc;
double m_dDPIScaleX = GetDeviceCaps(hdc, LOGPIXELSX) / 96.0;
double m_dDPIScaleY = GetDeviceCaps(hdc, LOGPIXELSY) / 96.0;
...