77范文网 - 专业文章范例文档资料分享平台

设定Direct 3D应用程序中的DirectDraw(2)

来源:网络收集 时间:2019-03-28 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

参数 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)在线全文阅读。

设定Direct 3D应用程序中的DirectDraw(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/554083.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: