|
发表于 2011-11-14 18:51:00
|
显示全部楼层
Re: DirectX 全屏问题
下面这代码是我测试程序专用的,相当精简。
- // 切换窗口/全屏模式
- void CRender::ToggleScreen(BOOL bWindow)
- {
- if (m_D3DParam.Windowed == bWindow) return;
- m_D3DParam.Windowed = bWindow;
- OnLostDevice();
- OnResetDevice();
- DWORD wndStyle = GetWindowLong(m_hWnd, GWL_STYLE);
- // 窗口模式
- if (bWindow)
- {
- RECT rcWnd = { 0, 0, m_ScreenWidth, m_ScreenHeight };
- AdjustWindowRect( &rcWnd, wndStyle, FALSE);
- SetWindowLong(m_hWnd, GWL_STYLE, wndStyle);
- SetWindowPos(m_hWnd, HWND_NOTOPMOST,
- (GetSystemMetrics(SM_CXSCREEN)-m_ScreenWidth)/2,
- (GetSystemMetrics(SM_CYSCREEN)-m_ScreenHeight)/2,
- (rcWnd.right - rcWnd.left), (rcWnd.bottom-rcWnd.top),
- SWP_SHOWWINDOW);
- }
- // 全屏模式
- else
- {
- // 改变指定窗口的属性
- SetWindowLong(m_hWnd, GWL_STYLE, wndStyle);
- // 设置窗口位置
- SetWindowPos(m_hWnd, HWND_TOPMOST,
- 0,
- 0,
- GetSystemMetrics(SM_CXSCREEN),
- GetSystemMetrics(SM_CYSCREEN),
- SWP_SHOWWINDOW); // 窗口不能被移动和改变大小
- }
- }
- void CRender::OnLostDevice()
- {
- if (CGameFont::s_pGameFont != NULL)
- {
- CGameFont::s_pGameFont->OnLostDevice();
- }
- }
- void CRender::OnResetDevice()
- {
- if (FAILED(m_pD3DDevice->Reset(&m_D3DParam)))
- {
- return;
- }
- if (CGameFont::s_pGameFont != NULL)
- {
- CGameFont::s_pGameFont->OnResetDevice();
- }
- SetRenderState();
- }
- void CRender::SetRenderState()
- {
- m_pD3DDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
- m_pD3DDevice->SetFVF(D3DFVF_VERTEX2D);
- // 启用融合运算
- m_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE, true);
- m_pD3DDevice->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
- m_pD3DDevice->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
- m_pD3DDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
- }
复制代码
主要函数都在这了。
直接调用ToggleScreen()就OK
其中m_D3DParam是D3DPRESENT_PARAMETERS类型的变量,D3D初始化的时候,保存下来就行,
还有字体对象,最终会调用ID3DXFont::OnLostDevice()和ID3DXFont::OnResetDevice(),你若不用这东西,就不用管了。 |
|