📄 whdxgraphic.cpp
字号:
else
{
bNum = bCnt;
break;
}
}
}
else
{
if ( g_stDXGEnumDeviceInfo[bCnt].f3DHardware ) return bCnt;
else bNum = bCnt;
}
}
}
return bNum;
}
/******************************************************************************************************************
窃荐疙 : CWHDXGraphicWindow::DestroyDXGObjects()
累己磊 :
累己老 :
格利 :
免仿 : HRESULT
[老磊][荐沥磊] : 荐沥郴侩
*******************************************************************************************************************/
HRESULT CWHDXGraphicWindow::DestroyDXGObjects()
{
HRESULT hr;
LONG lDDRefCnt = 0L;
LONG lD3DRefCnt = 0L;
if ( !(m_bScreenModeFlag & _DXG_SCREENMODE_WINDOW) )
{
if ( FAILED(hr = m_pDD->RestoreDisplayMode()) )
return E_FAIL;
}
if ( m_pDD )
{
if ( FAILED(hr = m_pDD->SetCooperativeLevel(m_hWnd, DDSCL_NORMAL)) )
return E_FAIL;
}
if ( m_pd3dDevice )
{
if ( 0 < ( lD3DRefCnt = m_pd3dDevice->Release() ) )
return E_FAIL;
}
m_pd3dDevice = NULL;
SAFE_RELEASE(m_pddsBackBuffer);
SAFE_RELEASE(m_pddsFrontBuffer);
SAFE_RELEASE(m_pddsZBuffer);
// 俊叼飘扩档快 免仿阑 困秦辑 努府欺甫 技泼茄促.
SAFE_RELEASE(m_lpcClipper);
SAFE_RELEASE(m_pD3D);
if ( m_pDD )
{
if ( 0 < ( lDDRefCnt = m_pDD->Release() ) )
INT nAAAAAA = 0;
// return E_FAIL;
}
m_pDD = NULL;
if ( m_hDefGameFont != NULL )
{
DeleteObject(m_hDefGameFont);
m_hDefGameFont = NULL;
}
return S_OK;
// return ( lDDRefCnt==0 && lD3DRefCnt==0 ) ? S_OK : E_FAIL;
}
/******************************************************************************************************************
窃荐疙 : CWHDXGraphicWindow::FreeDXGEnumModeResources()
累己磊 :
累己老 :
格利 :
免仿 : VOID
[老磊][荐沥磊] : 荐沥郴侩
*******************************************************************************************************************/
VOID CWHDXGraphicWindow::FreeDXGEnumModeResources()
{
for ( BYTE bCnt = 0; bCnt < g_bNumDevices; bCnt++ )
{
SAFE_DELETE( g_stDXGEnumDeviceInfo[bCnt].pddsdModes );
}
}
/******************************************************************************************************************
窃荐疙 : CWHDXGraphicWindow::CreateDXG()
累己磊 :
累己老 :
格利 :
免仿 : HRESULT
[老磊][荐沥磊] : 荐沥郴侩
*******************************************************************************************************************/
HRESULT CWHDXGraphicWindow::CreateDXG()
{
HRESULT hr;
BYTE bSelecedDevice = FindDriverAndDevice();
if ( SUCCEEDED(hr = DirectDrawCreateEx(g_stDXGEnumDeviceInfo[bSelecedDevice].pDriverGUID, (VOID**)&m_pDD, IID_IDirectDraw7, NULL)) )
{
if ( m_bScreenModeFlag & _DXG_SCREENMODE_WINDOW )
{
if ( FAILED(hr = m_pDD->SetCooperativeLevel(m_hWnd, DDSCL_NORMAL)) )
return E_FAIL;
}
else
{
if ( FAILED(hr = m_pDD->SetCooperativeLevel(m_hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT)) )
return E_FAIL;
if ( FAILED(hr = m_pDD->SetDisplayMode(m_stDisplayInfo.wWidth, m_stDisplayInfo.wHeight, m_stDisplayInfo.wBPP, 0, 0)) )
return E_FAIL;
}
if ( FAILED(hr == CreatePrimarySurface()) )
{
MessageBox(m_hWnd, TEXT("[CWHDXGraphicWindow::CreateDXG]") TEXT("Primary surface create failed."), TEXT("MirDXG"), MB_ICONERROR | MB_OK);
return E_FAIL;
}
UpdateBoundsWnd();
if ( m_bDeviceModeFlag & _DXG_DEVICEMODE_D3D )
{
if ( FAILED( hr = m_pDD->QueryInterface(IID_IDirect3D7, (VOID**)&m_pD3D)) )
return E_FAIL;
if ( FAILED(hr = m_pD3D->CreateDevice(*g_stDXGEnumDeviceInfo[bSelecedDevice].pDeviceGUID, m_pddsBackBuffer, &m_pd3dDevice)) )
return E_FAIL;
D3DVIEWPORT7 d3dVP = { 0, 0, m_stDisplayInfo.wWidth, m_stDisplayInfo.wHeight, 0.0f, 1.0f };
if ( FAILED( hr = m_pd3dDevice->SetViewport(&d3dVP)) ) return hr;
if ( m_bDeviceModeFlag & _DXG_DEVICEMODE_ZBUFFER )
{
if ( FAILED(hr = CreateZBuffer(g_stDXGEnumDeviceInfo[bSelecedDevice].pDeviceGUID)) )
{
MessageBox(m_hWnd, TEXT("[CWHDXGraphicWindow::CreateDXG]") TEXT("ZBuffer create failed."), TEXT("MirDXG"), MB_ICONERROR | MB_OK);
return E_FAIL;
}
}
}
m_stBitsMaskInfo = GetRGBMaskInfoIN16Bits(m_pddsBackBuffer);
Init3DDeviceObjects();
return S_OK;
}
return hr;
}
/******************************************************************************************************************
窃荐疙 : CDXGraphic::ResetDXG()
累己磊 :
累己老 :
格利 :
涝仿 : WORD wWidth
WORD wHeight
WORD wBPP
BYTE bScreenModeFlag
BYTE bDeviceModeFlag
免仿 : HRESULT
[老磊][荐沥磊] : 荐沥郴侩
*******************************************************************************************************************/
HRESULT CWHDXGraphicWindow::ResetDXG(WORD wWidth, WORD wHeight, WORD wBPP, BYTE bScreenModeFlag, BYTE bDeviceModeFlag)
{
HRESULT hr;
DWORD dwStyle;
if ( m_bDeviceModeFlag == bDeviceModeFlag && m_bScreenModeFlag == bScreenModeFlag &&
m_stDisplayInfo.wWidth == wWidth && m_stDisplayInfo.wHeight == wHeight && m_stDisplayInfo.wBPP == wBPP )
return E_FAIL;
if ( FAILED(DestroyDXGObjects()) )
{
MessageBox(m_hWnd, TEXT("[CWHDXGraphicWindow::ResetDXG]") TEXT("DirectGraphic reset failed."), "MirDXG", MB_ICONERROR | MB_OK);
return E_FAIL;
}
m_stDisplayInfo.wWidth = wWidth;
m_stDisplayInfo.wHeight = wHeight;
m_stDisplayInfo.wBPP = wBPP;
m_bScreenModeFlag = bScreenModeFlag;
m_bDeviceModeFlag = bDeviceModeFlag;
if ( m_bScreenModeFlag & _DXG_SCREENMODE_WINDOW )
{
dwStyle = GetWindowStyle(m_hWnd);
dwStyle &= ~WS_POPUP;
dwStyle |= WS_OVERLAPPED | WS_CAPTION | WS_THICKFRAME | WS_MINIMIZEBOX | WS_SYSMENU;
SetWindowLong(m_hWnd, GWL_STYLE, dwStyle);
}
else
{
dwStyle = GetWindowStyle(m_hWnd);
dwStyle &= ~dwStyle;
dwStyle |= WS_POPUP;
SetWindowLong(m_hWnd, GWL_STYLE, dwStyle);
}
if ( hr = FAILED(CreateDXG()) )
{
MessageBox(m_hWnd, TEXT("[CWHDXGraphicWindow::ResetDXG]") TEXT("DirectGraphic create failed."), "MirDXG", MB_ICONERROR | MB_OK);
return E_FAIL;
}
CreateDefFont();
return S_OK;
}
/******************************************************************************************************************
窃荐疙 : CWHDXGraphicWindow::CreatePrimarySurface()
累己磊 :
累己老 :
格利 :
免仿 : HRESULT
[老磊][荐沥磊] : 荐沥郴侩
*******************************************************************************************************************/
HRESULT CWHDXGraphicWindow::CreatePrimarySurface()
{
DDSURFACEDESC2 ddsd;
HRESULT hr;
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
if ( m_bScreenModeFlag & _DXG_SCREENMODE_WINDOW )
{
RECT rcWork;
RECT rcTemp;
GetWindowRect(m_hWnd, &rcTemp);
// 努扼捞攫飘康开狼 农扁甫 棱绰何盒篮 扩档快狼 积己苞 包访捞 乐促.
// 拳搁秦惑档 溜, 努扼捞攫飘 荤阿屈 康开狼 农扁甫 掘绢柯促.
SetRect(&rcTemp, 0, 0, m_stDisplayInfo.wWidth, m_stDisplayInfo.wHeight);
// 努扼捞攫飘 荤阿屈 康开农扁俊辑 扩档快 傈眉康开狼 农扁肺 函券茄促.
AdjustWindowRectEx(&rcTemp, GetWindowStyle(m_hWnd), GetMenu(m_hWnd) != NULL, GetWindowExStyle(m_hWnd));
// 扩档快 傈眉康开农扁肺 扩档快甫 技泼茄促. 窜 矫累谅钎绰 公矫等促.
SetWindowPos(m_hWnd, NULL, 0, 0, rcTemp.right-rcTemp.left, rcTemp.bottom-rcTemp.top,
SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE);
// HWND_NOTOPMOST甫 技泼窍扁 困秦辑捞促.
SetWindowPos(m_hWnd, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOSIZE | SWP_NOMOVE | SWP_NOACTIVATE);
// 官帕拳搁康开狼 农扁甫 掘绢柯促..
SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWork, 0);
GetWindowRect(m_hWnd, &rcTemp);
if ( rcTemp.left < rcWork.left ) rcTemp.left = rcWork.left;
if ( rcTemp.top < rcWork.top ) rcTemp.top = rcWork.top;
// 扩档快狼 矫累谅钎甫 技泼茄促.
SetWindowPos(m_hWnd, NULL, rcTemp.left, rcTemp.top, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE);
ddsd.dwFlags = DDSD_CAPS;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
if ( FAILED(hr = m_pDD->CreateSurface(&ddsd, &m_pddsFrontBuffer, NULL)) ) return E_FAIL;
ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT;
ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN;
if ( m_bDeviceModeFlag & _DXG_DEVICEMODE_D3D )
ddsd.ddsCaps.dwCaps |= DDSCAPS_3DDEVICE;
ddsd.dwWidth = m_stDisplayInfo.wWidth;
ddsd.dwHeight = m_stDisplayInfo.wHeight;
if ( FAILED(hr = m_pDD->CreateSurface(&ddsd, &m_pddsBackBuffer, NULL)) ) return E_FAIL;
}
else
{
ddsd.dwFlags = DDSD_CAPS | DDSD_BACKBUFFERCOUNT;
ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE | DDSCAPS_FLIP | DDSCAPS_COMPLEX;
ddsd.dwBackBufferCount = 1;
if ( m_bDeviceModeFlag & _DXG_DEVICEMODE_D3D )
ddsd.ddsCaps.dwCaps |= DDSCAPS_3DDEVICE;
if ( FAILED(hr = m_pDD->CreateSurface(&ddsd, &m_pddsFrontBuffer, NULL)) ) return E_FAIL;
DDSCAPS2 ddscaps;
ZeroMemory(&ddscaps, sizeof(ddscaps));
ddscaps.dwCaps = DDSCAPS_BACKBUFFER;
if ( FAILED(hr = m_pddsFrontBuffer->GetAttachedSurface(&ddscaps, &m_pddsBackBuffer)) )
return E_FAIL;
}
// 俊叼飘扩档快 免仿阑 困秦辑 努府欺甫 技泼茄促.////////////////////////////////////////////////////////////////
if ( FAILED(hr = m_pDD->CreateClipper(0, &m_lpcClipper, NULL)) ) return E_FAIL;
if ( FAILED(hr = m_lpcClipper->SetHWnd(0, m_hWnd)) )
{
m_lpcClipper->Release();
return E_FAIL;
}
if ( FAILED(hr = m_pddsFrontBuffer->SetClipper(m_lpcClipper)) )
{
m_lpcClipper->Release();
return E_FAIL;
}
m_pDD->FlipToGDISurface();
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
return S_OK;
}
/******************************************************************************************************************
窃荐疙 : CWHDXGraphicWindow::UpdateBoundsWnd()
累己磊 :
累己老 :
格利 :
免仿 : VOID
[老磊][荐沥磊] : 荐沥郴侩
*******************************************************************************************************************/
VOID CWHDXGraphicWindow::UpdateBoundsWnd()
{
if ( m_bScreenModeFlag & _DXG_SCREENMODE_WINDOW )
{
GetClientRect(m_hWnd, &m_rcWindow);
ClientToScreen(m_hWnd, (POINT*)&m_rcWindow);
ClientToScreen(m_hWnd, (POINT*)&m_rcWindow+1);
}
else
{
SetRect(&m_rcWindow, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN));
}
}
/******************************************************************************************************************
窃荐疙 : CWHDXGraphicWindow::CreateZBuffer()
累己磊 :
累己老 :
格利 :
涝仿 : GUID* pDeviceGUID
免仿 : HRESULT
[老磊][荐沥磊] : 荐沥郴侩
*******************************************************************************************************************/
HRESULT CWHDXGraphicWindow::CreateZBuffer(GUID* pDeviceGUID)
{
HRESULT hr;
D3DDEVICEDESC7 ddDesc;
m_pd3dDevice->GetCaps(&ddDesc);
if (ddDesc.dpcTriCaps.dwRasterCaps & D3DPRASTERCAPS_ZBUFFERLESSHSR)
return S_OK;
DDSURFACEDESC2 ddsd;
ZeroMemory(&ddsd, sizeof(DDSURFACEDESC2));
ddsd.dwSize = sizeof(ddsd);
m_pddsBackBuffer->GetSurfaceDesc(&ddsd);
ddsd.dwFlags = DDSD_WIDTH | DDSD_HEIGHT | DDSD_CAPS | DDSD_PIXELFORMAT;
ddsd.ddsCaps.dwCaps = DDSCAPS_ZBUFFER;
ddsd.ddpfPixelFormat.dwSize = 0;
if ( FAILED(hr = m_pD3D->EnumZBufferFormats(*pDeviceGUID, DXGEnumZBufferFormatsCallback, (VOID*)&ddsd.ddpfPixelFormat)) )
return E_FAIL;
if ( 0 == ddsd.ddpfPixelFormat.dwSize )
{
ddsd.ddpfPixelFormat.dwRGBBitCount = 16;
if ( FAILED(hr = m_pD3D->EnumZBufferFormats(*pDeviceGUID, DXGEnumZBufferFormatsCallback, (VOID*)&ddsd.ddpfPixelFormat)) )
return E_FAIL;
if ( 0 == ddsd.ddpfPixelFormat.dwSize )
return E_FAIL;
}
if ( FAILED(hr = m_pDD->CreateSurface(&ddsd, &m_pddsZBuffer, NULL)) ) return E_FAIL;
if ( FAILED(hr = m_pddsBackBuffer->AddAttachedSurface(m_pddsZBuffer)) ) return E_FAIL;
if ( FAILED(hr = m_pd3dDevice->SetRenderTarget(m_pddsBackBuffer, 0L)) )
{
return E_FAIL;
}
return S_OK;
}
HRESULT CWHDXGraphicWindow::Init3DDeviceObjects()
{
// Set the transform matrices
D3DMATRIX matWorld, matView, matProj;
// 泅犁 800*600拳搁俊 嘎霸 3D 谅钎拌甫 汲沥茄促.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -