DDraw筆記 乙個簡單的DDraw應用程式

2021-05-27 17:30:50 字數 3564 閱讀 1654

乙個簡單的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,     

//視窗控制代碼,一般使用主視窗控制代碼

dword dwflags);

//控制標誌

dwflags控制標誌,它直接影響ddraw與windows之間協作方式。

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...