📄 g06.htm
字号:
DDERR_DIRECTDRAWALREADYCREATED│DirectDraw对象已经被创建<br> DDERR_GENERIC │DirectDraw不知道哪出错了<br> DDERR_INVALIDDIRECTDRAWGUID │GUID设备未知<br> DDERR_INVALIDDIRECTDRAWGUID │传递的参数有错(原文明显印错了)<br> DDERR_NODIRECTDRAWHW │没有任何硬件<br> DDERR_OUTOFMEMORY │大胆地猜猜看<br> ────────────────┴───────────────<br> 常量和条件逻辑一起使用的唯一问题是,微软并不保证他们不会完全改变所有的错误代码。不过,在任何情况下你可以相当放心地使用以下代码:<br> if(DirectDrawCreate(...)!=DD_OK )<br> {<br> //error<br> }//end if<br> 而且,所有DirectDraw函数定义了DD_OK,所以你可以放心使用。</p> <p><b>改进界面</b></p> <p> 如上所示,你可以用存储在lpdd中基本IDirectDraw界面调用DirectDrawCreate()。或通过IUnknown界面的方法QueryInterface()设法找到新的界面,把界面升级到最新版本(不管它是怎样的)。QueryInterface()是每个DirectDraw界面的工具。DirectX 6.0版本的最新DirectDraw界面是IDirectDraw4,所以,以下是如何获得一个界面指针。<br> LPDIRECTDRAW lpdd=NULL;//standard DirectDraw 1.0<br> LPDIRECTDRAW lpdd4=NULL;//DirectDraw 6.0 interface 4<br> //first create base IDirectDraw interface<br> if(FAILED(DirectDrawCreate(NULL,&lpdd,NULL)))<br> {<br> //error<br> }//end if<br> //now query for IDirectDraw4<br> if(FAILED(lpdd->QueryInterface(IID_IDirectDraw4,<br> (LPVOID *)&lpdd4)))<br> {<br> //error<br> }//end if<br> 有两点需要注意:<br> ·QueryInterface()调用的方式。<br> ·用来申请创建IDirectDraw4界面的常量是IID_IDirectDraw4。<br> 通常,所有的界面调用都具有以下形式:<br> interface_pointer->method(parms...);<br> 所有的界面标识符用以下形式:<br> IID_IDirectCD<br> 在此,C指代组件:Draw代表DirectDraw,Sound指代DirectSound,Input代表DirectInput,等等。D是个编号,从2到n,表明了你想要的界面。另外,你可以在DDRAW.H文件中找到这些常量。<br> 继续这个例子,你可能有点尴尬,因为你现在有一个IDirectDraw界面,一个IDirectDraw4界面。该怎样做呢?既然你不需要旧的界面,就把旧的界面释放掉,做法如下:<br> lpdd->Release();<br> lpdd=NULL;//set to NULL for safety<br> 从现在开始,所有的方法调用都使用新的IDirectDraw4界面。<br> <b>警告:</b>IDirectDraw4的新功能使一切变得井井有条,这不仅仅是因为IDirectDraw4界面更为先进和完美,而且在许多情况下IDirectDraw4界面需要并返回新的数据结构,而不是DirectX 1.0定义的基本结构。了解这些变化的唯一途径是查看DirectX SDK文献,检查具体的函数所需的或(和)返回的数据结构的版本,然而,这只是一般的警告,本书中,我将给出你要完成的所有例子的正确的结构。<br> 除了在最初的IDirectDraw界面指针(lpdd)中使用QueryInterface()函数外,还有一种可以直接得到IDirectDraw界面的“COM方式”。这种方式更为直接。在COM下,只要你有界面标识符或称IID(代表你想要的界面),你就可以得到任何界面的界面指针。大多数情况下,我个人不喜欢使用低水平的COM函数。<br> 尽管如此,当你接触到DirectMusic时,除了使用低水平的COM函数外没有其他方法。所以,至少在此适当介绍一下这个过程。通过以下代码,你就可以直接创建一个IDirectDraw界面:<br> //first initialize COM,this will load the COM libraries<br> //if they aren't already loaded<br> if(FAILED(Coinitialize(NULL)))<br> {<br> //error<br> }//end if<br> //Create the DirectDraw object by using the<br> //CoCreateInstance() function<br> if(FAILED(CoCreateInstance(&CLSID_DirectDraw,<br> NULL,<br> CLSCTX_ALL,<br> &IID_IDirectDraw4,<br> &lpdd4)))<br> {<br> //error<br> }//end if<br> //now before using the DirectDraw object,it must<br> //be initialized using the initialize method<br> if(FAILED(IDirectDraw4_Initialize(lpdd4,NULL)))<br> {<br> //error<br> }//end if<br> //now that we're done with COM,uninitialize it<br> CoUninitialize();<br> 前面的代码是微软推荐创建DirectDraw对象的方法。但这个技术有些不可靠,也只使用了一个宏:<br> IDirectDraw4_Initialize(lpdd4,NULL);<br> 你可以去掉(1),使用<br> lpdd4->Initialize(NULL);<br> 将其代替,使之全部成为COM。(1)(2)式中的NULL是视频设备,在本例中视频设备是系统设定的驱动器(这就是为什么要填为NULL的原因)。总之,不难明白前面的宏是怎样扩展为代码。我想可能是可以变得容易些。但是,为什么微软不继续利用宏来创建新界面,如:<br> DirectDrawCreate(...);<br> 那不是更好吗?但为什么要问为什么呢?我的观点是你应当自己这样做,这样你的程序代码看起来就会相当统一。<br> 现在,你已经知道怎样创建一个DirectDraw对象,以及怎样获得最新的界面。那我们就进行下一步——设置协作等级。 </p> <p><b>和Windows协同工作</b></p> <p> 众所周知,Windows是一个协作、共享的环境。虽然作为一个程序员,我至今还没有想到怎样使得我的程序与Windows协同工作,但这至少是一种概念。无论如何,DirectX和任何Win32系统相似。最低限度,DirectX准备调用不同资源时必须通知Windows。这样Windows其他的程序就不会请求调用DirectX所控制使用的资源。基本上,DirectX是一个完整的资源体,Windows知道它在做些什么。<br> 在DirectDraw例子中,你唯一需要感兴趣的是视频显示硬件,下面两个模式值得注意:<br> ·全屏模式<br> ·窗体模式<br> 在全屏模式中,DirectDraw的运行很像旧的DOS程序。这就是说,DirectDraw给你的游戏分配了全屏画面,你可以直接对视频硬件进行操作。没有其他的应用程序能够接触到硬件。窗体模式有点不一样。在窗体模式中,DirectDraw更多的与Windows协作,因为其他的应用程序可能需要更新自己的客户窗体区域(对使用者是可见的)。因此,在窗体模式中,你对视频硬件的控制和独占受到了限制。然而,你仍然有足够的权限使用2D和3D加速,这是好事。但另一方面,首先会是上窄下宽...<br> <br> </p> <p> 进入事件模式</p> <p> </p> <p> 巧妙的色彩</p> <p> </p> <p> 创建一个显示画面</p> <p> </p> <p> 总结</p> <p> </p> <p>[<a href="index.html">目录</a>][<a href="g05.htm">上一页</a>][<a href="g07.htm">下一页</a>] </p> </td> </tr> </tbody> </table> </td> </tr></tbody></table><script language="javascript">bottomprint()</script></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -