IDirectDraw接口

创建一个主DirectDraw对象,并使用QueryInterface()方法来得到最新的IDirectDraw7接口,或是直接用DirectDrawCreateEx()函数直接创建一个DirectDraw7的接口。

创建一个DirectDraw 1.0的对象:

LPDIRECTDRAW lpdd = NULL;

DirectDrawCreate(NULL, &lpdd, NULL);

由于DirectX都是基于COM技术(恐怖的东西)的,所以在有了1.0版本的对象后我们可以通过其中重载的QueryInterface方法来查询最新的版本然后释放之前的旧版本:

LPDIRECTDRAW7 lpdd7 = NULL;

lpdd->QueryInterface(IID_IDirectDraw7, (LPVOID *)&lpdd7);

lpdd->Release();

lpdd = NULL;

好了,现在开始,使用lpdd7对象的方法调用都是新的接口IDirectDraw7

以上代码其实并不是安全的,为了增强其安全性,我们还应该对其加上错误处理路径,可以使用微软提供的这两个宏:

FAILED()

SUCCEEDED()

另外,在COM中,其实只要有你需要的接口的接口标识符(IID),你就可以得到任何接口的指针。

CoInitialize(NULL);    

CoCreateInstance(&CLSID_DirectDraw, NULL, CLSCTX_ALL, &IID_IDirectDraw7,  &lpdd7); 

lpdd7->Initialize(NULL);  // NULL表示使用默认的视频设备 

CoUninitialize();

以上就是微软推荐的彻底的使用COM来创建DirectDraw对象的方法。

不过在DirectDraw 7.0版本中有一个更加好的函数可以帮我们完成所有的一切:

DirectDrawCreateEx(NULL, (void **)&lpdd7, IID_IDirectDraw7, NULL);

就是那么简单,一个IDirectDraw7接口就已经创建好了。

总是别忘了要在程序结束前调用Release()。

接下来需要为它设置协作级别,当然,这一切都在接口的方法中。

lpdd7->SetCooperativeLevel(hWnd, DDSCL_NORMAL)  // 窗口模式

或者

lpdd7->SetCooperativeLevel(hWnd, DDSCL_FULLSCREEN      |

                                                           DDSCL_ALLOWMODEX            |

                                                           DDSCL_EXCLUSIVE                  |

                                                           DDSCL_ALLOWREBOOT          |  );  // 全屏模式

很简单。

然后需要设置显示模式:

lpdd7->SetDisplayMode(1024, 768, 16, 0, 0)

其中前面三个参数应该是一目了然的,后面两个0可能让人有些迷茫,其实他们代表的意思是:第一个0表示使用显卡默认的刷新率,或者可以自己设置一个刷新率,比如60。第二个0是一个额外的标记字,比如可以设置为DDSDM_STANDARDVGAMODE。这个参数很少使用,具体可以查DirectX SDK。

时间: 2024-09-13 07:38:35

IDirectDraw接口的相关文章

初次接触:DirectDraw

第六章 初次接触:DirectDraw 本章,你将初次接触DirectX中最重要的组件:DirectDraw.DirectDraw可能是DirectX中最强大的技术,因为其贯穿着2D图形绘制同时其帧缓存层也是DirectX3D的基础.当然,DirectX8.0中DirectDraw已经完全集成到了DirectX3D里面.此外,如果你对DirectDraw深有了解,那将拥有创建任何DOS16/32类型的图形化程序的能力.DirectDraw是理解众多DirectX自身概念的钥匙.所以,听仔细了.

在CB中进行DirectX编程(2)

2.2.3 dx1源程序 2.2.3.1 dx1主要文件的组成为:工程文件(dx1.bpr).窗口文件(main.cpp).头文件(main.h). 2.2.3.2 头文件main.h #ifndef mainH #define mainH //--------------------------------------------------------------------------- #include <Classes.hpp> #include <Controls.hpp&g

DirectDraw读书笔记

DirectDraw对象 DirectDraw对象是DirectDraw应用程序的核心.它是你在建立DirectDraw应用程序时所要创建的第一个对象,再用它来创建所有其它相关的对象.通过调用DirectDrawCreate函数可以创建一个DirectDraw对象.DirectDraw 对象通过IDirectDraw(移动版本仅支持这个),IDirectDraw2,和IDirectDraw4接口为开发者提供其函数性. DirectDrawSurface对象 DirectDrawSurface对象

网吧路由器接口故障的处理方法

  路由器有几个接口,每一个接口对应属性. 当网吧路由器接口出现故障时,需要及时排查解决.在讲述路由器接口故障的处理方法前,小编先简单介绍下路由器CE1接口.路由器CE1接口是将2M,一个E1用作若干个64k及其组合,这就是CE1.CE1的传输线路的带宽是2048k. 假设网吧路由器A和其他厂商的设备B通过CE1链路相连,带宽为2M,配置完成后,发现在B上有大量数据包溢出告警,在A上,当CE1接口上没有流量时,报文传输时延正常,当CE1接口上有流量时,时延达到300多秒,网速较慢. 下面是具体的

一个类如何实现两个接口中同名同参数不同返回值的函数

假设有如下两个接口: public interface IA{    string GetA(string a);}public interface IB{    int GetA(string a);} 他们都要求实现方法GetA,而且传入的参数都是一样的String类型,只是返回值一个是String一个是Int,现在我们要声明一个类X,这个类要同时实现这两个接口: public class X:IA,IB 由于接口中要求的方法的方法名和参数是一样的,所以不可能通过重载的方式来解决,那么我们该

请问下有谁调用过银联代付的接口

问题描述 请问下有谁调用过银联代付的接口 有前辈在吗,我可以贴代码,访问接口,返回值表示参数错误,我可以贴代码 解决方案 如果用java的话,可以参考以下链接的几个文件看看 http://www.chendw.cn/original/205.html 解决方案二: 贴出来吧哥们. 我也想知道

java当中的接口里面的方法全是抽象的而且是public的

问题描述 java当中的接口里面的方法全是抽象的而且是public的 java当中的接口里面的方法全是抽象的而且是public的,为什么没有abstract和public关键词修饰呢 解决方案 接口中不允许private.protected,只能是public,所以语法规定不用写了.同理,接口不能包含函数实现,肯定是abstract的.所以也不用写了. 解决方案二: 14. JAVA 枚举(Enum.类集EnumMap&EnumSet .实现接口.定义抽象方法) ----- 学习笔记

android 如何通过接口向服务器上传视频

问题描述 android 如何通过接口向服务器上传视频 在搞一个小项目 需要用到 新手 没接触过 希望会的朋友提供一个Demo 谢谢! 解决方案 你就找一个上传文件的例子就行了,不管你是视频还是图片,都一样的方式 解决方案二: http://www.cnblogs.com/top5/archive/2013/03/07/2947344.html

数据-android 地铁查询怎么查,接口在哪里找呢

问题描述 android 地铁查询怎么查,接口在哪里找呢 比如查询广州地铁,貌似不提供接口啊,数据或功能都是从哪里来了,我现在在做这方面,接口都没有.. 解决方案 你还是选择跟人家谈谈合作吧,这类接口,不是你随便能得到的 解决方案二: 当然不排除自己做数据库,自己把所有线路采集到你们自己的数据库,自己查 解决方案三: 自己采集数据去啊 .差距不大的. 解决方案四: 可以去聚合数据和易源API看看 解决方案五: 上百度api store查查,应该会有