如何在DirectX 11桌面应用程序中更改窗口大小

我正在编写基于这个msdn链接中的教程的DirectX 11着色器程序:

https://msdn.microsoft.com/en-us/library/windows/desktop/jj552952.aspx

当我运行它,它是全屏。 更改交换链大小不会按预期更改窗口大小。 有没有办法改变窗口大小? 我只是想创build一个固定大小的窗口,如果它恰好覆盖整个屏幕,我希望它是独家全屏。

我可以使用IDXGISwapChain1 :: GetHwnd方法从交换链获取HWND。 这个句柄对于调整窗口大小是否有用?

相应的代码可以在这里find:

https://code.msdn.microsoft.com/windowsdesktop/Direct3D-Tutorial-Win32-829979ef

您应该看看处理窗口大小调整的Direct3D Win32游戏 VS 2013 Win32桌面应用模板,尽管它不支持全屏独占模式转换。

Win32桌面应用程序中Direct3D 11窗口大小调整的基本处理是更新Window Procedure以处理WM_SIZE ,但是您需要应对大量情况。

 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { static bool s_in_sizemove = false; static bool s_minimized = false; switch (message) { ... case WM_SIZE: if (wParam == SIZE_MINIMIZED) { // The window was minimized (you should probably suspend the application) if (!s_minimized) { s_minimized = true; } } else if (s_minimized) { // The window was minimized and is now restored (resume from suspend) s_minimized = false; } else if ( !s_in_sizemove ) { // Here is where you handle the swapchain resize for maximize or unmaximize } break; case WM_ENTERSIZEMOVE: // We want to avoid trying to resizing the swapchain as the user does the 'rubber band' resize s_in_sizemove = true; break; case WM_EXITSIZEMOVE: s_in_sizemove = false; // Here is the other place where you handle the swapchain resize after the user stops using the 'rubber-band' break; case WM_GETMINMAXINFO: { // We want to prevent the window from being set too tiny auto info = reinterpret_cast<MINMAXINFO*>(lParam); info->ptMinTrackSize.x = 320; info->ptMinTrackSize.y = 200; } break; ... 

做Direct3D swapchain调整大小:

  • 使用空值调用ID3D11DeviceContext::OMSetRenderTargets以解除对渲染目标和任何深度/模板缓冲区的绑定。
  • 释放渲染目标视图和深度/模板视图,以及对原始后台缓冲区或深度/模板缓冲区的任何其他引用。
  • 调用D3D11DeviceContext::Flush让这些更改完成
  • 调用IDXGISwapChain::ResizeBuffers调整backbuffer的大小。 确保您响应DXGI_ERROR_DEVICE_REMOVEDDXGI_ERROR_DEVICE_RESET失败。
  • 再次执行与新建尺寸相同的设置:为新的后台缓冲区创建渲染目标视图,为深度/模板缓冲区创建一个与新的后台缓冲区大小(可选)相匹配的深度模板视图,并重置视口大小。

由于此过程对应用程序进行了一些假设,因此为了简单起见,在Win32桌面教程中省略了它。 这种情况是为Direct3D Win32游戏模板,Windows Store DirectX应用程序模板和Windows phone DirectX应用程序模板处理的。

Windows Store应用程序或Windows Phone应用程序没有“全屏独占模式”,所以这些模板不能实现它。 对于Win32桌面教程和Direct3D Win32游戏模板,我使用以下来确保我不必应付它:

 dxgiFactory->MakeWindowAssociation(hwnd, DXGI_MWA_NO_ALT_ENTER); 

我希望重温如何扩展Direct3D的Win32游戏模板来支持全屏独占模式,但是我还没有得到它。