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被移除了,它将DirectDraw和Direct3D合成了DirectX Graphics,不过仍可以使用。是控制视频显示的主要图形渲染和2D位图引擎。
DirectSound:声音组件,只支持数字化的声音,不支持MIDI。DirectSound3D是3D声音组件。
DirectMusic:声音音乐组件,支持MIDI。现在DirectMusic和DirectSound被合并成了DirectX Audio。
DirectInput:处理输入设备,如鼠标、键盘、游戏控制杆、空间定位球等。
DirectPlay:处理网络方面的事情。
DirectShow:播放流媒体组件。现在移到了Windows SDK。
Direct3DRM:Direct3D的保留模式。
Direct3DIM:Direct3D的直接模式。
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();