初探DirectDraw 第2集

第1集中,DirectDraw 画出来的界面是全屏的,想把它改成窗口的
我把原先在调用 SetCooperativeLevel() 时 DDSCL_FULLSCREEN 参数改成 DDSCL_NORMAL 
 if (FAILED(lpDDraw->SetCooperativeLevel(g_hwnd, DDSCL_NORMAL  )))
 
结果后面的
CreateSurface() 就调用失败了,返回的错误是 DDERR_INVALIDCAPS
 
Google 了一下,意外地找到几个URL
http://www.gamedev.net/reference/articles/article608.asp
http://blog.csdn.net/310cdt/archive/2002/01/22/5248.aspx
 
另外也找到了答案,代码改动如下:
/**/ /**
  * 设置参数
  
*/

 
if  (FAILED(lpDDraw -> SetCooperativeLevel(g_hwnd, DDSCL_NORMAL  )))
 
{
  MessageBox(NULL,TEXT(
"DirectDraw SetCooperativeLevel error!"), TEXT("Wrong!"), MB_OK);
  
return(0);
 }


 
/**/ /**
  * 创建一个表层
  
*/

 DDSURFACEDESC ddsd;
 LPDIRECTDRAWSURFACE lpDDSPrimary;
 ddsd.dwSize 
=   sizeof (ddsd); 
 ddsd.dwFlags 
=  DDSD_CAPS ; 
 ddsd.ddsCaps.dwCaps 
=  DDSCAPS_PRIMARYSURFACE; 
 ddsd.dwBackBufferCount 
=   1
 ddrval 
=  lpDDraw -> CreateSurface( & ddsd,  & lpDDSPrimary, NULL); 
    
if  (FAILED(ddrval))
 
{
   MessageBox(NULL, 
"Failed to CreateSurface", NULL, MB_OK);
  
return FALSE;
 }


全部代码:
  /**/ /**
  * 创建一个 DirectDraw 对象
  
*/

 LPDIRECTDRAW _lpDD 
=  NULL; 
 HRESULT ddrval 
=  DirectDrawCreate(NULL,  & _lpDD, NULL);
    
if  (FAILED(ddrval))
 
{
     MessageBox(NULL, 
"Failed to DirectDrawCreate", NULL, MB_OK);
  
return FALSE;
 }

 LPDIRECTDRAW lpDDraw 
=  NULL;
 
if (FAILED(_lpDD -> QueryInterface(IID_IDirectDraw, (LPVOID  * ) & lpDDraw)))
 
{
  MessageBox(NULL,TEXT(
"DirectDraw QueryInterface error!"), TEXT("Wrong!"), MB_OK);
  
return(0);
 }

 
/**/ /**
  * 设置执行模式
  
*/

 
if  (FAILED(lpDDraw -> SetCooperativeLevel(g_hwnd, DDSCL_NORMAL  )))
 
{
  MessageBox(NULL,TEXT(
"DirectDraw SetCooperativeLevel error!"), TEXT("Wrong!"), MB_OK);
  
return(0);
 }

 
/**/ /**
  * 创建一个表层
  
*/

 DDSURFACEDESC ddsd;
 LPDIRECTDRAWSURFACE lpDDSPrimary;
 ddsd.dwSize 
=   sizeof (ddsd); 
 ddsd.dwFlags 
=  DDSD_CAPS ; 
 ddsd.ddsCaps.dwCaps 
=  DDSCAPS_PRIMARYSURFACE; 
 ddsd.dwBackBufferCount 
=   1
 ddrval 
=  lpDDraw -> CreateSurface( & ddsd,  & lpDDSPrimary, NULL); 
    
if  (FAILED(ddrval))
 
{
   MessageBox(NULL, 
"Failed to CreateSurface", NULL, MB_OK);
  
return FALSE;
 }

 HDC hdc;
 
if (lpDDSPrimary -> GetDC( & hdc)  ==  DD_OK) 
 

  SetBkColor(hdc, RGB(
0,0,255)); 
  SetTextColor( hdc,RGB(
255,255,0 ) ); 
  TextOut( hdc, 
00"sxFrontMsg", lstrlen("szFrontMsg")); 
  lpDDSPrimary
->ReleaseDC(hdc); 
 }
 

*-*!!!! 
虽然不像之前全屏黑色,这次是“窗口模式”,DDSCL_NORMAL 或 DDSCL_FULLSCREEN 跟调用 CreateSurface() 时的参数有联系,
 
但怎么 TextOut  还是在屏幕的左上角?????
 
听说有一个 Clipper 的对象,就是一个“剪切区域”,通过这个对象可以防止画图画出指定的范围
 
修改代码如下:
/**/ /**
  * 设置执行模式
  
*/

 
if  (FAILED(lpDDraw -> SetCooperativeLevel(g_hwnd, DDSCL_NORMAL  )))
 
{
  MessageBox(NULL,TEXT(
"DirectDraw SetCooperativeLevel error!"), TEXT("Wrong!"), MB_OK);
  
return(0);
 }

 
/**/ /**
  * 创建一个表层
  
*/

 DDSURFACEDESC ddsd;
 LPDIRECTDRAWSURFACE lpDDSPrimary;
 ddsd.dwSize 
=   sizeof (ddsd); 
 ddsd.dwFlags 
=  DDSD_CAPS ; 
 ddsd.ddsCaps.dwCaps 
=  DDSCAPS_PRIMARYSURFACE; 
 ddsd.dwBackBufferCount 
=   1
 ddrval 
=  lpDDraw -> CreateSurface( & ddsd,  & lpDDSPrimary, NULL); 
    
if  (FAILED(ddrval))
 
{
  MessageBox(NULL, 
"Failed to CreateSurface", NULL, MB_OK);
  
return FALSE;
 }

 LPDIRECTDRAWCLIPPER clipper;
 
if (lpDDraw -> CreateClipper( 0 & clipper, NULL)  !=  DD_OK)
 

  MessageBox(NULL, 
"Failed to GreateClipper", NULL, MB_OK);
  
return FALSE;
 }

 
if ( lpDDSPrimary -> SetClipper(clipper)  !=  DD_OK )
 

  MessageBox(NULL, 
"Failed to SetClipper", NULL, MB_OK);
  
return FALSE;
 }

 clipper
-> SetHWnd( 0 , g_hwnd);
 HDC hdc;
 
if (lpDDSPrimary -> GetDC( & hdc)  !=  DD_OK) 
 

  MessageBox(NULL, 
"Failed to GetDC", NULL, MB_OK);
  
return FALSE;
 }


 SetBkColor(hdc, RGB(
0 , 0 , 255 )); 
 SetTextColor( hdc,RGB(
255 , 255 , 0  ) ); 
 TextOut( hdc, 
0 0 " sxFrontMsg " , lstrlen( " szFrontMsg " )); 
 lpDDSPrimary
-> ReleaseDC(hdc); 


*-*!!!!  TextOut 出来的东西依然显示在左上角!!!!
 
突然觉得好饿!!!,吃完东西再研究~~

你可能感兴趣的:(初探DirectDraw 第2集)