乙個簡單的ddraw應用程式
上次談到ddraw是乙個元件。元件由介面組成。
ddraw總共由五個介面組成:
)idirectdraw:使用ddraw必須建立的主介面物件。
idirectdrawsu***ce:建立、控制和顯示的實際顯示表面。分主顯示表面和從顯示表面
idirectdrawpalette:建立、載入和控制調色盤,以及將它關聯到顯示表面。
idirectdrawclipper:剪下ddraw光柵和點陣圖操作到一些可見顯示表面的子集。
這些介面怎麼配合起來成為乙個ddraw應用程式的:
2. 使用idirectdrawsu***ce7介面至少建立 乙個主顯示表面用以繪圖。(如果每個畫素為8位或更少我們會用到乙個調色盤)
3. 用idirectdrawpalette介面建立 乙個調色盤。(注意如果畫素高於8位,如16位、24位,32位,沒有調色盤,現在主流2d遊戲多數是16色)
4. 如果ddraw應用程式要使用視窗,或者要減少位圖以免溢位ddraw顯示表面的可見邊界,我們至少需要合建乙個剪裁器並將其尺寸設定為可見視窗的範圍。如下圖
5. 最後就是在表面上繪圖了。
下面開始介紹乙個最簡單的ddraw應用程式:
建立ddraw物件:
用來directdrawcreateex來直接建立ddraw物件,宣告如下:
hresult winapi directdrawcreateex(
lpvoid *lplpdd, // 這是返回的介面
refiid iid, // 請求介面相對應的id
iunknown far *punkouter // 總是高為null
);
設定協作級別:用setcooperativelevel來設定ddraw的協作級別。宣告如下:
hresult setcooperativelevel(hwnd hwnd,dwflags控制標誌,它直接影響ddraw與windows之間協作方式。//視窗控制代碼,一般使用主視窗控制代碼
dword dwflags);
//控制標誌
setcooperativelevel()的控制標記
值
描述
ddscl_allowmodex
允許使用mode x (320x200,240,400) 顯示模式.公當設定ddscl_exclusive和ddscl_fullscreen時生效
ddscl_allowreboot
允許在排他(全屏)模式下檢測到ctrl+alt+del
ddscl_exclusive
請求排他級別。此標記需要與ddscl_fullscreen標記同時作用
ddscl_fpusetup
表示呼叫 程式希望配置fpu以得到最佳的direct3d效能(禁用度和異常),這樣direct3d不需要每次都明確地fpu。更多資訊,請在directx sdk中查詢「ddraw協作級別和fpu數度」
ddscl_fullscreen
表示使用全屏模式。其他應用程式的gdi將不能寫屏,此標記必須與ddscl_exclusive標記同時使用。
ddscl_multithreaded
請求對於多執行緒安全的ddraw行為。
ddscl_normal
表示應用程式是乙個通常的windows應用程式。這個標記不能與ddscl_allowmodex, ddscl_exclusive, 或 ddscl_fullscreen標記一起使用。
ddscl_nowindowchanges
表示不允許ddraw啟用時最小化或還原應用程式視窗。
上面寫了一大堆標記,其實大多數情況是下面兩種情況。
全屏模式:ddscl_fpusetup | ddscl_allowmodex | ddscl_exclusive | ddscl_allowreboot
視窗模式:ddscl_normal
下面例子:
因為是用於學習,沒有把框架搞得太複雜,全寫在乙個cpp裡了。
關於怎麼寫乙個gui應用程式,可以檢視《乙個簡單的windows gui應用程式》
#define initguid
#include#include lresult callback wndproc(hwnd, uint, wparam, lparam);
hwnd main_window_handle = null; // 主視窗控制代碼
lpdirectdraw7 lpdd = null; // ddraw 物件
int game_init(void *parms = null, int num_parms = 0)
/int game_shutdown()
return 1;
}int winapi winmain(hinstance hinstance,
hinstance hprevinstance,
lpstr lpcmdline,
int nshowcmd)
game_init();
while(true)
}game_shutdown();
return msg.wparam;
}lresult callback wndproc(hwnd hwnd,
uint message,
wparam wparam,
lparam lparam)
break;
case wm_destroy:
::postquitmessage(0);
break;
default:
return ::defwindowproc(hwnd,message,wparam,lparam);
}return 0;
}
程式執行效果:
學習筆記 乙個簡單的引導扇區
今天開始第一課 說明 我試驗環境linux bochs 搭建環境也費了點神,哎 十分鐘完成的作業系統 實質是乙個引導扇區 在最開始看的時候還是慢困難的,在完成彙編課程設計後其實就簡單了很多,有興趣的可以看看我課程設計中的相關資料,或者了解一下作業系統的啟動過程,這樣頭腦要清晰很多 下面的 中的cle...
乙個簡單的verlig程式 乙個簡單C程式的介紹
我們前面學了c語言的一些理論知識,今天通過乙個簡單的程式先來看一看c語言程式是什麼樣子。然後再對程式中的 進行介紹。這個語句的功能是進行有關的預處理操作。include稱為檔案包含命令,後面尖括號的內容稱為標頭檔案或首檔案。此處指包含stdio.h系統標頭檔案,在下面主函式中使用的printf 函式...
WindowsApi學習筆記 建立乙個簡單的視窗
include lresult callback mainwndproc hwnd,uint,wparam,lparam 視窗函式的函式原型 int apientry winmain apientry是 stdcall的巨集定義 hinstance hinstance,本模組的例項控制代碼 hins...