DirectDraw学习:第一课

来源:互联网 发布:c语言能做界面吗 编辑:程序博客网 时间:2024/05/16 08:09

          早就听说DirectDraw的大名,以前学习Windows游戏编程大师技巧的时候,也接触过这些东西,但是后来有用其他原因放起学习,现在想重新学习DirectDraw,这个部件是DirectX中在早期很有用的,现在由于3D大行其道,DirectDraw 也被整合了。 废话不多说了。

    第一课,很简单,就是了解下DirectDraw的使用步骤。 其实这是大多数的库使用的必须步骤。

      第一步:  就是初始化DirectDraw接口,无非就是DirectDrawCreate()函数。 创建了ddraw之后就要设置起协作模式,显示模式。

                      函数:SetCooperativeLevel().设置协作模式,全屏,独占等设置。 SetDisplyMode()设置显示模式 分辨率,颜色质量。

     第二步:初始化显示页面对象。通过CreateSurface() 函数创建一个页面对象。 参数需要一个页面描述对象。

     第三步: 就做相关的操作。

     第四步: 释放对象。 DDraw 与DDrawSurface.

             // 第一步

 DDSURFACEDESC ddsd;
 HDC   hdc;
 if (DirectDrawCreate(NULL,&lpDD,NULL)!= DD_OK)
 {
  return FALSE;
 }
 if (lpDD->SetCooperativeLevel(GetActiveWindow(),DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN) != DD_OK)
 {
  return FALSE;
 }
 if (lpDD->SetDisplayMode(1024,768,32) != DD_OK)
 {
  MessageBox(GetActiveWindow(),"DisplayMode","Error",MB_OK);
  return false;
 }

 //第二步

 ddsd.dwSize=sizeof(ddsd);
 ddsd.dwFlags=DDSD_CAPS;
 ddsd.ddsCaps.dwCaps=DDSCAPS_PRIMARYSURFACE;
 if(lpDD->CreateSurface(&ddsd,&lpDDPrimary,NULL) != DD_OK) return false;

 

//第四步

 if (lpDD!=NULL)
 {
  if (lpDDPrimary!= NULL)
  {
   lpDDPrimary->Release();
   lpDDPrimary=NULL;
  }
  lpDD->Release();
  lpDD=NULL;
 }

 

 DirectDraw的大致使用步骤么就是这样。

  我在写代码的时候,遇到一个问题,就是如果你在创建页面的位置 通过得到DC句柄,然后输出文字,运行程序的时候。会一闪而过。

  if(lpDDPrimary->GetDC(&hdc) != DD_OK) return false;

 SetBkColor(hdc,RGB(255,0,0));
 SetTextColor(hdc,RGB(255,255,255));
 TextOut(hdc,0,0,"Hello World!",strlen("Hello World!")+1);
 TextOut(hdc,0,100,"PressDown ESC,you can exit.",strlen("PressDown ESC,you can exit.")+1);
 lpDDPrimary->ReleaseDC(hdc);

 这段代码是利用DirectDraw得到一个DC,通过DC来绘制文字,不过这貌似是GDI的方法咯。

  以上的代码最好放在消息循环中,否则会出现绘制出的文字被系统重绘,我试过用invalidateRect()函数禁止一个区域重绘,不过好像也不行。 只有将起放在循环中,就不会呗覆盖。   就说这么多了。


上面的DirectDraw版本很低的,刚刚发现如果使用DirectDraw高版本的时候,同样的代码有个错误,就是使用ddsd结构的时候,必须要用memset初始化 ddsd结构。 memset(&ddsd,0,sizeof(ddsd));

  要不然高版本创建显示表面会失败。 不知道具体原因。版本高了,微软改了些东西把。

0 0