没画完的画

喂马 劈柴 BBQ~
posts - 37, comments - 55, trackbacks - 0, articles - 0
  C++博客 ::  :: 新随笔 :: 联系 :: 聚合  :: 管理

初探DirectDraw 第1集

Posted on 2008-09-26 11:36 没画完的画 阅读(1554) 评论(5)  编辑 收藏 引用 所属分类: DirectX

之前没接触过 DirectX 相关的东西,今天我那点激情终于燃烧起来了!!!!!

下载了DXSDK_Aug08.exe 并安装
用 VC6 创建了一个 Win32 Application Project
在窗体创建后添加如下代码
 
 /**
  * 创建一个 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_FULLSCREEN | DDSCL_EXCLUSIVE )))
 {
  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_BACKBUFFERCOUNT;
 ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE |DDSCAPS_FLIP | DDSCAPS_COMPLEX;
 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, 0, 0, "sxFrontMsg", lstrlen("szFrontMsg"));
 lpDDSPrimary->ReleaseDC(hdc);
 }

 
还需要加上
#pragma comment(lib, "ddraw.lib")
#pragma comment(lib, "dxguid.lib")
才能编译通过
 
运行后,是全屏模式,在左上角显示了一些文字,感觉跟直接画DC差不多 !!!!!!!!!!!
 
now.........
 
Step 1.
在使用DirectDraw之前,需要先创建一个 DirectDraw 的对象实例,
上文使用了 DirectDrawCreate 来创建,当然也可以通过 OLE 中的 CoCreatelnstance 函数 来创建,
别忘记了,DirectX 是以COM的形式提供的。(等有空再找资料~~~~)

Step 2. 设置一些参数
lpDDraw->SetCooperativeLevel(g_hwnd, DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE )

Step 3.使用 IDirectDrawSurface 接口
_lpDD->QueryInterface(IID_IDirectDraw, (LPVOID *)&lpDDraw)

DirectDrawSurface 据说是 DirectDraw 下的重要对象,这个对象描述了一块线型的显示区域
我们要画图形,文字都在这块显示区域上面进行,而 DirectDrawSurface 对象就是用来直接操作这片区域的

Step 4. 画东西
使用 lpDDSPrimary->GetDC(&hdc) 获取DC后,
画图操作就是DC的操作了.....(这跟直接操作DC有啥区别???)

简单的几个调用虽然离“入门”还有很长的距离,但至少用过 DirectDraw 了.......

一晚没睡,该去睡了~

Feedback

# re: 初探DirectDraw 第1集  回复  更多评论   

2008-09-26 11:56 by LOGOS
直接看D3D吧
DD已经是很古老的东西了

# re: 初探DirectDraw 第1集  回复  更多评论   

2008-09-26 12:23 by 没画完的画
在具体的应用中,用了一个第三方的视频接口,是用DDraw做的,所以想了解一下

# re: 初探DirectDraw 第1集  回复  更多评论   

2008-09-26 12:57 by lonkil
不支持再使用DriectDraw,可以使用D3D,D3D中也有2D接口。

# re: 初探DirectDraw 第1集  回复  更多评论   

2008-09-27 17:44 by 空明流转
太老了。

# re: 初探DirectDraw 第1集  回复  更多评论   

2013-01-22 17:46 by new
求解呀,和GDI的DC有啥区别,我能用此DC画直线吗?

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理