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。
最後更新:2017-04-03 14:54:08