转到Direct3D 9中的窗口模式

时间:2011-10-19 19:15:01

标签: winapi directx direct3d direct3d9

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

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

如何在创建边框窗口时让{{1}}返回窗口模式?

1 个答案:

答案 0 :(得分: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_PARAMETERS IDirect3DDevice9::Reset