我正在创建一个Direct3D应用程序,我可以使用带有新演示参数的IDirect3DDevice9::Reset
轻松地从Windowed转到Fullscreen模式。但是,当我使用相同的技巧从全屏模式转到窗口模式时,窗口现在已经丢失了边框。
如果我尝试SetWindowLong
将窗口样式设置为WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU
(然后将SetWindowPos
设置为SWP_FRAMECHANGED
),则窗口现在会获得边框,但是direct3d设备不再有效。再次重置设备不起作用,而Reset(),
代替Release()
而SetWindowLong()
再CreateDevice()
再次IDirect3DDevice9::Reset
,当然会失败,因为我的托管资源依赖于我的设备
如何在创建边框窗口时让{{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
。