MFC訊息對映機制

2021-07-10 07:35:41 字數 3221 閱讀 3030

訊息機制看了很多遍,每次看了忘,以下寫的很好,**如下。

訊息對映可以說是mfc框架的精華部分,但就是一層窗戶紙,捅不破,你就看不清楚裡面是什麼,但是只要你看到,伸手捅,你會覺得就這麼簡單。閒話少說。

首先要問下你,對win32下程式設計是否清楚,win32下如果要建立乙個視窗的步驟你了解嗎?

mfc視窗建立的步驟和win32建立視窗的步驟是相同的,而且,注意,是確定的。

我先來說下win32下建立視窗程式的方法

1.視窗類建立wndclass,2.視窗建立,hwnd,3.視窗顯示,showwind(),4.視窗更新,updatewind()5.進入訊息迴圈。在這5步裡面。

第一步,建立視窗類的時候,有乙個引數,是設定訊息處理函式的名稱的(這麼說不專業,應該叫訊息處理函式指標),具體是哪個,你找下,那個引數賦值就是wndproc,就是你在第5步,進入訊息迴圈的時候呼叫的函式。這個函式是程式設計師實現程式功能的地方。但是這個函式也一樣的是乙個格式很確定的函式。都是switch(umsg)case xx:。。。。。。

現在你了解了嗎?win32下建立視窗程式,有兩個地方是步驟確定的。第乙個是建立顯示窗體,第二個是訊息迴圈中呼叫的處理函式wndproc。既然是很確定的,那麼,每次做乙個程式都要做相同的步驟,如果你每次要建立乙個win32的窗體程式的話都要搞這麼多沒有意義的重複的工作,是不是很不划算?

於是就有了mfc視窗程式,它將所有重複的步驟都給事先實現了,不需要你再次重新做一遍,這樣你在做程式的時候,就不用再去操心那些,沒有質量的,要重複來重複去的工作。專心搞好自己要實現的功能就好。

那麼現在要弄明白一點,mfc是怎麼幫我們實現了這些重複步驟的?因為你沒有問視窗建立與顯示mfc是怎麼搞的,所以我就不回答1-5步mfc的工作了,不過這個,也很容易想到,就是搞幾個類,將建立視窗的函式寫進去,然後使用的時候調出來就行了。

我說下訊息對映和訊息處理函式的問題。

剛才我說過,建立顯示視窗後,有訊息迴圈呼叫訊息處理函式wndproc,而wndproc是乙個格式固定的函式,所以,如果我們把這個wndproc函式也一樣的搞成乙個固定的,跟具體訊息無關的函式的話,是不是它就也成了乙個可以直接搞成我們(程式設計師)不用操心處理的東西了?好現在的目標就是,把訊息處理函式做成乙個與具體訊息無關的函式。怎麼做,看下wndproc的函式格式,switch(umsg)//umsg就是具體訊息

break;

case wm_xx:// 具體訊息

break;

case wm_***x:// 具體訊息

break;

。。。。。。。

}這個訊息處理函式沒寫全啊,自己找個全的對照。

現在的問題是,我們改造上面的這個函式讓它可以和具體訊息無關。

看到這段**,應該可以理解,在訊息迴圈呼叫的訊息函式時,進行的處理是,將從訊息迴圈中得到的具體訊息放進switch case語句中,進行分析,如果是case中的某個訊息,就呼叫相應的功能實現**,進行處理。也就是說wndproc幹了兩件事,第一判斷是哪乙個訊息,第二,呼叫相應訊息處理**(功能實現)。那麼自然地,我們可以想到,將訊息處理**(功能實現)拿出來,單獨寫乙個函式,呼叫的時候寫一句呼叫xx函式就可以了。這樣最起碼整個wndproc函式就會看起來乾淨很多,簡單清晰很多。

這是我第一次碰到這個問題的時候想到的。但是這仍然是與具體訊息有關的,而且有點不方便因為你如果要新增,刪除某個訊息的處理的話,那麼你就要,第一,進入winproc中,找到相應case,刪掉case,然後,找到相應的,你從wndproc中拿出來的訊息處理函式,首先這很麻煩,第二,很容易出錯。

那麼mfc,是怎麼處理我們的問題的呢?它首先定義了乙個結構,struct ,這個struct裡面放了兩個東西,1,訊息,2,訊息所對應的處理函式的指標(函式名),這個函式就是我們從switch case中拿出來,並寫成的函式,它處理這個struct的第乙個引數,具體訊息,所需要實現的功能。

這是第一步,定義乙個訊息,與訊息處理函式指標的結構

第二步,它定義了訊息對映表。(到你想看得東西了吧),什麼是訊息對映表?簡單說,就是乙個陣列,這個陣列的型別是第一步所定義的結構,所以這個陣列裡面每乙個元素,都包含了兩個變數,訊息,訊息對應的函式。

搞完這兩部,下面要對winproc函式進行改造了。原來用switch case,現在不用了,我們用乙個for迴圈,

for(int i = 0; i < 訊息對映表陣列的長度;i ++)

}現在明白了嗎?訊息對映表,就是乙個陣列,陣列裡面的元素是乙個訊息結構,這個結構裡面放著具體的訊息與訊息處理函式的指標。

以訊息對映表為基礎,我們可以將winproc函式變成與具體訊息無關的函式,而且,我們如果要新增,刪除新的訊息,那麼只要修改訊息對映表,和你下面寫的訊息處理函式就可以了。清晰明了,簡單省事。

#include #include lresult callback winsunproc(

hwnd hwnd, // handle to window

uint umsg, // message identifier

wparam wparam, // first message parameter

lparam lparam // second message parameter

);int winapi winmain(

hinstance hinstance, // handle to current instance

hinstance hprevinstance, // handle to previous instance

lpstr lpcmdline, // command line

int ncmdshow // show state

) return 0;

}lresult callback winsunproc(

hwnd hwnd, // handle to window

uint umsg, // message identifier

wparam wparam, // first message parameter

lparam lparam // second message parameter

) break;

case wm_destroy:

postquitmessage(0);

break;

default:

return defwindowproc(hwnd,umsg,wparam,lparam);

} return 0;

}

MFC訊息對映機制

一 mfc中採用的這種訊息處理機制成為 mfc訊息對映機制 乙個mfc訊息響應函式在程式中有三處相關資訊 函式原型,函式實現,關聯訊息和訊息響應函式的巨集。函式原型 標頭檔案cdrawview 兩個afx msg注釋巨集之間 訊息響應函式原型的宣告 afx msg void onlbuttondow...

MFC訊息對映機制

win32的訊息迴圈機制是 產生的訊息交由作業系統,將其放到應用程式的訊息佇列中。應用程式通過getmessage函式從這個佇列中取出 一條訊息 由dispatchmessage函式把訊息又交給作業系統,作業系統呼叫視窗過程函式wndproc進行處理。該函式利用switch case結構來判斷並響應...

MFC訊息對映機制

mfc的設計者們在設計mfc時,緊緊把握乙個目標,那就是盡可能使得mfc的 要小,速度盡可能快。為了這個目標,他們使用了許多技巧,其中很多技巧體現在巨集的運用上,實現mfc的訊息對映的機制就是其中之一。同mfc訊息對映機制有關的巨集有下面幾個 declare message map 巨集 begin...