[HGE]-源码分析-14 system (c)

来源:互联网 发布:兼职 大数据 英文 翻译 编辑:程序博客网 时间:2024/04/30 08:27

    剩下一点尾巴。


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 DEMObDMO=true;#endifGetModuleFileName(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);}

对应不同的消息调用相应的函数就行


 

原创粉丝点击