初次邂逅DirectDraw——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。

 

先写这些,下一次我将写颜色和显示表面的主题

By Lu Jun

80后男,就职于软件行业。习于F*** GFW。人生48%时间陪同电子设备和互联网,美剧迷,高清视频狂热者,游戏菜鸟,长期谷粉,临时果粉,略知摄影。

Leave a comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.