Я разрабатываю приложения в системе Windows 7, используя Embarcadero RAD Studio C ++ Builder XE7. Я пытаюсь сделать так, чтобы один из моих приложений знал о DPI. Для этого мне нужно воспроизвести одно из следующих действий:
- Остановите все типы осведомленности о DPI и предоставьте приложению одинаковый размер независимо от выбранного DPI
- Разрешить Windows для виртуализации приложения (AFAIK, это поведение по умолчанию)
- Уведомите Windows, что приложение поддерживает DPI, и разрешите приложению изменять размеры своих компонентов, включив свойство TForm Scaled для всех форм моего приложения.
Используя файл манифеста, я могу идеально воспроизвести эти 3 сценария в своем приложении.
Однако я хочу выбрать способ, которым приложение будет вести себя изнутри самого приложения во время выполнения. Например, я хочу использовать командную строку, как показано ниже, чтобы открыть мое приложение:
C:> MyApp.exe / DPIBehavior = [Игнорировано, Виртуализировано, масштабировано]
Я заметил, что Windows SDK предоставляет несколько функций для достижения этой цели. Поскольку я все еще разрабатываю для Windows 7, я не могу ни использовать, ни тестировать функцию SetProcessDPIAwareness (), потому что она недоступна до Windows 8.1, поэтому я попытался использовать функцию SetProcessDPIAware ().
Я заметил, что эта функция хорошо останавливает процесс виртуализации Windows. Однако моя форма больше не масштабируется, даже если для свойства формы установлено значение true. Здесь я указываю, что я скомпилировал 2 разные версии моего приложения, одну с включенным свойством Scaled в главной сети, другую без, но обе с вызовом функции SetProcessDPIAware () как можно скорее.
Я тестировал эти версии приложений при 192 dpi. Поскольку они дают точно такой же результат, то есть пользовательский интерфейс с точно таким же размером, я считаю, что масштабирование не работает, когда используется функция SetProcessDPIAware (). С другой стороны, когда я запускаю точно такие же приложения, используя манифест вместо вызова функции SetProcessDPIAware (), я получаю ожидаемый результат: одно приложение масштабируется, а другое нет.
Может кто-нибудь объяснить мне, как использовать функцию SetProcessDPIAware () при сохранении масштабирования TForm? Или это ошибка XE7?