www.pudn.com > 3D_OnlineGame_Humen.rar > FacePlate.cpp


//----------------------------------------------------------- 
// 
// Function 應用程序中的面板surface 
// 主要是裝入各類型的圖片文件等等 
// 
//----------------------------------------------------------- 
#include "stdafx.h" 
#include "XMudClient.h" 
#include "FacePlate.h" 
#include "Unpackfile.h" 
#include "StartGameMenu.h" 
#include "MenuLoadOldPlay.h" 
#include "MenuCreateNew.h" 
#include "MainScreen.h" 
#include "InitInternet.h" 
#include "MyMusic.h" 
#include  
#include "MyDInput.h" 
//add header file 
#include "wgs\common.h" 
#include "wgs\WGS.h" 
//end 
 
#define _MAX(a,b) ((a>b)?a:b); 
 
extern rmfullglobals myglobs; 
extern D3DAppInfo* d3dapp; 
extern char g_tszPathName[256]; 
extern int g_nGameState; 
extern CStringList g_strlistMesssage; 
extern CStringList g_strlistSelfMsg; 
extern CMainScreen m_MainScreen; 
extern CStartGameMenu m_StartGameMenu; 
extern CMenuLoadOldPlay m_MenuLoadOldPlay; 
extern CMenuCreateNew m_MenuCreateNew; 
extern HFONT g_MessagehFont; 
extern HFONT g_MessagehFont1; 
extern HFONT g_MessagehFont2; 
 
extern CMainScreen m_MainScreen; 
extern int nSpareTime;		//剩下的時間(單位:秒) 
extern int nRecTimes;		//收到的信息次數 
 
extern void QuitResolution(void); 
 
BITMAP tmpbmp; 
BITMAPINFOHEADER m_infohead; 
 
void Free2DSurfaces() 
{ 
  if( myglobs.g_lpDDSGameMenu != NULL){ 
    myglobs.g_lpDDSGameMenu->Release(); 
    myglobs.g_lpDDSGameMenu = NULL; 
  } 
  if( myglobs.g_lpDDSMainFace != NULL ){ 
    myglobs.g_lpDDSMainFace->Release(); 
    myglobs.g_lpDDSMainFace = NULL; 
  } 
	if(myglobs.g_lpDDSWGS != NULL){ 
		myglobs.g_lpDDSWGS->Release(); 
		myglobs.g_lpDDSWGS=NULL; 
	} 
	if(myglobs.g_lpDDSSelectServer != NULL){ 
		myglobs.g_lpDDSSelectServer->Release(); 
		myglobs.g_lpDDSSelectServer=NULL; 
	} 
} 
 
HRESULT Create2DSurfaces(LPDIRECTDRAW lpdd4) 
{ 
   
  if( lpdd4 == NULL ) 
    return E_FAIL; 
  char szMainFaceBar[256]; 
   
  lstrcpy( szMainFaceBar, "Splash.bmp" ); 
  myglobs.g_lpDDSMainFace = DDLoadBitmap(d3dapp->lpDD,szMainFaceBar,0,0); 
  if( NULL != myglobs.g_lpDDSMainFace ) 
    DDSetColorKey(myglobs.g_lpDDSMainFace, RGB(0,255,0)); 
  else 
    return E_FAIL; 
  lstrcpy( szMainFaceBar, "Start.bmp" ); 
  myglobs.g_lpDDSGameMenu = DDLoadBitmap(d3dapp->lpDD,szMainFaceBar,0,0); 
  if( NULL != myglobs.g_lpDDSGameMenu ) 
    DDSetColorKey(myglobs.g_lpDDSGameMenu, RGB(0,255,0)); 
  else 
    return E_FAIL; 
	lstrcpy( szMainFaceBar, "WGS.bmp" ); 
	myglobs.g_lpDDSWGS = DDLoadBitmap(d3dapp->lpDD,szMainFaceBar,0,0); 
	if( NULL != myglobs.g_lpDDSWGS ) 
		DDSetColorKey(myglobs.g_lpDDSWGS, RGB(0,255,0)); 
	else 
		return E_FAIL; 
	lstrcpy( szMainFaceBar, "Select.bmp" ); 
	myglobs.g_lpDDSSelectServer = DDLoadBitmap(d3dapp->lpDD,szMainFaceBar,0,0); 
	if( NULL != myglobs.g_lpDDSSelectServer ) 
		DDSetColorKey(myglobs.g_lpDDSSelectServer, RGB(0,255,0)); 
	else 
		return E_FAIL; 
  return S_OK; 
} 
 
//----------------------------------------------------------------------------- 
// Name: DDSetColorKey() 
// Desc: Set a color key for a surface, given a RGB. 
//       If you pass CLR_INVALID as the color key, the pixel 
//       in the upper-left corner will be used. 
//----------------------------------------------------------------------------- 
HRESULT DDSetColorKey(IDirectDrawSurface * pdds, COLORREF rgb) 
{ 
  DDCOLORKEY              ddck; 
   
  ddck.dwColorSpaceLowValue = DDColorMatch(pdds, rgb); 
  ddck.dwColorSpaceHighValue = ddck.dwColorSpaceLowValue; 
  return pdds->SetColorKey(DDCKEY_SRCBLT, &ddck); 
} 
 
DWORD DDColorMatch(IDirectDrawSurface * pdds, COLORREF rgb) 
{ 
  COLORREF                rgbT; 
  HDC                     hdc; 
  DWORD                   dw = CLR_INVALID; 
  DDSURFACEDESC           ddsd; 
  HRESULT                 hres; 
 
  if (rgb != CLR_INVALID && pdds->GetDC(&hdc) == DD_OK){ 
    rgbT = GetPixel(hdc, 0, 0); 
    SetPixel(hdc, 0, 0, rgb); 
    pdds->ReleaseDC(hdc); 
  } 
 
  ddsd.dwSize = sizeof(ddsd); 
  while ((hres = pdds->Lock(NULL, &ddsd, 0, NULL)) == DDERR_WASSTILLDRAWING); 
  if (hres == DD_OK){ 
    dw = *(DWORD *) ddsd.lpSurface; 
    if (ddsd.ddpfPixelFormat.dwRGBBitCount < 32){ 
      dw &= (1 << ddsd.ddpfPixelFormat.dwRGBBitCount) - 1; 
    } 
    pdds->Unlock(NULL); 
  } 
  if (rgb != CLR_INVALID && pdds->GetDC(&hdc) == DD_OK){ 
    SetPixel(hdc, 0, 0, rgbT); 
    pdds->ReleaseDC(hdc); 
  } 
  return dw; 
} 
 
HRESULT DDCopyBitmap(IDirectDrawSurface *pdds, HBITMAP hbm, int x, int y, int dx, int dy) 
{ 
  HDC                 hdcImage; 
  HDC                 hdc; 
  BITMAP              bm; 
  DDSURFACEDESC       ddsd; 
  HRESULT             hr; 
   
  if (hbm == NULL || pdds == NULL) 
    return E_FAIL; 
  pdds->Restore(); 
  hdcImage = CreateCompatibleDC(NULL); 
  if (!hdcImage) 
    OutputDebugString(TEXT("createcompatible dc failed\n")); 
  SelectObject(hdcImage, hbm); 
  GetObject(hbm, sizeof(bm), &bm); 
  dx = dx == 0 ? bm.bmWidth  : dx; 
  dy = dy == 0 ? bm.bmHeight : dy; 
 
  ddsd.dwSize = sizeof(ddsd); 
  ddsd.dwFlags = DDSD_HEIGHT | DDSD_WIDTH; 
  pdds->GetSurfaceDesc(&ddsd); 
   
  if ((hr = pdds->GetDC(&hdc)) == DD_OK){ 
    StretchBlt(hdc, 0, 0, ddsd.dwWidth, ddsd.dwHeight, hdcImage, x, y, dx, dy, SRCCOPY); 
    pdds->ReleaseDC(hdc); 
  } 
  delete [] tmpbmp.bmBits; 
  DeleteDC(hdcImage); 
  return hr; 
} 
 
IDirectDrawSurface *DDLoadBitmap(IDirectDraw *pdd, LPCTSTR tszBitmap, int dx, int dy) 
{ 
  HBITMAP             hbm; 
  BITMAP              bm; 
  DDSURFACEDESC       ddsd; 
  IDirectDrawSurface *pdds; 
   
  char cTempBmp[256]; 
  lstrcpy( cTempBmp,g_tszPathName); 
  lstrcat( cTempBmp, "\\bmpdata\\" ); 
  lstrcat( cTempBmp, tszBitmap ); 
  hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), cTempBmp, IMAGE_BITMAP, dx, dy, LR_CREATEDIBSECTION); 
  if (hbm == NULL) 
    hbm = (HBITMAP)LoadImage(NULL, cTempBmp, IMAGE_BITMAP, dx, dy, LR_LOADFROMFILE|LR_CREATEDIBSECTION|LR_MONOCHROME); 
  if (hbm == NULL){ 
    CString cBmpFilename; 
    UNPACKALL m_UnpackFile; 
    char cTempBmp[256]; 
    lstrcpy( cTempBmp, g_tszPathName ); 
    lstrcat( cTempBmp, "\\bmpdata\\PicFile" ); 
    cBmpFilename = m_UnpackFile.GetFile( cTempBmp,tszBitmap); 
    if(cBmpFilename.IsEmpty()) 
      return NULL; 
    hbm = (HBITMAP)LoadImage(0,cBmpFilename,IMAGE_BITMAP,dx, dy,LR_LOADFROMFILE); 
    if( hbm == NULL) 
      return NULL; 
    DeleteFile(cBmpFilename); 
  } 
  GetObject(hbm, sizeof(bm), &bm); 
 
  ZeroMemory(&ddsd, sizeof(ddsd)); 
  ddsd.dwSize = sizeof(ddsd); 
  ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT |DDSD_WIDTH; 
  ddsd.ddsCaps.dwCaps = DDSCAPS_OFFSCREENPLAIN; 
  ddsd.dwWidth = bm.bmWidth; 
  ddsd.dwHeight = bm.bmHeight; 
   
  if (pdd->CreateSurface(&ddsd, &pdds, NULL) != DD_OK) 
    return NULL; 
  DDCopyBitmap(pdds, hbm, 0, 0, 0, 0); 
  DeleteObject(hbm); 
  return pdds; 
} 
 
void DDReLoadBitmap(IDirectDrawSurface *pdds, LPCTSTR tszBitmap, int dx, int dy) 
{ 
  HBITMAP             hbm; 
  BITMAP              bm; 
   
  char cTempBmp[256]; 
  lstrcpy( cTempBmp,g_tszPathName); 
  lstrcat( cTempBmp, "\\bmpdata\\" ); 
  lstrcat( cTempBmp, tszBitmap ); 
  hbm = (HBITMAP)LoadImage(GetModuleHandle(NULL), cTempBmp, IMAGE_BITMAP, dx, dy, LR_CREATEDIBSECTION); 
  if (hbm == NULL) 
    hbm = (HBITMAP)LoadImage(NULL, cTempBmp, IMAGE_BITMAP, dx, dy, LR_LOADFROMFILE|LR_CREATEDIBSECTION|LR_MONOCHROME); 
  if (hbm == NULL){ 
    CString cBmpFilename; 
    UNPACKALL m_UnpackFile; 
    char cTempBmp[256]; 
    lstrcpy( cTempBmp, g_tszPathName ); 
    lstrcat( cTempBmp, "\\bmpdata\\PicFile" ); 
    cBmpFilename = m_UnpackFile.GetFile( cTempBmp,tszBitmap); 
    if(cBmpFilename.IsEmpty()) 
      return; 
    hbm = (HBITMAP)LoadImage(0,cBmpFilename,IMAGE_BITMAP,dx, dy,LR_LOADFROMFILE); 
    if( hbm == NULL) 
		return; 
    DeleteFile(cBmpFilename); 
  } 
  GetObject(hbm, sizeof(bm), &bm); 
  DDCopyBitmap(pdds, hbm, 0, 0, 0, 0); 
   
  DeleteObject(hbm); 
   
} 
 
BOOL LoadBitmapInfo(LPCTSTR fName, BITMAP &bmp) 
{ 
  CFile cf; 
  if(!cf.Open( fName, CFile::modeRead )){ 
    TRACE("Bmp file open error."); 
    return NULL; 
  } 
  BITMAPFILEHEADER m_filehead; 
  cf.Read( &m_filehead, sizeof(BITMAPFILEHEADER) ); 
  cf.Read( &m_infohead, sizeof(BITMAPINFOHEADER) ); 
  if(m_filehead.bfType != 0x4d42 ){ 
    TRACE("This isn't a bmp files."); 
    return FALSE; 
  } 
  if(m_filehead.bfSize != cf.GetLength() ){ 
    TRACE("Bmp file data error."); 
    return FALSE; 
  } 
  char * m_buf; 
  m_buf = (char *) new char[ m_infohead.biSizeImage ]; 
  if( m_buf == NULL ) return NULL; 
   
  cf.Seek( m_filehead.bfOffBits, CFile::begin ); 
  cf.Read( m_buf, m_infohead.biSizeImage ); 
   
  bmp.bmBits = m_buf; 
  bmp.bmBitsPixel = m_infohead.biBitCount; 
  bmp.bmHeight = m_infohead.biHeight; 
  bmp.bmPlanes = m_infohead.biPlanes; 
  bmp.bmType = 0; 
  bmp.bmWidth = m_infohead.biWidth; 
  bmp.bmWidthBytes = (m_infohead.biWidth+3)&~3; 
   
  return TRUE; 
} 
 
 
void MyGetTextExtentPoint32(char *string,long len,SIZE *Size,BOOL bFlag) 
{ 
  HDC hDC; 
  HRESULT ddrval; 
 
  ddrval=d3dapp->lpBackBuffer->GetDC(&hDC); 
  if(bFlag) SelectObject(hDC, g_MessagehFont2); 
  GetTextExtentPoint32(hDC,string,len,Size); 
  d3dapp->lpBackBuffer->ReleaseDC(hDC); 
} 
 
void DrawGameString(char *string,LPRECT lpRect,UINT uFormat 
                    ,COLORREF TextColor,COLORREF BkColor,BOOL bFlag) 
{ 
  HDC hdc; 
  HRESULT ddrval; 
 
  ddrval=d3dapp->lpBackBuffer->GetDC(&hdc); 
  if(bFlag) SelectObject(hdc, g_MessagehFont2); 
  SetTextColor(hdc,TextColor); 
  if(BkColor == RGB(0,0,0)) SetBkMode(hdc,TRANSPARENT); 
  else                      SetBkColor(hdc,BkColor); 
  DrawText(hdc,string,strlen(string),lpRect,uFormat);  
  d3dapp->lpBackBuffer->ReleaseDC(hdc); 
} 
 
void DrawInterLace() 
{ 
  HDC hdc; 
  HRESULT ddrval; 
  int i; 
  while( TRUE ){ 
    ddrval =d3dapp->lpBackBuffer->GetDC(&hdc); 
    if( ddrval == DD_OK ){	 
      SetTextColor(hdc,RGB(0,0,0)); 
      for(i=0;i<600;i++){ 
        i++; 
        MoveToEx(hdc,0,i,NULL); 
        LineTo(hdc,800,i); 
      } 
      d3dapp->lpBackBuffer->ReleaseDC(hdc); 
      return; 
    } 
    if( ddrval == DDERR_SURFACELOST ){ 
      if( !RestoreSurfaces() ) 
        return; 
    } 
    if( ddrval != DDERR_WASSTILLDRAWING ) 
      return; 
  } 
} 
 
void DrawProgress(BOOL bLogon) 
{ 
#define PROGRESS_BAR_WIDTH 460 
  HDC hdc; 
  HRESULT ddrval; 
   
  static CTime LastTime = CTime::GetCurrentTime(); 
  static BOOL bSplash = FALSE; 
  char szBuffer[128]; 
  COLORREF tmpColor; 
  RECT rcTmp; 
  int nPercent; 
  nPercent = (nRecTimes+1) * PROGRESS_BAR_WIDTH / (bLogon? 13 : 6 ); 
  if(nPercent > PROGRESS_BAR_WIDTH) 
    nPercent = PROGRESS_BAR_WIDTH;  
  bSplash = !bSplash; 
  tmpColor = bSplash? RGB(255,0,0) : RGB(255,255,0) ; 
  CTime CurrentTime = CTime::GetCurrentTime(); 
  if( (CurrentTime - LastTime) > 1L){ 
    LastTime = CurrentTime; 
    nSpareTime --; 
    if(nSpareTime < 1){ 
      CPmudNet_End(); 
      Msg("與此伺服器連接速度太慢,請選擇其他連接/n伺服器"); 
      QuitDirectMusic(); 
      QuitResolution(); 
      QuitIME(myglobs.hWndMain); 
      exit(1); 
    } 
  } 
  if( bLogon ) 
    wsprintf(szBuffer,"正在簽到請稍候......(%d)秒", nSpareTime); 
  else 
    wsprintf(szBuffer,"正在接收地圖數據......(%d)秒", nSpareTime); 
  int x,y; 
  x = 155; y = 425; 
  if( bLogon ){ 
    SetRect(&rcTmp,240-224,795-377,720-224,895-377); 
    bltObject(x,y, 
      myglobs.g_lpDDSGameMenu, 
      &rcTmp, 
      DDBLTFAST_SRCCOLORKEY); 
  }else{ 
    SetRect(&rcTmp, 26, 205, 26+120, 205+100 ); 
    bltObject(x,y, 
      myglobs.g_lpDDSGameMenu, 
      &rcTmp, 
      DDBLTFAST_SRCCOLORKEY); 
    bltObject(x+120, y, 
      myglobs.g_lpDDSGameMenu, 
      &rcTmp, 
      DDBLTFAST_SRCCOLORKEY); 
    bltObject(x+240, y, 
      myglobs.g_lpDDSGameMenu, 
      &rcTmp, 
      DDBLTFAST_SRCCOLORKEY); 
    bltObject(x+360, y, 
      myglobs.g_lpDDSGameMenu, 
      &rcTmp, 
      DDBLTFAST_SRCCOLORKEY); 
  } 
   
  SetRect(&rcTmp, x+120, y+65, x+360, y+85); 
 
  DrawGameString(szBuffer 
    ,&rcTmp 
    ,DT_LEFT | DT_VCENTER 
    ,tmpColor 
    ,RGB(0,0,0),FALSE); 
   
   
  while( TRUE ){ 
    ddrval = d3dapp->lpBackBuffer->GetDC(&hdc); 
    if( ddrval == DD_OK ){	 
      CDC * pDC; 
      pDC = CDC::FromHandle(hdc); 
      SetRect(&rcTmp, x+10, y+10, x+470, y+50); 
      FillRect(hdc,&rcTmp, (HBRUSH)GetStockObject(BLACK_BRUSH)); 
      SetRect(&rcTmp, x, y, x+480, y+100); 
      pDC->Draw3dRect(&rcTmp, RGB(200,100,50), RGB(90,30,20) ); 
      SetRect(&rcTmp, x+1, y+1, x+479, y+99); 
      pDC->Draw3dRect(&rcTmp, RGB(150,80,50), RGB(120,60,30) ); 
      static BOOL bFirstIn = TRUE; 
      static int LastHeight[PROGRESS_BAR_WIDTH]; 
      static int inTimes = 2; 
      int i,j,g,b; 
      x += 10; 
      y += 50; 
      if( bFirstIn ){ 
 
        bFirstIn = FALSE; 
        LastHeight[0] = 10; 
        for(i=1; i 35 ) 
            LastHeight[i] = 35; 
        } 
      } 
       
      inTimes--; 
      if( inTimes < 0 ) inTimes = 919; 
      LastHeight[(inTimes>>1)] = LastHeight[((inTimes>>1)+1)%PROGRESS_BAR_WIDTH] + rand()%5 - 2; 
      if(LastHeight[inTimes>>1] < 0)  
        LastHeight[inTimes>>1] = 0; 
      else if( LastHeight[inTimes>>1] > 35 ) 
        LastHeight[inTimes>>1] = 35; 
       
      register int n; 
      n = LastHeight[inTimes>>1] + rand()%5; 
      for(j=0; j>2) - j) / n; 
        }else{ 
          g = 1020 * (n - j ) / n / 3; 
          b = 0; 
        } 
        SetPixelV(hdc, x, y, RGB(255, g, b)); 
      } 
      y += n; 
      x++; 
      for(i=1;i>1))%PROGRESS_BAR_WIDTH; 
        j = (n-1+PROGRESS_BAR_WIDTH)%PROGRESS_BAR_WIDTH; 
        g = 5 - abs(LastHeight[n] - LastHeight[j]); 
        LastHeight[n] = _MAX(LastHeight[n], LastHeight[j]); 
        LastHeight[n] += rand()%g - 2; 
        n = LastHeight[n] + rand()%5; 
        if( i < nPercent ){ 
          y = 475; 
          for(j=0; j>2) - j) / n; 
            }else{ 
              g = 1020 * (n - j ) / n / 3; 
              b = 0; 
            } 
            SetPixelV(hdc, x, y, RGB(255, g, b)); 
          } 
          x++; 
        } 
      } 
      d3dapp->lpBackBuffer->ReleaseDC(hdc); 
      return; 
    } 
    if( ddrval == DDERR_SURFACELOST ){ 
      if( !RestoreSurfaces() ) 
        return; 
    } 
    if( ddrval != DDERR_WASSTILLDRAWING ) 
      return; 
  } 
} 
 
HRESULT getObject( int x, int y, LPDIRECTDRAWSURFACE surf, LPRECT src, DWORD flags ) 
{ 
  HRESULT ddrval; 
  while(TRUE){ 
    ddrval=surf->BltFast(x,y,d3dapp->lpBackBuffer,src,flags); 
    if(ddrval==DD_OK) break; 
    if(ddrval==DDERR_SURFACELOST) if(!RestoreSurfaces()) break; 
    if(ddrval!=DDERR_WASSTILLDRAWING) break; 
  } 
  return ddrval; 
} 
 
HRESULT bltObject( int x, int y, LPDIRECTDRAWSURFACE surf, LPRECT src, DWORD flags ) 
{ 
  HRESULT ddrval; 
  while(TRUE){ 
    ddrval=d3dapp->lpBackBuffer->BltFast(x,y,surf,src,flags); 
    if(ddrval==DD_OK) break; 
    if(ddrval==DDERR_SURFACELOST) if(!RestoreSurfaces()) break; 
    if(ddrval!=DDERR_WASSTILLDRAWING) break; 
  } 
  return ddrval; 
} 
 
void ReleaseD3DScreen() 
{ 
  LPDIRECT3DRMFRAMEARRAY frames; 
  int i,fnum; 
  myglobs.scene->GetChildren(&frames); 
  fnum=frames->GetSize();		//0 ~ getsize()-1 
  for(i=1; iGetElement( fnum-i, &subframe); 
    subframe->QueryInterface(IID_IDirect3DRMFrame3, (LPVOID*)&pFrame3); 
    myglobs.scene->DeleteChild(pFrame3); 
    subframe->Release(); 
    pFrame3->Release(); 
  } 
  frames->Release(); 
} 
 
HRESULT bltButtonObject( LPRECT rctar, LPRECT src, LPDIRECTDRAWSURFACE surf, DWORD flags ) 
{ 
  HRESULT ddrval; 
  int x,y; 
  x = rctar->left; 
  y = rctar->top; 
   
  while(TRUE){ 
    ddrval=d3dapp->lpBackBuffer->BltFast(x,y,surf,src,flags); 
    if(ddrval==DD_OK ) return ddrval; 
    if(ddrval==DDERR_SURFACELOST) if(!RestoreSurfaces()) return ddrval; 
    if(ddrval!=DDERR_WASSTILLDRAWING) return ddrval; 
  } 
  return ddrval; 
} 
 
void bltScore( char *num, int x, int y ,LPRECT src,LPDIRECTDRAWSURFACE surf) 
{ 
  char *c; 
  int     i; 
  RECT tmpsrc; 
  tmpsrc.top = src->top; 
  tmpsrc.bottom = src->bottom; 
  tmpsrc.right = src->right; 
   
  for(c=num; *c != '\0'; c++){ 
    tmpsrc.left = src->left; 
    i = *c - '0'; 
    tmpsrc.left += i*12; 
    tmpsrc.right = tmpsrc.left + 12; 
    tmpsrc.bottom = tmpsrc.top + 18; 
    bltObject( x, y, surf, &tmpsrc, DDBLTFAST_SRCCOLORKEY ); 
    x += 13; 
  } 
} 
 
void ShowErrorMsg(char *szErrorMsg) 
{ 
  HDC hdc; 
  HRESULT ddrval; 
   
  RECT rcRect = {191,334,392,350}; 
  while( TRUE ){ 
    ddrval =d3dapp->lpBackBuffer->GetDC(&hdc); 
    SelectObject(hdc, g_MessagehFont); 
    if( ddrval == DD_OK ){ 
      SetTextColor(hdc,RGB(255,255,0)); 
      SetBkMode( hdc, TRANSPARENT ); 
      DrawText(hdc,szErrorMsg,-1,&rcRect,DT_LEFT | DT_VCENTER); 
      d3dapp->lpBackBuffer->ReleaseDC(hdc); 
      return; 
    } 
    if( ddrval == DDERR_SURFACELOST ){ 
      if( !RestoreSurfaces() ) 
        return; 
    } 
    if( ddrval != DDERR_WASSTILLDRAWING ) 
      return; 
  } 
} 
 
HRESULT Draw2DSurFaces( ) 
{ 
  HRESULT hr; 
 
  if(myglobs.g_lpDDSGameMenu){ 
    switch(g_nGameState){ 
    case GAME_SETUP: 
      hr = m_StartGameMenu.Draw2DSetup(); 
      break; 
    case GAME_LOADPLAYER: 
      hr = m_MenuLoadOldPlay.Draw2DSetup(); 
      break; 
    case GAME_CREATEPLAYER: 
      hr = m_MenuCreateNew.Draw2DSetup(); 
      break; 
    case GAME_MAIN: 
	case GAME_WAIT: 
      hr = m_MainScreen.Draw2DMainScreen(); 
      break; 
	 
    case GAME_CHANGEMAP: 
      hr = m_MainScreen.DrawChangeMapScreen(); 
      break; 
	case GAME_SERVER: 
		hr=wgs.ShowWGS(d3dapp->lpBackBuffer,myglobs.g_lpDDSWGS); 
			break; 
    default: 
      break; 
    } 
  } 
  return hr; 
}