参数 说明 指向要用的DirectDraw装置的全域识别码地址,或是以下任何一 个: NULL 使用主装置(作用中的显示驱动程序)。 lpGUID DDCREATE_EMULATIONONLY 使用HEL装置(测试或除错时)。 DDCREATE_HARDWAREONLY 只能配合预设装置使用HAL(测试或除错时)。 lplpDD iid 呼叫成功时,用有效的IDirectDraw7接口指针来初始化某个变量,该变量的地址。 必须设为IID_IDirectDraw7;其它值会造成函式失败。 PUnkOuter 必须设为NULL;作用是要和COM群集(aggregation)功能保持未 来兼容性。 假如呼叫DirectDrawCreateEx失败了,DriverEnumCallback程序会立刻回传并且等待再次被呼叫,来决定还有没有其它在列举作业中找到的可用的DirectDraw硬件可发生作用。如果DirectDrawCreateEx成功,您可以用DirectDraw的 GetCaps方法(前面程序的步骤3)来查询对象所支持的特性。 GetCaps方法会传回特性位,它定义了执行系统硬件支持的特性和列举的部分。注意:这个函式只能取得DirectDraw特性,而不是Direct3D特性(稍后会说明)。如果显示装置缺乏您需要的DirectDraw特性,您可以决定在您的程序中不要采用。以下是GetCaps的宣告内容:
HRESULT GetCaps( ); 参数 说明 LPDDCAPS lpDDDriverCaps , LPDDCAPS lpDDHELCaps lpDDDriverCaps 已填入装置硬件特性的DDCAPS结构的地址 lpDDHELCaps DDCAPS结构的地址,结构中填入HEL特性 您必须决定您的程序中有哪些是必备功能及最好要有哪些功能。有许多市售的显示装置并不支持某些特性如迭合(overlay),因此您最好考虑这些功能的必要性。您的程序代码应该要能在现今的加速卡上执行并且运用任何可用的功能,但仍然应具备一定弹性,以便在不具备这些功能的情况下也能顺利地执行,并平顺的减少对3D世界的需求。
列举显示模式
DriverEnumCallback程序中的下个步骤(步骤4),是要列举目前DirectDraw装置中的所有可用显示模式。DirectDraw支持特性包括自动作调色盘记录处理(设定调色盘信息)和图块搬移(复制2D图形数据),所以您毋须分别处理每种硬件型态。然而,您一定要像在DriverEnumCallback程序中一样使用IDirectDraw7::EnumDisplayModes,来决定目前安装的显示器所支持的显示模式。所谓显示模式是指像素分辨率(例如1024×768),像素色深(例如32-位颜色),及更新速率(例如85Hz)的组合。DirectDraw会去比较显示屏幕特性和可用的显示模式,如果显示器不能支持需求的模式时, IDirectDraw7::SetDisplayMode会失败。透过列举来决定显示器的特性时,您不需要担心呼叫会失败,因为您可以预先知道可用的模式。
IDirectDraw7::EnumDisplayModes方法宣告如下:
HRESULT EnumDisplayModes( ); 参数 以下旗标之一: DDEDM_REFRESHRATES 列举不同更新速率的模式。 IDirectDraw7::EnumDisplayModes 确保每个特别模式 只会被列举一次。这个旗标表示当在决定某个模式是否 唯一时,会不会使用更新速率。 DDEDM_STANDARDVGAMODES 除了320x200x8模式 X模式外还要列举模式13 lpDDSurfaceDesc2 LpContext LpEnumModesCallback 针对每个可用模式所要检查的DDSURFACEDESC2结构的地址。如果这个参数是NULL时,所有的模式都要 列举。 应用程序定义的结构地址,会传给每一个列举成员。 每次有符合发生时,列举子程序就会呼叫EnumModesCallback2函式,该函式的地址。 说明 DWORD dwFlags, LPDDSURFACEDESC2 lpDDSurfaceDesc2, LPVOID lpContext, LPDDENUMMODESCALLBACK2 lpEnumModesCallback dwFlags 以下是列举显示模式的原始程序。ModeEnumCallback函式是负责列举显示模式的主要程序。这个程序会建立一个可用显示模式的清单。这个清单会存在pDevice->pddsdModes数组里。
//-------------------------------------------------------------------
//名称:ModeEnumCallback
//说明:用来列举显示模式的回传函式
//-------------------------------------------------------------------
static HRESULT WINAPI ModeEnumCallback(DDSURFACEDESC2*pddsd, VOID*pParentInfo) { }
//加入新模式
pDevice->pddsdModes [pDevice->dwNumModes++] ==(*pddsd); return DDENUMRET_OK;
D3DEnum_DeviceInfo*pDevice =(D3DEnum_DeviceInfo*)//重新配置这些模式的储存空间 DDSURFACEDESC2*pddsdNewModes =
new DDSURFACEDESC2 [pDevice->dwNumModes+1]; memcpy(pddsdNewModes,pDevice->pddsdModes, delete pDevice->pddsdModes;
pDevice->pddsdModes =pddsdNewModes;
pDevice->dwnumModes *sizeof(DDSURFACEDESC2)); pParentInfo;
列举Direct3D装置
DriverEnumCallback程序中的最后一个步骤是呼叫IDirect3D7::EnumDevices,以针对目前的DirectDraw装置列举所有的Direct3D装置。因为这是一个Direct3D方法,我们首先需要取得一个IDirect3D7接口指针。这个指针可以透过呼叫IDirectDraw7对象上的QueryInterface的方式,在DriverEnumCallback的步骤2中取得。IDirect3D7::EnumDevices方法的定义如下:
HRESULT EnumDevices( ); 参数 lpEnumDevicesCallback LpUserArg 说明 每次有符合发生时,列举子程序就会呼叫D3DenumDevicesCallback7函式,该函式的地址。 传给回传函式的应用程序定义数据的地址。 LPD3DENUMDEVICESCALLBACK7 lpEnumDevicesCallback, LPVOID lpUserArg IDirect3D7::EnumDevices会针对每个Direct3D装置呼叫一个使用者设定的回传函式。这种作法和DirectDrawEnumerateEx及IDirectDraw7::EnumDisplayModes的技巧类似。Direct3D程序框架的Direct3D装置回传程序(在d3denum.cpp中)叫做DeviceEnumCallback。这个函式的定义如下:
//-------------------------------------------------------------------
//名称:DeviceEnumCallback //说明:用来列举装置的回传函式
//-------------------------------------------------------------------
static HRESULT WINAPI DeviceEnumCallback(TCHAR*strDesc, TCHAR*strName, D3DDEVICEDESC7*pDesc, VOID*pParentInfo) {
//记录被列举的装置数目 g_dwNumDevicesEnumerated++; D3DEnum_DeviceInfo*pDriverInfo = (D3DEnum_DeviceInfo*)pParentInfo;
D3DEnum_DeviceInfo*pDeviceInfo =&g_pDeviceList
ZeroMemory(pDeviceInfo,sizeof(D3DEnum_DeviceInfo)); //选择HAL或HEL描述 pDeviceInfo->bHardware =
pDesc->dwDevCaps &D3DDEVCAPS_HWRASTERIZATION; memcpy(&pDeviceInfo->ddDeviceDesc,pDesc,
[g_dwNumDevices];
sizeof(D3DDEVICEDESC7)); //建立这个装置的装置信息
pDeviceInfo->bDesktopCompatible =pDriverInfo-pDeviceInfo->ddDriverCaps =pDriverInfo->ddDriverCaps; pDeviceInfo->ddHELCaps =pDriverInfo->ddHELCaps; pDeviceInfo->guidDevice =pDesc->deviceGUID; pDeviceInfo->pDeviceGUID =&pDeviceInfo->guidDevice; pDeviceInfo->pddsdModes = new DDSURFACEDESC2 [pDriverInfo-//复制这个装置的驱动程序GUID及描述 if(pDriverInfo->pDriverGUID) { } else {
pDeviceInfo->pDriverGUID =NULL;
lstrcpyn(pDeviceInfo->strDesc,strName,39); }
//避免重复:只针对辅助DirectDraw驱动程序去 //列举硬件装置.
if(NULL !=pDeviceInfo->pDriverGUID &&
FALSE ==pDeviceInfo->bHardware)
return D3DENUMRET_OK;
pDeviceInfo->guidDriver =pDriverInfo->guidDriver; pDeviceInfo->pDriverGUID =&pDeviceInfo->guidDriver; lstrcpyn(pDeviceInfo->strDesc,pDriverInfo-
>bDesktopCompatible;
>dwNumModes];
>strDesc,39);
//让应用程序有机会选择接受或拒绝该装置 if(g_fnAppConfirmFn)
if(FAILED(g_fnAppConfirmFn(&pDeviceInfo-
&pDeviceInfo->ddDeviceDesc)))
return D3DENUMRET_OK;
>ddDriverCaps,
//建立该装置所支持模式的清单。
for(DWORD i=0;i
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库设定Direct 3D应用程序中的DirectDraw(3)在线全文阅读。
相关推荐: