如何实现D3D全屏与窗口的转换

1649 篇文章 11 订阅
480 篇文章 12 订阅

有很多游戏会提供这样的功能,比如足球经理,生化危机,魔兽世界等,这样做最大的便利,是让你可以在玩游戏的同时做其他事情 ( 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值