2

我正在制作一个 Direct3D 应用程序,我可以使用IDirect3DDevice9::Reset新的演示参数轻松地从窗口模式转到全屏模式。但是,当我使用相同的技巧从全屏模式转到窗口模式时,窗口现在失去了边框。

如果我尝试SetWindowLong将窗口样式设置为WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU(然后SetWindowPos使用SWP_FRAMECHANGED),则窗口现在获得其边框,但 direct3d 设备不再工作。再次重置设备不起作用,而不是再次重置,Reset(),当然会失败,因为我的托管资源依赖于我的设备。Release()SetWindowLong()CreateDevice()

如何IDirect3DDevice9::Reset在创建带边框的窗口时返回窗口模式?

4

1 回答 1

0

首先,您需要更改窗口的属性:

SetWindowLongPtr(hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW);

if (new_pos_size)
{
    // if you want new position (pos_x, pos_y) and size (width, height)
    UINT flags = SWP_FRAMECHANGED | SWP_SHOWWINDOW;
    SetWindowPos(hWnd, HWND_NOTOPMOST, pos_x, pos_y, width, height, flags);
}
else
{
    UINT flags = SWP_NOMOVE | SWP_NOSIZE | SWP_FRAMECHANGED | SWP_SHOWWINDOW;
    SetWindowPos(hWnd, 0, 0, 0, 0, 0, flags);
}

接下来,您必须释放您在默认池中创建的任何资源 - D3DPOOL_DEFAULT(如果可能,最好使用D3DPOOL_MANAGED)。如果你不这样做,IDirect3DDevice9::Reset就会失败。
然后您可以重置设备并最终在需要时重新创建任何资源。确保您正确设置D3DPRESENT_PARAMETERSIDirect3DDevice9::Reset

于 2011-12-10T16:00:08.720 回答