當前位置:編程學習大全網 - 源碼下載 - 簡述生成壹個MFC應用程序的步驟?消息映射如何實現?其和消息處理函數間的關系是什麽?

簡述生成壹個MFC應用程序的步驟?消息映射如何實現?其和消息處理函數間的關系是什麽?

剛學完這段,消息映射可以說是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就是具體消息

{

case WM_KEYDOWN:// 具體消息——按下鍵

{

功能實現

}

break;

case WM_xx:// 具體消息

{

功能實現

}

break;

case WM_xxxx:// 具體消息

{

功能實現

}

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 ++)

{

if(uMsg = =消息映射表第i個元素的第壹個變量)

{

調用消息映射表第i個元素第二個變量所指向的函數;

break;

}

}

現在明白了嗎?消息映射表,就是壹個數組,數組裏面的元素是壹個消息結構,這個結構裏面放著具體的消息與消息處理函數的指針。

以消息映射表為基礎,我們可以將winproc函數變成與具體消息無關的函數,而且,我們如果要添加,刪除新的消息,那麽只要修改消息映射表,和妳下面寫的消息處理函數就可以了。清晰明了,簡單省事。

  • 上一篇:通達信漲不漲全看量公式源碼
  • 下一篇:小豬不是愚蠢的童話
  • copyright 2024編程學習大全網