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

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

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

//-------------------------------------------------------------------

HRESULT CD3DFramework7::CreateEnvironment(GUID*pDriverGUID, GUID*pDeviceGUID, DDSURFACEDESC2*pMode, DWORD dwFlags) { }

第一个用到的呼叫是CD3DFramework7::CreateDirectDraw函式,它会呼叫DirectDrawCreateEx,利用IID_IDirectDraw7接口来建立DirectDraw接口。

CD3DFramework7::CreateDirectDraw也会设定Windows的共享等级。(我在下一段会说明)最后,因为Direct3D程序框架并不使用调色盘,您必须确认程序并不是在调色模式下执行。程序的原始码如下:

HRESULT hr;

//选择预设的内存型态,视装置为 //硬件或软件而定

if(IsEqualIID(*pDeviceGUID,IID_IDirect3DHALDevice)) m_dwDeviceMemType =DDSCAPS_VIDEOMEMORY; else if(IsEqualIID

m_dwDeviceMemType =DDSCAPS_VIDEOMEMORY; else

m_dwDeviceMemType =DDSCAPS_SYSTEMMEMORY; //建立DirectDraw对象。

hr =CreateDirectDraw(pDriverGUID,dwFlags); if(FAILED(hr))

return hr;

//建立前后缓冲区,并加上裁切。 if(dwFlags &D3DFW_FULLSCREEN) hr =CreateFullscreenBuffers(pMode); else

hr =CreateWindowedBuffers(); return hr;

if(FAILED(hr)) return S_OK;

(*pDeviceGUID,IID_IDirect3DTnLHalDevice))

//-------------------------------------------------------------------

//名称:CreateDirectDraw //说明:建立DirectDraw接口

//-------------------------------------------------------------------

HRESULT CD3DFramework7::CreateDirectDraw(GUID*pDriverGUID, DWORD dwFlags) {

//设定Windows共享等级。 DWORD dwCoopFlags =DDSCL_NORMAL; if(m_bIsFullscreen) DDSCL_FULLSCREEN;

//旗标的默认值是设成让Direct3D可以 //对浮点运算作最佳化。

if(0L ==(dwFlags &D3DFW_NO_FPUSETUP)) dwCoopFlags |=DDSCL_FPUSETUP; if(FAILED(m_pDD->SetCooperativeLevel{ }

//检查发现并非调色盘显示模式。这种情况下会产生失败, //因为Direct3D程序框架无法使用调色盘 DDSURFACEDESC2 ddsd;

ddsd.dwSize =sizeof(ddsd); m_pDD->GetDisplayMode(&ddsd);

DEBUG_MSG(_T(\)); return D3DFWERR_COULDNTSETCOOPLEVEL;

dwCoopFlags =DDSCL_ALLOWREBOOT|DDSCL_EXCLUSIVE| //建立DirectDraw接口。

if(FAILED(DirectDrawCreateEx(pDriverGUID,(VOID**)&m_pDD, { }

DEBUG_MSG(_T(\)); return D3DFWERR_NODIRECTDRAW;

IID_IDirectDraw7,NULL)))

(m_hWnd,dwCoopFlags)))

}

if(ddsd.ddpfPixelFormat.dwRGBBitCount <=8) return D3DFWERR_INVALIDMODE; return S_OK;

设定共享等级

一旦建立了一个DirectDraw装置,您就需要设定共享等级(cooperative level)。它的用途是在DirectDraw、DirectSound、DirectInput上,来定义您的程序如何搭配现有系统和其它的应用程序。您必须在您呼叫其它DirectDraw方法之前设定共享等级,否则这些方法可能导致失败,实际情况要看其它程序的运作内容而定。

在DirectDraw里,共享等级主要用来决定一个应用程序在窗口或全屏幕模式下执行时,是否能对显示画面有独占的存取权限。在DirectX 7中,您可以用

IDirectDraw7::SetCooperativeLevel方法来设定DirectDraw的共享等级。标准的共享等级会让DirectDraw处在窗口模式下,使得您无法更改主绘图页的调色盘或执行切换页。对大多数游戏来说,这种限制令人无法接受,因为有时候调色盘必须改变,同时切换页功能对真实的3D来说也是必备的。我会在本章后半部的相关程序中详细说明切换绘图页功能。现在只要记住您常要设定共享等级来取得全屏幕的独占存取权限,而不是限于在窗口模式下执行。

DirectDraw共同等级可以用在下列用途:

? 如果使用者同时按下 Ctrl 和 Alt 和 Del 键时,避免让DirectDraw重新开机并且失去

显示的独占权。

? 启动Mode X分辨率。

? 允许DirectDraw将应用程序作最大或最小化(在窗口模式时)。

? 指示是否将会调整调色盘。

DirectDraw会在独占、全屏幕模式下直接控制窗口启动事件。(其它 的应用程序则不会抢夺显示资源)透过SetCooperativeLevel方法,WM_ACTIVATEAPP讯息会依需求送到窗口处理记录去。因此,因为DirectDraw只会传送启动事件到最上层的窗口,您必须把程序所建立的需要启动事件讯息的子窗口再加以细分类。

IDirectDraw7::SetCooperativeLevel方法的宣告如下:

HRESULT SetCooperativeLevel( ); 参数 HWnd 说明 应用程序中用到的窗口处理。这个参数会设定为呼叫者程序的最上 层窗口。当dwFlags参数中设定DDSCL_NORMAL旗标时,本值可 以为NULL。 以下旗标的任一个或数个: DDSCL_ALLOWMODEX 开启模式X显示模式。如果 DDSCL_EXCLUSIVE和DDSCL_FULLSCREEN旗标值存在时, 可使用本旗标。 DDSCL_ALLOWREBOOT 在独占的全屏幕模式下时,允许Ctrl + Alt + Del有作用。 DDSCL_CREATEDEVICEWINDOW 仅Windows 98和Windows 2000 支援。本值表示DirectDraw会针对DirectDraw对象建立和管理预 设装置窗口。 DDSCL_EXCLUSIVE 请求独占层级。这个旗标必须和 DDSCL_FULLSCREEN共享。 DwFlags DDSCL_FPUPRESERVE DirectDraw表示呼叫者程序在意浮点单元 状态而且不希望Direct3D以程序可见的方式加以修改。本旗标会使 Direct3D在修改FPU状态前储存并在事后回复FPU状态。 DDSCL_FPUSETUP 系统会尝试关闭单精准和例外来维持FPU设定 值,让Direct3D也不须每次设定FPU以达到最佳的Direct3D效率。 DDSCL_FULLSCREEN 代表独占模式的使用者会承担全部的主绘图 页。可以忽略绘图装置接口(GDI)。本旗标值必须和DDSCL_EXCLUSIVE 旗标并用。 DDSCL_MULTITHREADED 请求多执行绪安全(multithread-safe) DirectDraw运作。这个旗标会让Direct3D经常地采取全域极重要 的段落(global critical section)。 DDSCL_NORMAL 表示程序的作用方式如同正常的Windows应用 程序。这个旗HWND hWnd, DWORD dwFlags 标不得和DDSCL_ALLOWMODEX, DDSCL_EXCLUSIVE, or DDSCL_FULLSCREEN等旗标值同时用。 DDSCL_NOWINDOWCHANGES 设定当DirectDraw不可以最小化 或回复作用中的窗口。 DDSCL_SETDEVICEWINDOW 仅Windows 98和Windows 2000支 援。本旗标值意谓hWnd参数是DirectDraw对象的装置窗口的视 窗处理。本值不得与DDSCL_SETFOCUSWINDOW旗标值并用。 以下旗标的任一个或数个: DwFlags DDSCL_SETFOCUSWINDOW 仅Windows 98和Windows 2000支 援。本旗标值意谓hWnd参数是DirectDraw对象的焦点窗口的视 窗处理。本值不得与DDSCL_SETDEVICEWINDOW旗标值并用。 如果您用到了DDSCL_NORMAL旗标,使用多个DirectDraw窗口,并且传NULL值给窗口处理的话,IDirectDraw7::SetCooperativeLevel方法允许在正常的窗口模式下,同时使用所有的窗口。

您可以利用这个独占且全屏幕的共同等级,让系统上的加速硬件发挥最大的优点,这也正是为何许多设计人员会在全屏幕下设计游戏的一个原因。这种模式允许切换绘图页、动态调整或定制调色盘、及调整显示分辨率。您必须记住,当处在独占及全屏幕模式下时,其它的应用程序虽然也可以配置绘图页和使用DirectDraw,但只有握有独占存取权的应用程序才可以改变显示模式和调色盘。

建立绘图页

IDirectDrawSurface7接口控制的绘图页是指一大块显示内存。您利用这个绘图页来作为像是使用者在屏幕上看到的主要显示页或是3d表面的贴图。您可以用视讯内存或系统内存来作为您的绘图页。如果您不指定一个特定的内存型态,DirectDraw会自动将DirectDrawSurface7对象放在可达到最佳效果的内存内。

要建立一个绘图页,只要呼叫IDirectDraw7::CreateSurface方法即可,它的定义如下:

HRESULT CreateSurface(

LPDDSURFACEDESC2 lpDDSurfaceDesc2, LPDIRECTDRAWSURFACE7 FAR *lplpDDSurface,

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库设定Direct 3D应用程序中的DirectDraw(6)在线全文阅读。

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