剩下一点尾巴。
void CALL HGE_Impl::System_Log(const char *szFormat, ...)
{
FILE *hf = NULL;
va_list ap;
if(!szLogFile[0]) return;
hf = fopen(szLogFile, "a");
if(!hf) return;
va_start(ap, szFormat);
vfprintf(hf, szFormat, ap);
va_end(ap);
fprintf(hf, "\n");
fclose(hf);
}
日志写入函数,用了不定参数,用法和printf一样
bool CALL HGE_Impl::System_Launch(const char *url)
{
if((DWORD)ShellExecute(pHGE->hwnd, NULL, url, NULL, NULL, SW_SHOWMAXIMIZED)>32) return true;
else return false;
}
运行一个外部的程序,打开文件,或者打开一个网址
void CALL HGE_Impl::System_Snapshot(const char *filename)
{
LPDIRECT3DSURFACE8 pSurf;
char *shotname, tempname[_MAX_PATH];
int i;
if(!filename)
{
i=0;
shotname=Resource_EnumFiles("shot???.bmp");
while(shotname)
{
i++;
shotname=Resource_EnumFiles();
}
sprintf(tempname, "shot%03d.bmp", i);
filename=Resource_MakePath(tempname);
}
if(pD3DDevice)
{
pD3DDevice->GetBackBuffer(0, D3DBACKBUFFER_TYPE_MONO, &pSurf);
D3DXSaveSurfaceToFile(filename, D3DXIFF_BMP, pSurf, NULL, NULL);
pSurf->Release();
}
}
截屏函数,会把当前屏幕截取并保存,参数是路径,为空会存在程序目录下,先是文件名生成,此外还有保存文件操作,用D3D接口获取后备缓冲然后存成BMP
HGE_Impl::HGE_Impl()
{
hInstance=GetModuleHandle(0);
hwnd=0;
bActive=false;
szError[0]=0;
pD3D=0;
pD3DDevice=0;
d3dpp=0;
pTargets=0;
pCurTarget=0;
pScreenSurf=0;
pScreenDepth=0;
pVB=0;
pIB=0;
VertArray=0;
textures=0;
hBass=0;
bSilent=false;
streams=0;
hSearch=0;
res=0;
queue=0;
Char=VKey=Zpos=0;
Xpos=Ypos=0.0f;
bMouseOver=false;
bCaptured=false;
nHGEFPS=HGEFPS_UNLIMITED;
fTime=0.0f;
fDeltaTime=0.0f;
nFPS=0;
procFrameFunc=0;
procRenderFunc=0;
procFocusLostFunc=0;
procFocusGainFunc=0;
procGfxRestoreFunc=0;
procExitFunc=0;
szIcon=0;
strcpy(szWinTitle,"HGE");
nScreenWidth=800;
nScreenHeight=600;
nScreenBPP=32;
bWindowed=false;
bZBuffer=false;
bTextureFilter=true;
szLogFile[0]=0;
szIniFile[0]=0;
bUseSound=true;
nSampleRate=44100;
nFXVolume=100;
nMusVolume=100;
nStreamVolume=100;
nFixedDelta=0;
bHideMouse=true;
bDontSuspend=false;
hwndParent=0;
nPowerStatus=HGEPWR_UNSUPPORTED;
hKrnl32 = NULL;
lpfnGetSystemPowerStatus = NULL;
#ifdef DEMO
bDMO=true;
#endif
GetModuleFileName(GetModuleHandle(NULL), szAppPath, sizeof(szAppPath));
int i;
for(i=strlen(szAppPath)-1; i>0; i--) if(szAppPath[i]=='\\') break;
szAppPath[i+1]=0;
}
接口构造函数,主要是各种量的初始化
void HGE_Impl::_PostError(char *error)
{
System_Log(error);
strcpy(szError,error);
}
贴出错误信息,写在日志里
void HGE_Impl::_FocusChange(bool bAct)
{
bActive=bAct;
if(bActive)
{
if(procFocusGainFunc) procFocusGainFunc();
}
else
{
if(procFocusLostFunc) procFocusLostFunc();
}
}
运行程序获得焦点和失去焦点时调用的函数
偶们的回掉函数
LRESULT CALLBACK WindowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
{
bool bActivating;
switch(msg)
{
case WM_CREATE:
return FALSE;
case WM_PAINT:
if(pHGE->pD3D && pHGE->procRenderFunc && pHGE->bWindowed) pHGE->procRenderFunc();
break;
case WM_DESTROY:
PostQuitMessage(0);
return FALSE;
/*
case WM_ACTIVATEAPP:
bActivating = (wparam == TRUE);
if(pHGE->pD3D && pHGE->bActive != bActivating) pHGE->_FocusChange(bActivating);
return FALSE;
*/
case WM_ACTIVATE:
// tricky: we should catch WA_ACTIVE and WA_CLICKACTIVE,
// but only if HIWORD(wParam) (fMinimized) == FALSE (0)
bActivating = (LOWORD(wparam) != WA_INACTIVE) && (HIWORD(wparam) == 0);
if(pHGE->pD3D && pHGE->bActive != bActivating) pHGE->_FocusChange(bActivating);
return FALSE;
case WM_SETCURSOR:
if(pHGE->bActive && LOWORD(lparam)==HTCLIENT && pHGE->bHideMouse) SetCursor(NULL);
else SetCursor(LoadCursor(NULL, IDC_ARROW));
return FALSE;
case WM_SYSKEYDOWN:
if(wparam == VK_F4)
{
if(pHGE->procExitFunc && !pHGE->procExitFunc()) return FALSE;
return DefWindowProc(hwnd, msg, wparam, lparam);
}
else if(wparam == VK_RETURN)
{
pHGE->System_SetState(HGE_WINDOWED, !pHGE->System_GetState(HGE_WINDOWED));
return FALSE;
}
else
{
pHGE->_BuildEvent(INPUT_KEYDOWN, wparam, HIWORD(lparam) & 0xFF, (lparam & 0x40000000) ? HGEINP_REPEAT:0, -1, -1);
return FALSE;
}
case WM_KEYDOWN:
pHGE->_BuildEvent(INPUT_KEYDOWN, wparam, HIWORD(lparam) & 0xFF, (lparam & 0x40000000) ? HGEINP_REPEAT:0, -1, -1);
return FALSE;
case WM_SYSKEYUP:
pHGE->_BuildEvent(INPUT_KEYUP, wparam, HIWORD(lparam) & 0xFF, 0, -1, -1);
return FALSE;
case WM_KEYUP:
pHGE->_BuildEvent(INPUT_KEYUP, wparam, HIWORD(lparam) & 0xFF, 0, -1, -1);
return FALSE;
case WM_LBUTTONDOWN:
SetFocus(hwnd);
pHGE->_BuildEvent(INPUT_MBUTTONDOWN, HGEK_LBUTTON, 0, 0, LOWORDINT(lparam), HIWORDINT(lparam));
return FALSE;
case WM_MBUTTONDOWN:
SetFocus(hwnd);
pHGE->_BuildEvent(INPUT_MBUTTONDOWN, HGEK_MBUTTON, 0, 0, LOWORDINT(lparam), HIWORDINT(lparam));
return FALSE;
case WM_RBUTTONDOWN:
SetFocus(hwnd);
pHGE->_BuildEvent(INPUT_MBUTTONDOWN, HGEK_RBUTTON, 0, 0, LOWORDINT(lparam), HIWORDINT(lparam));
return FALSE;
case WM_LBUTTONDBLCLK:
pHGE->_BuildEvent(INPUT_MBUTTONDOWN, HGEK_LBUTTON, 0, HGEINP_REPEAT, LOWORDINT(lparam), HIWORDINT(lparam));
return FALSE;
case WM_MBUTTONDBLCLK:
pHGE->_BuildEvent(INPUT_MBUTTONDOWN, HGEK_MBUTTON, 0, HGEINP_REPEAT, LOWORDINT(lparam), HIWORDINT(lparam));
return FALSE;
case WM_RBUTTONDBLCLK:
pHGE->_BuildEvent(INPUT_MBUTTONDOWN, HGEK_RBUTTON, 0, HGEINP_REPEAT, LOWORDINT(lparam), HIWORDINT(lparam));
return FALSE;
case WM_LBUTTONUP:
pHGE->_BuildEvent(INPUT_MBUTTONUP, HGEK_LBUTTON, 0, 0, LOWORDINT(lparam), HIWORDINT(lparam));
return FALSE;
case WM_MBUTTONUP:
pHGE->_BuildEvent(INPUT_MBUTTONUP, HGEK_MBUTTON, 0, 0, LOWORDINT(lparam), HIWORDINT(lparam));
return FALSE;
case WM_RBUTTONUP:
pHGE->_BuildEvent(INPUT_MBUTTONUP, HGEK_RBUTTON, 0, 0, LOWORDINT(lparam), HIWORDINT(lparam));
return FALSE;
case WM_MOUSEMOVE:
pHGE->_BuildEvent(INPUT_MOUSEMOVE, 0, 0, 0, LOWORDINT(lparam), HIWORDINT(lparam));
return FALSE;
case 0x020A: // WM_MOUSEWHEEL, GET_WHEEL_DELTA_WPARAM(wparam);
pHGE->_BuildEvent(INPUT_MOUSEWHEEL, short(HIWORD(wparam))/120, 0, 0, LOWORDINT(lparam), HIWORDINT(lparam));
return FALSE;
case WM_SIZE:
if(pHGE->pD3D && wparam==SIZE_RESTORED) pHGE->_Resize(LOWORD(lparam), HIWORD(lparam));
//return FALSE;
break;
case WM_SYSCOMMAND:
if(wparam==SC_CLOSE)
{
if(pHGE->procExitFunc && !pHGE->procExitFunc()) return FALSE;
pHGE->bActive=false;
return DefWindowProc(hwnd, msg, wparam, lparam);
}
break;
}
return DefWindowProc(hwnd, msg, wparam, lparam);
}
对应不同的消息调用相应的函数就行