Странное разрешение рабочего стола после установки полноэкранного режима DX11

У меня есть приложение с поддержкой DPI (через файл манифеста), и в системе с 1 монитором все следующие методы возвращают неправильное разрешение рабочего стола:

  • GetSystemMetrics
  • GetMonitorInfo
  • GetWindowRect (GetDesktopWindow () и рабочий стол)
  • EnumDisplaySettingsExA / ENUM_CURRENT_SETTINGS
  • IDXGIOutput :: GetDesc

У меня монитор 4k, но я установил размер рабочего стола на 1920x1080 с масштабом 100%. В оконном режиме разрешение, сообщаемое всеми методами, является правильным. Однако при переключении в полноэкранный режим все они возвращают 1600x1200. Если это была проблема с DPI, она должна, по крайней мере, сохранить соотношение сторон, например 1600x900.

Я заметил, что неправильные результаты возникают после вызова IDXGISwapChain :: SetFullscreenState (true, output_device), где объект цепочки подкачки создается с флагом DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH согласно MSDN.

Приложение использует DirectX 11.

Любые предложения, в чем моя причина?

Спасибо


person xenomeno    schedule 08.03.2019    source источник
comment
Вы на 100% уверены, что ваше полноэкранное разрешение соответствует разрешению рабочего стола? Это вообще не так ...   -  person rubenvb    schedule 08.03.2019
comment
Можно с уверенностью предположить, что это не имеет ничего общего с dpi-осведомленностью. Существует специальная страница документации. о проблемах с полноэкранным режимом, цитируя: Однако многие приложения переключаются на предпочтительное полноэкранное разрешение.   -  person Hans Passant    schedule 08.03.2019
comment
@rubenvb да, полноэкранное разрешение было немного неправильным (из-за перехода от Exclusive-Windowed-Exclusive), что привело к неправильному изменению размера целевых объектов DX, которые должны вызываться перед SetFullscreenState ().   -  person xenomeno    schedule 08.03.2019


Ответы (1)


Итак, я обнаружил проблему - IDXGISwapChain :: ResizeTarget (режим), размер которого необходимо изменить перед переходом в полноэкранный режим, был с неправильным разрешением (из-за предыдущего оконного режима с нестандартным размером). Это привело к тому, что IDXGISwapChain :: SetFullscreenState (true, output_device) переключился на разные странные разрешения рабочего стола в зависимости от того, что было размером целей DX. Установка целей с правильным разрешением рабочего стола (взятым через EnumDisplaySettingsExA / ENUM_CURRENT_SETTINGS) до изменения состояния решила эту проблему.

person xenomeno    schedule 08.03.2019