c++ - 如何阻止 Direct3D 11 将全屏拉伸到显示器大小?
问题描述
我正在尝试使我的 Direct3D 窗口全屏,分辨率为 800x600。但是,我尝试的所有操作都会使屏幕拉伸以覆盖整个显示器,而不是仅占用两侧有黑条的 800x600 区域。光标也被拉伸。
我用这个 DXGI_SWAP_CHAIN_DESC 创建我的交换链:
DXGI_SWAP_CHAIN_DESC sd{};
sd.BufferDesc.Width = 0;
sd.BufferDesc.Height = 0;
sd.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
sd.BufferDesc.RefreshRate.Numerator = 0;
sd.BufferDesc.RefreshRate.Denominator = 0;
sd.BufferDesc.Scaling = DXGI_MODE_SCALING_UNSPECIFIED;
sd.BufferDesc.ScanlineOrdering = DXGI_MODE_SCANLINE_ORDER_UNSPECIFIED;
sd.SampleDesc.Count = 1;
sd.SampleDesc.Quality = 0;
sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
sd.BufferCount = 1;
sd.OutputWindow = hWnd;
sd.Windowed = TRUE;
sd.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;
sd.Flags = 0;
然后我使用以下代码设置屏幕分辨率:
DEVMODEW devMode{};
devMode.dmSize = sizeof(devMode);
devMode.dmPelsWidth = width;
devMode.dmPelsHeight = height;
devMode.dmFields = DM_PELSHEIGHT | DM_PELSWIDTH;
LONG res = ChangeDisplaySettingsW(&devMode, CDS_FULLSCREEN);
最后我将交换链设置为全屏:
HRESULT hr = swap->SetFullscreenState(on, nullptr);
此外,在我的窗口过程中,每当收到 WM_SIZE 时,我都会调用它:
swapChain.reset(); // Destroy swap chain
context->ClearState();
if (FAILED(swap->ResizeBuffers(0, 0, 0, DXGI_FORMAT_UNKNOWN, 0))) throw Exception("Failed to resize buffers");
swapChain.emplace(swap.Get(), device.Get(), context.Get(), hWnd); // Recreate swap chain
我已经尝试在 DXGI_SWAP_CHAIN_DESC 和 ResizeBuffers 中使用 DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH,并使用我想要的大小调用IDXGISwapChain::ResizeTarget,但我仍然遇到同样的问题。
解决方案
推荐阅读
- reactjs - 如何在 React 中安全地将 props 有条件地传递给功能组件
- java - 无法设置 ArrayList 值
- html - 固定浮动元素的 CSS 位置
- python - SQLAlchemy - MySQL - 检查现有表中是否存在行
- java - 如何在recyclerview中第一次从firebase中获取数据只有10行
- linux - 为什么虚拟地址 55Fxxxxxxxxx 和 7FFxxxxxxxxx 之间是 64 位 Linux 用户空间?(只有 45 位)
- python - 验证是否为每个设备生成的输出文件在一个文件名中
- flutter - 保持 Flutter dart 流打开以观察模型的变化
- ios - Visual Studio mac,xamarin,没有显示模拟器
- spring - java.lang.IllegalArgumentException:区域设置部分“en-US,en;q=0.9”包含无效字符]