我正在编写基于这个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_REMOVED
和DXGI_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游戏模板来支持全屏独占模式,但是我还没有得到它。