Это будет очень сложно... правильный способ решения этой проблемы: IDXGIFactory::MakeWindowAssociation
, который, насколько мне известно, еще никому не удалось успешно использовать. Вы можете попробовать это в любом случае.
"Правильный" ответ - вручную обрабатывать Alt+Enter. Итак, отключите Alt+Enter с помощью MakeWindowAssociation
и запачкайте руки. Во-первых, нет необходимости захватывать WM_SIZE
. Вместо этого слушайте WM_ENTERSIZEMOVE
, WM_CAPTURECHANGED
, WM_WINDOWPOSCHANGED
и WM_EXITSIZEMOVE
. Это избавит вас от необходимости иметь дело с WM_SIZE
и по-прежнему получать все соответствующие события изменения размера окна. (При этом также прочитайте этот вопрос: WM_ENTERSIZEMOVE /WM_EXITSIZEMOVE - при использовании меню не всегда парное)
Итак, предположим, что все прошло нормально, для Alt+Enter вам нужно сделать следующее: Вы устанавливаете свою цепочку обмена в полноэкранный режим, используя IDXGISwapChain::SetFullscreenState
, а затем измените размер цепочки подкачки (IDXGISwapChain::ResizeBuffers
). По умолчанию вы получите цепочку подкачки, максимально приближенную к текущему разрешению вашего окна перед изменением размера. Чтобы сделать это правильно, сначала перечислите полноэкранные разрешения, а после перехода в полноэкранный режим установите разрешение, которое вы хотите иметь. Звучит некрасиво, но кажется самым надежным способом решения проблемы.
В общем, реальный, эксклюзивный полноэкранный режим не стоит проблем, так как вы всегда будете мерцать, когда кто-то нажимает Alt + Tab (вы не можете избежать этого, если произойдет переключение режима, так как сам экран должен будет перенастроиться). гораздо лучшим решением является использование полноэкранного окна без полей. Вы просто создаете класс окна без каких-либо украшений, делаете его полноэкранным, размещаете его так, чтобы он покрывал весь экран, и покончили с этим. Тогда вам вообще не придется беспокоиться об Alt+Enter и Alt+Tab. Это также позволяет людям продолжать работу на втором экране без мерцания. С точки зрения производительности это довольно неплохо (большинство новых игр поддерживают это как «полноэкранный режим без полей».)
Может быть серебряная пуля, которая решает все это правильно, но я ее еще не видел. Если есть более чистое/красивое решение, мне было бы очень любопытно его услышать. «Полноэкранный режим без полей», по-видимому, является текущим стандартом, хотя IIRC, Unity 5 разрешает «полноэкранный режим без полей» только для Direct3D 11.
person
Anteru
schedule
18.08.2014