窗體對訊息的響應

2021-03-31 12:12:22 字數 1100 閱讀 6417

對於滑鼠的狀態,我專門用了乙個全域性的變數存放,變數結構體如下:

static struct mouse_event_struct

;而按鍵訊息,則直接從訊息迴圈的 wm_char 獲取。因為我打算做的rpg網遊對鍵盤的實時狀態並不關心,只需要知道曾經按下過什麼鍵即可。wm_char 從 wndproc 過程獲取 keycode, 傳遞給 cgame,再由 cgame 傳遞給  cdesktop 當前的焦點控制項 。

然後開始視窗對滑鼠的相應問題。

視窗自身有屬性: i**ove(); 這個屬性決定視窗是否可以移動,並響應滑鼠的拖拽。當它返回為true 的時候,窗體進行滑鼠座標判斷。

if (窗體是標準矩形)

else

關於拖動響應區

看下圖:

可以看到乙個窗體,標題欄寫著:除錯狀態。如果我定義滑鼠在紅色矩形之內響應拖拽動作,則需要判斷滑鼠座標是否在這個矩形之內並且滑鼠左鍵是否按下狀態。

這個紅色矩形是由cskin讀取**的時候定義的。它的 left, top, right 分別是對應於窗體實際 left、top、right的乙個偏移量,而height則是乙個固定值,表示矩形的高度。

首先由cdesktop傳入乙個響應訊息結構的變數指標,再由響應到滑鼠、鍵盤資訊的窗體返回,cdesktop再根據返回的資訊處理掉一些操作(焦點變換,座標變換等等),再將最終訊息結果返回給cgame處理遊戲邏輯事件。

cdesktop關心的資訊如下:

響應的視窗:(如果不是當前視窗,設定為當前視窗, 如果為null, 則忽略.)

響應的控制項:(如果不是當前啟用控制項, 設定為啟用控制項, 如果為null, 則忽略.)

響應的事件id:(例如 m_click, m_lb***own, m_rb***own..等)

響應的處理函式: 乙個函式指標

我的想法是用函式指標去處理響應的訊息。每個cwin都儲存乙個自身的訊息處理函式指標位址,如果不是空位址,則接收到響應之後呼叫其自身的響應處理函式去執行遊戲的邏輯事件。把遊戲的邏輯事件處理函式都放在乙個類裡面,宣告為static,供cgame呼叫,這樣看起來會比較清晰。

我想這種做法應該比較貼近windows的事件驅動機制,有點**函式的味道。

MFC對訊息處理的封裝

1 採用mfc的巨集將訊息對映到c 成員函式的方式中以避免產生巨集大的虛函式分配表 2 cwintrhead類成員函式run 的run方法呼叫了getmessage translatemessage dispatchmessage 3 訊息處理幾乎所有的視窗物件使用afxwndproc 視窗處理函式...

MFC對訊息處理的封裝

1 採用mfc的巨集將訊息對映到c 成員函式的方式中以避免產生巨集大的虛函式分配表 2 cwintrhead類成員函式run 的run方法呼叫了getmessage translatemessage dispatchmessage 3 訊息處理幾乎所有的視窗物件使用afxwndproc 視窗處理函式...

我對訊息佇列的理解

用訊息佇列進行程序間的通訊,需要記住兩個結構,4個函式 第乙個結構 struct ipc perm 此結構主要用於用於 許可權。第二個結構 struct msgid ds 四個函式 int msgget key t key,int flag 建立乙個訊息佇列結構 int msgctl int msg...