参数 lpCallback 说明 回传函式的地址。系统会对每个已安装在目标系统上的有效DirectDraw HAL描述呼叫这个函式。 lpContext 程序定义关联的地址。每一次呼叫时都会传给列举回传函式。 指定列举范围的旗标。如果值为0,函式只会列举主要显示装置。这个参数也可以是以下旗标的组合: DDENUM_ATTACHEDSECONDARYDEVICES 列举主要装置以及其它连结到桌面的显示装置 dwFlags DDENUM_DETACHEDSECONDARYDEVICES 列举主要装置以及其它没有连结到桌面的显示装置 DDENUM_NONDISPLAYDEVICES 列举主要装置以及其它非显示装置,如没有2D功能的3D加速卡 在Direct3D程序框架中,列举作业会以d3denum.cpp中的函式D3DEnum_EnumerateDevices开始。这个程序的程序代码如下:
//-------------------------------------------------------------------
//名称:D3DEnum_EnumerateDevices
//说明:列举所有的驱动程序、装置和模式。. // // ---
HRESULT D3DEnum_EnumerateDevices(HRESULT (*AppConfirmFn)(DDCAPS*,D3DDEVICEDESC7*)) {
//储存装置列举回传函式
g_fnAppConfirmFn =AppConfirmFn; //列举所有的驱动程序、装置和模式
DirectDrawEnumerateEx(DriverEnumCallback,NULL, DDENUM_ATTACHEDSECONDARYDEVICES |
每一个装置都会呼叫回传函式,以确认 装置支持了应用程序必须的功能集合。
//----------------------------------------------------------------
}
DDENUM_DETACHEDSECONDARYDEVICES| DDENUM_NONDISPLAYDEVICES); //确定已列举了所有装置
if(0 ==g_dwNumDevicesEnumerated) { }
if(0 ==g_dwNumDevices) { }
return S_OK;
DEBUG_MSG(_T(\
return D3DENUMERR_ENUMERATIONFAILED;
enumerated!\));
DEBUG_MSG(_T(\
DEBUG_MSG(_T(\return D3DENUMERR_SUGGESTREFRAST;
accepted!\)); Rasterizer.\));
传给D3DEnum_EnumerateDevices的参数AppConFirmFn是一个函式指标,用来筛选不适用于程序的Direct3D装置,关于这部分会在本章稍后作详细说明。
DirectDrawEnumerateEx会用一个函式指标作它的第一个参数。这个指针会指到应用程序定义的回传函式。在本程序中,它则指到DriverEnumCallback程序。这个函式的形式如下:
BOOL WINPAPI DDEnumCallbackEx( ); 参数 lpGUID 装置GUID的地址 说明 GUID FAR *lpGUID, LPSTR lpDriverDescription, LPSTR lpDriverName, LPVOID lpContext HMONITOR hm lpDriverDescription 装置描述的地址 lpDriverName lpContext 装置名称的地址 传给DirectDrawEnumerateEx的使用者定义数据关联的地址 和列举的DirectDraw对象相关的显示屏处理。当列举的DirectDraw对象指hm 的是主要装置,而非显示装置(例如没有2D功能的3D加速卡),以及没有和桌面连接的装置时,这个参数值是NULL。 d3denum.cpp中的DriverEnumCallback函式定义如下:
//-------------------------------------------------------------------
//名称:DriverEnumCallback
//说明:用来列举驱动程序的回传函式
//-------------------------------------------------------------------
static BOOL WINAPI DriverEnumCallback(GUID*pGUID,TCHAR*strDesc, TCHAR*strName,VOID*, HMONITOR) {
D3DEnum_DeviceInfo d3dDeviceInfo; LPDIRECTDRAW7 pDD; LPDIRECT3D7 pD3D; HRESULT hr; // //步骤1
//用GUID建立DirectDraw对象。 //
hr =DirectDrawCreateEx(pGUID,(VOID**)if(FAILED(hr)) { } // //步骤2
DEBUG_MSG(_T(\return D3DENUMRET_OK;
&pDD,IID_IDirectDraw7,NULL );
enumeration!\));
//建立Direct3D对象以列举d3d装置 //
hr =pDD->QueryInterface(IID_IDirect3D7,(VOID**)&pD3D); if(FAILED(hr)) { } // //步骤3 //
//将数据复制到装置信息结构中。
ZeroMemory(&d3dDeviceInfo,sizeof(d3dDeviceInfo)); lstrcpyn(d3dDeviceInfo.strDesc,strDesc,39); d3dDeviceInfo.ddDriverCaps.dwSize =sizeof(DDCAPS); d3dDeviceInfo.ddHELCaps.dwSize =sizeof(DDCAPS); pDD->GetCaps(&d3dDeviceInfo.ddDriverCaps, &d3dDeviceInfo.ddHELCaps); if(pGUID) { }
strcpy(D3Ddevicename,d3dDeviceInfo.strDesc); //记录装置可否绘制到桌面窗口中。 if(d3dDeviceInfo.ddDriverCaps.dwCaps2 &DDCAPS2_CANRENDERWINDOWED)
if(NULL ==d3dDeviceInfo.pDriverGUID) d3dDeviceInfo.bDesktopCompatible =TRUE; // //步骤4
//列举全屏幕显示模式 //
pDD->EnumDisplayModes(0,NULL,&d3dDeviceInfo,
d3dDeviceInfo.guidDriver =(*pGUID);
d3dDeviceInfo.pDriverGUID =&d3dDeviceInfo.guidDriver; pDD->Release();
DEBUG_MSG(_T(\return D3DENUMRET_OK;
enumeration!\));
}
ModeEnumCallback); //将显示模式的清单作排序
qsort(d3dDeviceInfo.pddsdModes,d3dDeviceInfo.dwNumModes, //现在列举所有的3D装置。
pD3D->EnumDevices(DeviceEnumCallback,&d3dDeviceInfo); //清除并返回
SAFE_DELETE(d3dDeviceInfo.pddsdModes); pD3D->Release(); pDD->Release(); return DDENUMRET_OK;
sizeof(DDSURFACEDESC2),SortModesCallback);
在列举每一个DirectDraw装置时,DirectX会呼叫DriverEnumCallback并传入对应的GUID、描述、名称以及监视器处理代码。您可以看到,有了这些信息后,
DriverEnumCallback所要做的第一件事便是针对每个装置建立一个DirectDraw对象。
建立一个DirectDraw对象
所谓DirectDraw对象是指一个能在特定显示装置上运作的对象。如果现有的任何显示装置支持硬件加速时,DirectDraw对象就可以用到加速功能。您可以使用目标系统上已有的每一个唯一DirectDraw对象来操控显示装置,并建立他们的裁切对象、绘图页、调色盘等等。
在上面的第一段(步骤1)中的DriverEnumCallback函式中,呼叫
DirectDrawEnumerateEx程序的目的是要建立DirectDraw装置。这个函式只会传回新的IDirectDraw7界面。如果您想用到任何较早的接口,您必须要用DirectDrawCreate来建立对象并查询想用的接口。在您开发新游戏时,您应该使用最新的接口。我建议在您的新程序中使用DirectDrawCrea teEx。这个函式的宣告内容如下:
HRESULT WINAPI DirectDrawCreateEx );
GUID FAR *lpGUID,
LPDIRECTDRAW FAR *lplpDD, REFIID iid,
IUnknown FAR *pUnkOuter
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库设定Direct 3D应用程序中的DirectDraw(2)在线全文阅读。
相关推荐: