MFC事件與訊息

2021-06-24 18:10:59 字數 3856 閱讀 2567

1、首先,什麼是訊息,什麼是事件,兩者是一樣的嗎?

顯然,兩者是有區別的,舉個簡單的例子來說:

獵人在山中布置了乙個陷阱,一頭野豬掉進陷阱中了。

這裡的「野豬掉進陷阱」就是乙個事件,但是這個事件發生時,獵人並不一定知道(獵人不可能一直盯著某個陷阱);

如果獵人想要在獵物掉入陷阱中時馬上知道,該這麼做呢?

可以這樣做(可能有些不科學,勿深究):

在陷阱上布置乙個鈴鐺,當獵物掉入陷阱時,鈴鐺響。

這樣,有獵物掉進陷阱中時,獵人就可以及時的知道了,獵人知道後就可以做出相應的處理了。

這裡的「鈴鐺響」就是乙個訊息。

總結以下幾點:

(1)事件觸發訊息;

(2)事件發生了,不一定有訊息;

(3)有訊息傳來,一般肯定有事件發生;

2、我們開啟類的屬性視窗,其中就有事件和屬性:

這是事件:

這是訊息:

3、新增訊息:

4、新增乙個訊息會在三個地方新增**:

(1)標頭檔案類宣告中的訊息函式宣告:

afx_msg void onlbuttondblclk(uint nflags, cpoint point);

(2)訊息對映中新增訊息:

begin_message_map(cmfc_testdlg, cdialogex)

on_wm_syscommand()

on_wm_paint()

on_wm_querydragicon()

on_wm_lbuttondblclk()

end_message_map()

(3)函式實現:

void cmfc_testdlg::onlbuttondblclk(uint nflags, cpoint point)

5、如果需要手動刪除訊息,需要刪除以上三處的**;當然,也可以在類的屬性視窗中的訊息選項中刪除,如下:

注:這樣delete後,只是將那三處對應的**注釋掉。

6、接下來,我們來看看訊息對映:

begin_message_map(cmfc_testdlg, cdialogex)

on_wm_syscommand()

on_wm_paint()

on_wm_querydragicon()

on_wm_lbuttondblclk()

end_message_map()

關於兩個巨集的定義:

#define begin_message_map(theclass, baseclass) \

ptm_warning_disable \

const afx_msgmap* theclass::getmessagemap() const \

\const afx_msgmap* pascal theclass::getthismessagemap() \

\ }; \

static const afx_msgmap messagemap = \

; \return &messagemap; \

} \

ptm_warning_restore

我們可以替換程序式**中:

//#define begin_message_map(theclass, baseclass) 

ptm_warning_disable

const afx_msgmap* cmfc_testdlg::getmessagemap() const

const afx_msgmap* pascal cmfc_testdlg::getthismessagemap()

}; static const afx_msgmap messagemap =

; return &messagemap;

}

ptm_warning_restore

注:theclass和baseclass即為cmfc_testdlg和cdialogex

//#define begin_message_map(theclass, baseclass) 

ptm_warning_disable

const afx_msgmap* cmfc_testdlg::getmessagemap() const

const afx_msgmap* pascal cmfc_testdlg::getthismessagemap()

}; static const afx_msgmap messagemap =

; return &messagemap;

}

ptm_warning_restore

7、下面來看看那四個訊息的定義:

on_wm_syscommand()

on_wm_paint()

on_wm_querydragicon()

on_wm_lbuttondblclk()

#define on_wm_syscommand() \

,

#define on_wm_paint() \

,

#define on_wm_querydragicon() \

,

#define on_wm_lbuttondblclk() \

,

8、替換如下:

const afx_msgmap* pascal cmfc_testdlg::getthismessagemap() 

, ,

, ,

//end_message_map()

//#define end_message_map()

}; static const afx_msgmap messagemap =

; return &messagemap;

}

9、ok,最終替換成這樣:

ptm_warning_disable 

const afx_msgmap* cmfc_testdlg::getmessagemap() const

const afx_msgmap* pascal cmfc_testdlg::getthismessagemap()

, ,

, ,

}; static const afx_msgmap messagemap =

; return &messagemap;

}

ptm_warning_restore

10、顯然,這些訊息放在乙個陣列中,以為結束。

11、待續

訊息與事件 Message Event

這兩個的區別我實在是搞得不太清楚,google了一下,也不是太明白,先把各個地方的都貼點過來,個人感覺訊息攜帶有資料,可以從訊息的結構體中獲得一些資料,但是事件就沒有這個功能了 事件就是 當.的時候 訊息就是 嗨!你該幹.了 我們一般都是在 當.的時候 幹 0 或者 1 2 也可以 這件事情我不想理...

WinForm事件與訊息

windows下應用程式的執行是通過訊息驅動的。所有的外部事件,如鍵盤輸入 滑鼠移動 按動滑鼠都由os系統轉換成相應的 訊息 進入到應用程式的訊息佇列中,由應用程式引擎輪詢處理。在c 中,訊息被應用程式的工作引擎通過輪詢等方式遍歷獲取並按照訊息的型別逐個分發到對應的元件 例如窗體 按鈕等 最後呼叫對...

MFC訊息對映與處理

今天我們主要了解一下mfc程式的訊息對映 mfc程式中訊息的種類 a 視窗訊息 window message 這種訊息一般與視窗的內部運作有關,如建立視窗 繪製視窗和銷毀視窗等。通常,訊息是從系統傳送到視窗,或從視窗傳送到視窗。形式通常為ww 不包括ww command 如 wm create,告訴...