第七章 Windows 遊戲輸入訊息處理

2021-08-07 16:12:04 字數 2927 閱讀 6898

虛擬鍵碼與鍵盤訊息

● 在windows中, 所有鍵盤的按鍵都被定義為一組通用的「虛擬鍵碼」也就是說在windows系統下所有按鍵都會被視為虛擬鍵(包括滑鼠鍵在內),

而每乙個虛擬鍵都有其對應的乙個虛擬鍵碼。

windows系統是乙個訊息驅動的環境,一旦我們在鍵盤上進行輸入操作, 那麼系統便會接收其對應的鍵盤訊息。

當某乙個按鍵被按下時, 伴隨著這個操作所產生的是以 虛擬鍵碼型別傳送的wm_keydownwm_keyup訊息。 當程式接收到這些訊息時。便可由虛擬鍵碼的資訊來得知是哪個按鍵被按下。

此外,wm_char則是當按下的按鍵為定義於ascii中的可列印字元時, 便發出此字元資訊。

鍵盤訊息處理

● 在windows中鍵盤訊息同樣是在訊息處理函式中間來處理的。

wm_keydownwm_keyup訊息 這兩種訊息必須是成對發生的。 但我們往往在程式中對wm_keydown訊息進行處理,而無視wm_keyup訊息。

● 視窗過程函式有兩個引數與訊息輸出有關, 它們就是——wparamlparam.

lresult callback wndproc

( _in_ hwnd hwnd,

_in_ uint umsg,

_in_ wparam wparam,

_in_ lparam lparam

);

當鍵盤訊息觸發時,wparam的值 為按下按鍵的虛擬鍵碼, 在windows中所定義虛擬鍵碼是以「vk_」開頭的。

lparam則是儲存按鍵的相關狀態資訊,因此, 如果我們的程式要對鍵盤輸入操作進行處理,就可以用乙個switch語句來判斷wparam中的內容並進行處理。

windows 滑鼠訊息處理

● 處理滑鼠訊息的方法同樣是在訊息處理函式中加入要處理的滑鼠訊息型別,

當滑鼠訊息發生時,輸入的引數wparam 與 lparam 就儲存了滑鼠狀態的相關資訊。

lparam引數

lparam引數的值可分為高位位元組與低位位元組兩個部分,其中高位部分儲存的是滑鼠游標所在的x座標值,低位位元組部分儲存的則是滑鼠游標所在的y座標值。

可以使用下面兩個巨集來取得滑鼠的座標值:

word loword

( dword dwvalue //返回滑鼠游標所在的x座標值

)

word hiword

( dword dwvalue //返回滑鼠游標所在的y座標值

)

注意:  這兩個函式所返回的滑鼠游標位置的座標是相對於內部視窗左上點座標的。
wparam 引數wparam引數的值記錄著滑鼠按鍵及鍵盤ctrl鍵 與shift的狀態資訊。

如果某個滑鼠訊息發生時,要測試滑鼠左鍵是否也被按下, 就把`wparam` 拿著和 某種訊息(邏輯與)一下。
● 我們就是這樣利用wparam引數和測試標誌來測試滑鼠鍵是否被按下的。

當按鍵被按下時, 條件式 「wparam&mk_lbutton」 所傳回的結果就會為 true。當然, 若訊息函式接收到 「wm_lbuttondown」 訊息時, 同樣也可以知道滑鼠鍵被按下而不必再去額外做這樣的測試

滾輪訊息

滑鼠滾輪轉動訊息wm_mousewheel, 當滑鼠滾輪轉動訊息發生時,lparam引數中的值同樣是記錄游標所在的位置的, 而wparam引數則分為 高位位元組和低位位元組兩部分,

低位位元組部分跟前面一樣儲存滑鼠鍵與shift、 ctrl鍵的狀態資訊的,而高位位元組部分的值會是 120 或 -120120 表示滑鼠滾輪向前轉動, -120 表示滑鼠滾輪向後轉動。

這裡的wparam高位組值與低位組值所在的函式同樣是hiword()loword()

hiword(wparam); // 高位組值,  值為 120或 -120

loword(wparam); // 低位組值, 滑鼠鍵以及 shift 和 ctrl 鍵的狀態資訊

python第七章 python教程(第七章)

字典和集合 字典是python中唯一,乙個對映型別 如何建立乙個字典,如下 dict dict 滲透 網路安全 怎麼理解字典呢?現實生活中的字典可以通過首字母進行查詢要查詢的漢子,python也可以這樣理解,通過 前的元素查詢到冒號後的元素。為什麼說字典是唯一乙個對映型別呢?看圖。對映型別區別與序列...

第七章 函式

1.ansi c 允許函式原型的使用,函式宣告提供給編譯器和之後的呼叫函式返回值型別,引數型別和數量的資訊,而k c用單獨的列表給出引數的型別,編譯器只記住函式的返回值型別,但不儲存函式的引數數量和型別 2.沒有return語句的函式,隱式的返回 3.函式的原型可以單獨放於乙個標頭檔案中,一定要具有...

第七章總結

7.2.2畫直線 畫直線使用cdc類的lineto 函式兩個過載版本 bool lineto int x,int y bool lineto point point 引數x y或point指定直線的終點位置,此函式從當前點到指定的終點之間畫一條直線,當前點包括在直線上,而終點不包括在直線上。如果畫線...