090926(星期六) MFC訊息處理機制

2021-05-06 16:47:48 字數 2785 閱讀 2086

mfc提供的訊息結構

同時mfc定義了下面的兩個主要結構:

afx_msgmap_entry

struct afx_msgmap_entry;

afx_msgmap

struct afx_msgmap;

///afx_msgmap可以得到基類的訊息對映入口位址和得到本身的訊息對映入口位址。

mfc下乙個訊息的處理過程是一般是這樣的。

1、_afxcbtfilterhook截獲訊息(這是乙個鉤子函式)

2、_afxcbtfilterhook把視窗過程設定為afxwndproc。

3、函式afxwndproc接收windows作業系統傳送的訊息。

4、函式afxwndproc呼叫函式afxcallwndproc進行訊息處理。

5、函式afxcallwndproc呼叫cwnd類的方法windowproc進行訊息處理。

如何新增自己的訊息?

乙個標準的訊息處理程式是這個樣子的

在 cwnd 類中預定義了標準 windows 訊息 (wm_***x  wm是window message的縮寫) 的預設處理程式。類庫基於訊息名命名這些處理程式。例如,wm_paint 訊息的處理程式在 cwnd 中被宣告為:

afx_msg void onpaint();

所有能夠進行訊息處理的類都是基於ccmdtarget類的,也就是說ccmdtarget類是所有可以進行訊息處理類的父類。ccmdtarget類是mfc處理命令訊息的基礎和核心。

若要重寫基類中定義的處理程式,只需在派生類中定義乙個具有相同原型的函式,並建立此處理程式的訊息對映項。我們通過classwizard可以建立大多數視窗訊息或自定義的訊息,通過classwizard可以自動建立訊息對映,和訊息處理函式的框架,我們只需要把我們要做的事情填空,新增你要做的事情到處理函式。這個非常簡單,就不細說了。但是也許我們需要新增一些classwizard不支援的視窗訊息或自定義訊息,那麼就需要我們親自動手建立訊息對映和訊息處理的框架,通常步驟如下:

第一步:定義訊息。microsoft推薦使用者自定義訊息至少是wm_user+100,因為很多新控制項也要使用wm_user訊息。

#define wm_mymessage (wm_user + 100)

第二步:實現訊息處理函式。該函式使用wpram和lparam引數並返回lpesult。

lpesult cmainframe::onmymessage(wparam wparam, lparam lparam)

第三步:在類標頭檔案的afx_msg塊中說明訊息處理函式,mfc使用巨集進行了簡化,其實質就是類函式的宣告:

// }afx_msg

declare_message_map()

第四步:在使用者類的訊息塊中,使用on_message巨集指令將訊息對映到訊息處理函式中,這個操作就是將乙個訊息及其對應的處理函式加入到訊息鍊錶的data中來。

on_message( wm_mymessage, onmymessage )

可以看出,使用者自定義的訊息和我們通過classwizard新增的訊息一樣,都是利用了on_message巨集,建立的訊息對映。

其實訊息類別可以分成多種,上面說的只是其中之一。有三種主要的訊息類別:(以下部分摘自msdn)

1、windows 訊息

此類訊息主要包括以字首 wm_ 開頭的訊息,wm_command 除外。windows 訊息由視窗和檢視處理。此類訊息往往帶有用於確定如何處理訊息的引數。

2、控制項通知

此類訊息包括從控制項和其他子視窗傳送到其父視窗的 wm_command 通知訊息。例如,當使用者在編輯控制項 (edit control) 中執行可能更改文字的操作後,該編輯控制項 (edit control) 將向其父級傳送包含en_change 控制項通知**的 wm_command 訊息。該訊息的視窗處理程式以某種適當的方式響應此通知訊息,例如在控制項中檢索該文字。

框架像傳送其他 wm_ 訊息一樣傳送控制項通知訊息。但是有乙個例外的情況,即當使用者單擊按鈕時由按鈕傳送的 bn_clicked 控制項通知訊息。該訊息被作為命令訊息特別處理,並像其他命令一樣傳送。

3、命令訊息

此類訊息包括使用者介面物件(選單、工具欄按鈕和快捷鍵)發出的 wm_command 通知訊息。框架處理命令的方式與處理其他訊息不同,可以使用更多種類的物件處理命令。

windows 訊息和控制項通知訊息由視窗來處理(視窗是從 cwnd 類派生的類的物件)。包括 cframewnd、cmdiframewnd、cmdichildwnd、cview、cdialog 以及從這些基類派生的您自己的類。這些物件封裝了hwnd——windows 視窗的控制代碼。

命令訊息可以由範圍更廣的物件(文件、文件模板以及應用程式物件本身)處理,而不僅僅由視窗和檢視處理。當某一命令直接影響到某個特定物件時,應當讓該物件處理此命令。例如,「檔案」選單中的「開啟」命令在邏輯上與應用程式相關聯:該應用程式接收到此命令時會開啟指定的文件。因此「開啟」命令的處理程式是應用程式類的成員函式。

命令訊息我們比較常見的便是選單項和工具條了,大家可以看到他的訊息對映巨集和視窗訊息不太一樣,一般的形式是這樣的

on_command(id,memberfxn)

第乙個引數是命令id,乙個id號對應乙個訊息處理,當然你可以讓多個id共用乙個處理函式。常見的應用例如:選單項開啟文件的id和工具條按鈕開啟文件的id同時使用乙個處理函式,或者直接將它們的id設成相同的。

還有一種訊息叫通知訊息。例如樹型控制項的等一些複雜的控制項在單擊後需要傳遞更多的資訊,例如游標的位置和當前項的乙個結構,所以mfc為控制項的每個通知訊息也定義了乙個巨集,它長成了這個樣子:

on_control(en_change,id,memberfxn)

還有很多種訊息存在於mfc,巨集定義有區別

2020 2 29工作計畫(星期六)

1.與萬科長開會報告應用運維統括推進事項 總結 1.會議中如何聽明白領導在說什麼,並做重要的紀要。2.你如何在會議,將你想說的事情,對領導表達清楚。3.會後如何將你在會中聽到的內容精準高效傳達給相關人。2.晚間與老婆對話,與其爭吵 反思 1.不管多不願意聽的話,先聽她講完,然後再表達你的想法 2.遇...

2023年3月13日星期六

erp?jquery?delphi?wbs圖?msf 開發模型?smtp是?acpi demo?網上查查 arm是什麼東東?了解下 網上去了解下 win32 api 是什麼玩意兒?如何將 pdf格式轉化為 doc格式?c 無錯化程式設計 查查,拜讀一下 ccie?ccnp?mfc?了解用人單位的需求...

2020 12 05星期六 (本週覆盤)

r星校長 這週讓我覺得壓力很大的事情 就是還沒有學會做專案,開局非常困難,談好的這個專案第二天,禮拜二,就交到我的手上,自己對於工作上碰到的問題沒有及時去問同事。導致周二,週三,周四,自已一直在焦慮當中,心態出了問題,也有些小九九在腦海裡翻騰,作怪 作妖 這周最大的收穫 想清楚了自己來公司到底是來幹...