有很多游戏会提供这样的功能,比如足球经理,生化危机,魔兽世界等,这样做最大的便利,是让你可以在玩游戏的同时做其他事情 ( I Guess )。
1.首先要做的事情是为D3DPRESENTATION_PARAMETERS设置好与此有关的参数,简单的说就是,我们必须要让device明确知道当前的top窗口是哪个,并且要知道这个窗口的长与宽,这样device才能准确切换。
2.如果是从全屏幕切为窗口屏幕,我们需要修改D3DPRESENTATION_PARAMETERS中的windowed为true。并设置FullScreen_RefreshRateInHz为0。同时利用SetWindowPos方法来确定把窗口放在什么地方
3.如果是从窗口屏幕切为全屏幕,我们需要修改D3DPRESENTATION_PARAMETERS中的windowed为false。并设置FullScreen_RefreshRateInHz为D3DPRESENT_RATE_DEFAULT。保存当前窗口的位置以供恢复
4.最后,我们需要把修改后的D3DPRESENTATION_PARAMETERS设置到device中,并避免一切可能因为切换而产生lost的render target,如font等。
代码例子如下(已封装):
void JLY_1DxRenderer::ToggleFullscreen(){
//调换当前窗口状态
m_kPresent.Windowed = !m_kPresent.Windowed;
if (m_kPresent.Windowed)
{
//非全屏刷新率为0
m_kPresent.FullScreen_RefreshRateInHz = 0;
}
else
{
//全屏则设置为D3DPRESENT_RATE_DEFAULT,并保存当前窗口位置
GetWindowRect(m_kPresent.hDeviceWindow,&m_rcWindow);
m_kPresent.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
}
//执行设备丢失与重新设置操作
OnDeviceLost();
ResetDevice();
//如果被恢复非全屏,则将当前窗口设置到原来位置(在全屏时保存)
if (m_kPresent.Windowed)
{
SetWindowPos(m_kPresent.hDeviceWindow,
NULL,
m_rcWindow.left,
m_rcWindow.top,
m_rcWindow.right - m_rcWindow.left,
m_rcWindow.bottom - m_rcWindow.top,
SWP_NOZORDER | SWP_DRAWFRAME | SWP_SHOWWINDOW);
}
}
void JLY_1DxRenderer::ResetDevice(){
}
void JLY_1DxRenderer::OnDeviceLost(){
//恢复设备
ms_hResult = m_pqDevice->Reset(&m_kPresent);
assert(SUCCEEDED(ms_hResult));
}
http://blog.csdn.net/programrookie/article/details/4321513