《windows游戏编程大师技巧》第五章:DirectX基础知识和令人生畏的COM

1、DirectX组件

DirectX是基于COM实现的,比系统自带的GDI和MCI更快、更稳定,其包括许多组件,如:

●DirectDraw(DirectX 8.0以上的版本不包含)

DirectSound

DirectSound3D

DirectMusic

DirectInput

DirectPlay

DirectSetup

DirectShow

Direct3DRM

Direct3DIM

DirectX Graphics(融合了DirectDraw和Direct3D)

DirectX Audio(融合了DirectSound和DirectMusic)

DirectDraw在DirectX 8.0版本里DirectDraw被移除了,它将DirectDrawDirect3D合成了DirectX Graphics不过仍可以使用是控制视频显示的主要图形渲染和2D位图引擎。

DirectSound声音组件,只支持数字化的声音,不支持MIDI。DirectSound3D是3D声音组件。

DirectMusic:声音音乐组件,支持MIDI。现在DirectMusicDirectSound被合并成了DirectX Audio

DirectInput:处理输入设备,如鼠标、键盘、游戏控制杆、空间定位球等。

DirectPlay:处理网络方面的事情。

DirectShow:播放流媒体组件。现在移到了Windows SDK。

Direct3DRM:Direct3D的保留模式。

Direct3DIMDirect3D的直接模式。

2、应用DirectX COM组件

COM对象实际上是一个或一套实现了大量接口的C++类,一个接口就是一套函数。



3、不同版本的DirectX

DirectDraw 1.0接口指针数据类型:LPDIRECTDRAW  lpdd = NULL;

DirectDraw 7.0接口指针数据类型:LPDIRECTDRAW7  lpdd = NULL;

DirectDrawCreate()函数可以创建一个DirectDraw COM对象,并得到一个初始的接口指针

HRESULT WINAPI DirectDrawCreate(
  _In_  GUID FAR* lpGUID, // 视频显卡驱动的GUID(全局唯一标识符),一般设为NULL表示系统默认的硬件
  _Out_ LPDIRECTDRAW FAR* lplpDD, //返回的接口
  _In_  IUnknown FAR* pUnkOuter //高级功能,一般设为NULL
); 

eg:

DirectDrawCreate(NULL, &lpdd, NULL);                  

然而DirectDrawCreate()是DirectDraw 1.0版本定义的函数,获得的接口指针类型是LPDIRECTDRAW ,如果要在高于1.0版本里使用,有两种方法:

1、利用QueryInterface()函数,eg:

      LPDIRECTDRAW  lpdd = NULL;
      LPDIRECTDRAW7  lpdd7 = NULL;

      DirectDrawCreate(NULL, &lpdd, NULL);
      lpdd->QueryInterface(IID_IDirectDraw7, &lpdd7);
      lpdd->Release;
      lpdd = NULL;

需要注意的地方是DirectDraw 7.0的接口常量IID_IDirectDraw7,通常DirectX接口标识符(IID)采用以下格式:IDD_IDirectCD。其中C表示组件,如Draw表示DirectDraw,Sound表示DirectSound;D是一个2—n的数字,表示版本。

2、直接使用DirectDraw 7.0中的DirectDrawCreateEx()函数。

   HRESULT WINAPI DirectDrawCreateEx(
      _In_   GUID FAR *lpGUID, // 视频显卡驱动的GUID,一般设为NULL表示系统默认的硬件
      _Out_  LPVOID *lplpDD, // 这是返回的接口
      _In_   REFIID iid, // 请求接口相对应的ID
      _In_   IUnknown FAR *pUnkOuter //高级功能,一般设为NULL
   );

eg:

     LPDIRECTDRAW7  lpdd = NULL;
     DirectDrawCreateEx(NULL, (void**)&lpdd, IID_IDirectDraw, NULL);

3、利用底层COM函数,eg:

//初始化COM:加载COM库,如果它们没有被加载的话
if(FAILED(CoInitialize(NULL)))
{
	//error
	...
	return;
}

//实例化DirectDraw对象,并获得指定的接口指针
if(FAILED(CoCreateInstance(&CLSID_DirectDraw, 
                           NULL, 
						   CLSCTX_ALL, 
						   &IID_DirectDraw7, 
						   &lpdd7)))
{
	//error
	...
	return;
}

//初始化COM对象
lpdd7->Initialize(NULL);

...

//释放对COM的使用
CoUninitialize();


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值