DirectX9 0 入門手冊 1

2021-04-02 07:48:02 字數 4322 閱讀 8078

這一章我先不寫有關dx的東西,我先從最基本的視窗建立講起,然後再慢慢講解使用dx的一些內容.

我寫這個指南的主要目的是為了學習。

我希望自己可以通過寫這個指南更快地學會

directx

下面正式開始吧,先講視窗類,建立視窗,銷毀視窗,視窗訊息處理函式.

·視窗類

wndclass

struct wndclass ;

style

用來定義視窗的行為。如果打算共同使用

gdi和

d3d的話,可以使用

cs_owndc

作為引數。

lpfnwndproc

乙個函式指標,指向與這個視窗類繫結在一起的處理視窗訊息的函式。

cbcl***tra

cbwndextra

為視窗和為分配記憶體空間。很少使用到這兩個引數,一般設為0;

hinstance

應用程式的例項控制代碼。你可以使用

getmodulehandle()

來得到它,也可以從

win32

程式的入口函式

winmain

那裡得到它。當然,你也可以把它設為

null

(不知有什麼用)

hicon

hcursor

hbrbackground

設定預設的圖示、滑鼠、背景顏色。不過在這裡設定這些其實並不怎麼重要,因為我們可以在後面定製自己的渲染方法。

lpszmenuname

用來建立選單

lpszclassname

視窗類的名字。我們可以通過這個名字來建立以這個視窗類為模板的視窗。甚至可以通過這個名字來得到視窗的控制代碼。

設定好視窗類結構的內容後,使用

registerclass(const wndclass *lpwndclass)

函式來註冊它。關閉視窗後可以用

unregisterclass(lpcstr lpclassname, hinstance hinstance)

來撤銷註冊。

·建立視窗

createwindow

hwnd createwindow(

lpctstr lpclassname,

lpctstr lpwindowname,

dword dwstyle,

int x, y,

int nwidth, nheight,

hwnd hwndparent,

hmenu hmenu,

hinstance hinstance,

lpvoid lpparam

);

lpclassname

視窗類的名字。即視窗類結構體中的

lpszclassname

成員。lpwindowname

如果你的應用程式有標題欄,這個就是你標題欄上顯示的內容。

dwstyle

視窗的風格決定你的視窗是否有標題欄、最大最小化按鈕、視窗邊框等屬性。在全屏的模式下,

ws_popup|ws_visible

是常用的設定,因為它產生乙個不帶任何東西的全屏視窗。在視窗的模式下,你可以設定很多視窗的風格,具體可以檢視相關資料,這裡不詳細說明,不過

是一組常用的風格。

x

y

視窗建立的位置。(x,

y)表示視窗的左上角位置。

nwidth

nheight

用來設定視窗的寬度和高度,以畫素為單位。如果你想建立乙個全屏的視窗,使用

getsystemmetrics(**_cxscreen)

和getsystemmetrics(**_cyscreen)

可以得到當前顯示器螢幕的大小

hwndparent

指定這個新建視窗的父視窗。在

d3d應用程式中很少用,一般設為

null

hmenu

選單控制代碼。

hinstance

應用程式的例項控制代碼。你可以使用

getmodulehandle()

來得到它,也可以從

win32

程式的入口函式

winmain

那裡得到它。當然,你也可以把它設為

null

(不知有什麼用)

lpparam

乙個很神秘的引數。除非你知道自己在做什麼,否則還是把它設為

null

吧。·銷毀視窗

destroywindow

銷毀視窗有兩種方法,一種是隱式的,一種是顯式的。我們都知道

windows

作業系統是乙個基於訊息驅動的系統。流動於系統中的訊息使我們的視窗跑起來。在很多軟體開發特別是商業軟體的開發過程中,視窗的產生和銷毀都是交由系統去做的,因為這些不是這類開發的關注所在。但是遊戲開發不一樣,儘管你也可以只向系統傳送一條

wm_destroy

訊息來銷毀視窗,我們還是希望視窗是銷毀的明明白白的。由於視窗的註冊、產生和使用都是由我們親手來做的,那麼當然視窗的銷毀也得由我們親自來做。不過還是得說明一點,使用

wm_destroy

訊息和destroywindow

函式來銷毀視窗在本質上並無太大差別,使用哪種方法可以說是根據個人的愛好吧。

銷毀視窗後是不是就完事了呢?不,還沒有,因為應用程式的訊息佇列裡可能還有沒處理完的訊息,為了徹底的安全,我們還得把那些訊息都處理完。所以結束應用程式的時候,可以使用以下方法:

msg msg;

destroywindow(h_wnd);

while(peekmessage(&msg , null , 0 , 0 , pm_remove))

·視窗訊息處理過程

視窗訊息的處理函式是乙個**函式,什麼是**函式?就是由作業系統負責呼叫的函式。

callback

這個巨集其實就是

__stdcall

,這是一種函式呼叫的方式,在這裡不多說這些了,有興趣的可以參考一些

windows

程式設計的書籍,裡面會有很詳盡的說明。

windows

裡面有很多訊息,這些訊息都跑去**了呢?其實它們都在自己的訊息佇列裡等候。訊息是怎麼從佇列裡出去的呢?就是通過

getmessage

和peekmessage

這兩個函式。那麼訊息從佇列裡出去後又到**了呢?嗯,這時候訊息就正式進入了我們的視窗訊息處理過程,也即是視窗類中

lpfnwndproc

所指定的函式。乙個訊息處理函式有四個引數,下面分別說說:引數1

:hwnd p_hwnd

訊息不都是傳到以視窗類為模板產生的視窗嗎?為什麼還要使用視窗控制代碼來指明視窗呢?別忘了乙個視窗類是可以產生多個視窗的呀,如果乙個應用程式裡面有多個視窗,並且它們之中的一些視窗是共用乙個視窗類的,那麼就得用乙個視窗控制代碼來指明究竟這個訊息是哪個視窗發過來的。引數2

:uint p_msg

這是乙個訊息型別,就是

wm_keydown , wm_close , wm_timer

這些東東。引數3

:wparam p_wparam

這個引數內容就是訊息的主要內容。如果是

wm_keydown

訊息,那麼

p_wparam

就是用來告訴你究竟是哪個鍵被按下。引數4

:lparam p_lparam

這個引數的內容一般是訊息的一些附加內容。

最後說明一下

defwindowproc

的作用。有時候我們把乙個訊息傳到視窗訊息處理函式裡面,但是裡面沒有處理這個訊息的內容。怎麼辦?很容易,交給

defwindowproc

處理就對了。

嗯,這一章就說到這了,下一章介紹如何建立乙個

d3d應用程式。

DirectX9 0 入門手冊 5

第一次寫這種文章,再加上自己也是菜鳥,雖然有部分內容是參考一些書籍及自己翻譯一些英文文章所寫出來的,但我相信文章裡面肯定也還有很多 bug,如果你發現了請告訴我,或者你有什麼想法也可以和我交流,我誠心和志同道合的人成為朋友,我的qq是 61010818 我的郵箱 fowenler 126.com 第...

DirectX9 0 入門手冊 5

第一次寫這種文章,再加上自己也是菜鳥,雖然有部分內容是參考一些書籍及自己翻譯一些英文文章所寫出來的,但我相信文章裡面肯定也還有很多 bug,如果你發現了請告訴我,或者你有什麼想法也可以和我交流,我誠心和志同道合的人成為朋友,我的qq是 61010818 我的郵箱 fowenler 126.com 慘...

vs2008配置Directx 9 0開發環境

1 軟體安裝 vs2008簡體中文版 msdn2008 microsoft directx sdk june 2010 2 dx目錄配置 開啟vs2008 工具 選項 專案和解決方案 vc 目錄 1 引用檔案 c program files x86 microsoft directx sdk jun...