📄 whdxgraphic.cpp
字号:
/******************************************************************************************************************
葛碘疙:
累己磊:
累己老:
[老磊][荐沥磊] : 荐沥 郴侩
*******************************************************************************************************************/
#include "stdafx.h"
#include "WHEngine.h"
/******************************************************************************************************************
CWHDXGraphicWindow Functions
*******************************************************************************************************************/
static BYTE g_bNumDevices = 0;
static DXG_ENUM_DEVICEINFO g_stDXGEnumDeviceInfo[_MAX_DEVICES];
static INT DXGModesSortCallback(const VOID* arg1, const VOID* arg2);
static BOOL WINAPI DXGDriverEnumCallbackEx(GUID* pGUID, LPSTR szDesc, LPSTR szName, LPVOID pContext, HMONITOR hm);
static HRESULT WINAPI DXGEnumDisplayModeCallback(DDSURFACEDESC2* pddsd, VOID* pParentInfo);
static HRESULT WINAPI DXG3DDeviceEnumCallback(TCHAR* szDesc, TCHAR* szName, D3DDEVICEDESC7* pDesc, VOID* pParentInfo);
static HRESULT WINAPI DXGEnumZBufferFormatsCallback(DDPIXELFORMAT* pddpf, VOID* pContext);
CWHDXGraphicWindow* CWHDXGraphicWindow::m_pxDXGWnd = NULL;
CWHDXGraphicWindow* GetDXGWindowPtr()
{
return CWHDXGraphicWindow::m_pxDXGWnd;
}
/******************************************************************************************************************
窃荐疙 : CWHDXGraphicWindow::CWHDXGraphicWindow()
累己磊 :
累己老 :
格利 :
涝仿 : WORD wWidth
WORD wHeight
WORD wBpp
免仿 :
[老磊][荐沥磊] : 荐沥郴侩
*******************************************************************************************************************/
CWHDXGraphicWindow::CWHDXGraphicWindow(WORD wWidth, WORD wHeight, WORD wBpp)
{
m_pDD = NULL;
m_pD3D = NULL;
m_hDefGameFont = NULL;
m_pd3dDevice = NULL;
m_pddsZBuffer = NULL;
m_pddsFrontBuffer = NULL;
m_pddsBackBuffer = NULL;
// 俊叼飘扩档快 免仿阑 困秦辑 努府欺甫 技泼茄促.
m_lpcClipper = NULL;
m_stDisplayInfo.wWidth = wWidth;
m_stDisplayInfo.wHeight = wHeight;
m_stDisplayInfo.wBPP = wBpp;
m_bScreenModeFlag = _DXG_SCREENMODE_WINDOW;
m_bDeviceModeFlag = _DXG_DEVICEMODE_PRIMARY;
SetRect(&m_rcWindow, 0, 0, 0, 0);
ZeroMemory(&m_stBitsMaskInfo, sizeof(DXG_MASKINFO));
m_pxDXGWnd = this;
m_bIsWindowActive = FALSE;
m_bIsWindowReady = FALSE;
m_dwTextureTotal = 0;
m_dwTextureFree = 0;
m_dwVideoTotal = 0;
m_dwVideoFree = 0;
m_pxDefProcess = NULL;
}
VOID CWHDXGraphicWindow::UsedAndFreeMemoryCheck()
{
DDSCAPS2 ddsCaps2;
ZeroMemory(&ddsCaps2, sizeof(ddsCaps2));
ddsCaps2.dwCaps = DDSCAPS_TEXTURE;
m_pDD->GetAvailableVidMem(&ddsCaps2, &m_dwTextureTotal, &m_dwTextureFree);
ZeroMemory(&ddsCaps2, sizeof(ddsCaps2));
ddsCaps2.dwCaps = DDSCAPS_VIDEOMEMORY;
m_pDD->GetAvailableVidMem(&ddsCaps2, &m_dwVideoTotal, &m_dwVideoFree);
}
/******************************************************************************************************************
窃荐疙 : CWHDXGraphicWindow::~CWHDXGraphicWindow()
累己磊 :
累己老 :
格利 :
免仿 :
[老磊][荐沥磊] : 荐沥郴侩
*******************************************************************************************************************/
CWHDXGraphicWindow::~CWHDXGraphicWindow()
{
FreeDXGEnumModeResources();
DestroyDXGObjects();
m_pxDefProcess = NULL;
m_pxDXGWnd = NULL;
}
/******************************************************************************************************************
窃荐疙 : CWHDXGraphicWindow::Create()
累己磊 :
累己老 :
格利 :
涝仿 : LPTSTR lpCaption
CHAR *pszMenuName
BYTE bScreenModeFlag
BYTE bDeviceModeFlag
免仿 : BOOL
[老磊][荐沥磊] : 荐沥郴侩
*******************************************************************************************************************/
BOOL CWHDXGraphicWindow::Create(HINSTANCE hInst, LPTSTR lpCaption, CHAR *pszMenuName, CHAR* pszIconName, BYTE bScreenModeFlag, BYTE bDeviceModeFlag)
{
DWORD dwStyle;
if ( !CWHWindow::Create(hInst, lpCaption, pszMenuName, pszIconName) )
{
MessageBox(m_hWnd, TEXT("[CWHDXGraphicWindow::Create]") TEXT("Window create failed."), "MirDXG", MB_ICONERROR | MB_OK);
return FALSE;
}
m_bScreenModeFlag = bScreenModeFlag;
m_bDeviceModeFlag = bDeviceModeFlag;
if ( m_bScreenModeFlag & _DXG_SCREENMODE_WINDOW )
{
dwStyle = GetWindowStyle(m_hWnd);
dwStyle &= ~WS_POPUP;
dwStyle |= WS_POPUP;//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);
}
HRESULT hr;
if ( hr = SUCCEEDED(DirectDrawEnumerateEx(DXGDriverEnumCallbackEx, NULL,
DDENUM_ATTACHEDSECONDARYDEVICES | DDENUM_DETACHEDSECONDARYDEVICES | DDENUM_NONDISPLAYDEVICES)) )
{
if ( hr = SUCCEEDED(CreateDXG()) )
{
m_bIsWindowReady = TRUE;
CreateDefFont();
return TRUE;
}
else
{
MessageBox(m_hWnd, TEXT("[CWHDXGraphicWindow::Create]") TEXT("DirectGraphic create failed."), "MirDXG", MB_ICONERROR | MB_OK);
return FALSE;
}
}
return FALSE;
}
/******************************************************************************************************************
窃荐疙 : CWHDXGraphicWindow::MainWndProcDXG()
累己磊 :
累己老 :
格利 :
涝仿 : HWND hWnd
UINT uMsg
WPARAM wParam
LPARAM lParam
免仿 : LRESULT
[老磊][荐沥磊] : 荐沥郴侩
*******************************************************************************************************************/
LRESULT CWHDXGraphicWindow::MainWndProcDXG(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch (uMsg)
{
case WM_SYSKEYDOWN:
return OnSysKeyDown(wParam, lParam);
case WM_MOVE:
return OnMove(wParam, lParam);
case WM_SIZE:
return OnSize(wParam, lParam);
case WM_DESTROY:
return OnDestroy();
case WM_SETCURSOR:
return OnSetCursor();
// case WM_GETMINMAXINFO:
// return OnGetMinMaxInfo(wParam, lParam);
default:
break;
}
return CWHWindow::MainWndProc(hWnd, uMsg, wParam, lParam);
}
LRESULT CWHDXGraphicWindow::OnGetMinMaxInfo(WPARAM wParam, LPARAM lParam)
{
if ( m_hWnd )
{
MINMAXINFO* pMinMax = (MINMAXINFO*) lParam;
DWORD dwFrameWidth = GetSystemMetrics( SM_CXSIZEFRAME );
DWORD dwFrameHeight = GetSystemMetrics( SM_CYSIZEFRAME );
DWORD dwMenuHeight;
if( GetMenu( m_hWnd ) )
dwMenuHeight = GetSystemMetrics( SM_CYMENU );
else
dwMenuHeight = 0;
DWORD dwCaptionHeight = GetSystemMetrics( SM_CYCAPTION );
pMinMax->ptMinTrackSize.x = m_stDisplayInfo.wWidth + dwFrameWidth * 2;
pMinMax->ptMinTrackSize.y = m_stDisplayInfo.wHeight + dwFrameHeight * 2 +
dwMenuHeight + dwCaptionHeight;
pMinMax->ptMaxTrackSize.x = pMinMax->ptMinTrackSize.x;
pMinMax->ptMaxTrackSize.y = pMinMax->ptMinTrackSize.y;
}
return 0L;
}
LRESULT CWHDXGraphicWindow::OnSetCursor()
{
SetCursor(LoadCursor(NULL, IDC_ARROW));
return 0L;
}
/******************************************************************************************************************
窃荐疙 : CWHDXGraphicWindow::OnSize()
累己磊 :
累己老 :
格利 :
涝仿 : WPARAM wParam
LPARAM lParam
免仿 : LRESULT
[老磊][荐沥磊] : 荐沥郴侩
*******************************************************************************************************************/
LRESULT CWHDXGraphicWindow::OnSize(WPARAM wParam, LPARAM lParam)
{
if ( SIZE_MAXHIDE == wParam || SIZE_MINIMIZED == wParam )
m_bIsWindowActive = FALSE;
else
m_bIsWindowActive = TRUE;
UpdateBoundsWnd();
return 0L;
}
/******************************************************************************************************************
窃荐疙 : CWHDXGraphicWindow::OnMove()
累己磊 :
累己老 :
格利 :
涝仿 : WPARAM wParam
LPARAM lParam
免仿 : LRESULT
[老磊][荐沥磊] : 荐沥郴侩
*******************************************************************************************************************/
LRESULT CWHDXGraphicWindow::OnMove(WPARAM wParam, LPARAM lParam)
{
UpdateBoundsWnd();
return 0L;
}
/******************************************************************************************************************
窃荐疙 : CWHDXGraphicWindow::OnDestroy()
累己磊 :
累己老 :
格利 :
免仿 : BOOL
[老磊][荐沥磊] : 荐沥郴侩
*******************************************************************************************************************/
LRESULT CWHDXGraphicWindow::OnDestroy()
{
return CWHWindow::OnDestroy();
}
/******************************************************************************************************************
窃荐疙 : CWHDXGraphicWindow::OnSysKeyDown()
累己磊 :
累己老 :
格利 :
涝仿 : WPARAM wParam
LPARAM lParam
免仿 : LRESULT
[老磊][荐沥磊] : 荐沥郴侩
*******************************************************************************************************************/
LRESULT CWHDXGraphicWindow::OnSysKeyDown(WPARAM wParam, LPARAM lParam)
{
if ( wParam == VK_RETURN )
{
m_bIsWindowReady = FALSE;
D3DTextr_InvalidateAllTextures();
D3DWILTextr_InvalidateAllTextures();
D3DWILTextr_DestroyAllTextures();
if ( m_bScreenModeFlag & _DXG_SCREENMODE_WINDOW )
{
if ( FAILED(ResetDXG(_SCREEN_WIDTH, _SCREEN_HEIGHT, _SCREEN_BPP, _DXG_SCREENMODE_FULLSCREEN, _DXG_DEVICEMODE_PRIMARY|_DXG_DEVICEMODE_D3D)) )
{
MessageBox(m_hWnd, TEXT("DirectDraw RESETUP failed!!!") TEXT("The Program will now exit."), TEXT("MirDXG"), MB_ICONERROR | MB_OK);
}
}
else
{
if ( FAILED(ResetDXG(_SCREEN_WIDTH, _SCREEN_HEIGHT, _SCREEN_BPP, _DXG_SCREENMODE_WINDOW, _DXG_DEVICEMODE_PRIMARY|_DXG_DEVICEMODE_D3D)) )
{
MessageBox(m_hWnd, TEXT("DirectDraw RESETUP failed!!!") TEXT("The Program will now exit."), TEXT("MirDXG"), MB_ICONERROR | MB_OK);
}
}
D3DTextr_RestoreAllTextures(m_pd3dDevice);
m_bIsWindowReady = TRUE;
}
return 0L;
}
/******************************************************************************************************************
窃荐疙 : CWHDXGraphicWindow::FindDriverAndDevice()
累己磊 :
累己老 :
格利 :
免仿 : DWORD
[老磊][荐沥磊] : 荐沥郴侩
*******************************************************************************************************************/
BYTE CWHDXGraphicWindow::FindDriverAndDevice()
{
BYTE bNum = 0;
CHAR bCnt;
if ( m_bDeviceModeFlag & _DXG_DEVICEMODE_PRIMARY )
{
for ( bCnt = 0; bCnt < g_bNumDevices; bCnt++ )
{
if ( !g_stDXGEnumDeviceInfo[bCnt].pDriverGUID )
{
if ( g_stDXGEnumDeviceInfo[bCnt].f3DHardware ) return bCnt;
else bNum = bCnt;
}
}
}
else
{
for ( bCnt = g_bNumDevices-1; bCnt >= 0; bCnt-- )
{
// 厚叼坷 墨靛啊 2俺捞惑
if( g_bNumDevices > 2 )
{
if ( g_stDXGEnumDeviceInfo[0].dwNumModes != g_stDXGEnumDeviceInfo[bCnt].dwNumModes )
{
if ( g_stDXGEnumDeviceInfo[bCnt].f3DHardware ) return bCnt;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -