首先弄清楚兩點:
(1)誰要傳送這個訊息(2)誰要接受這個訊息。
用乙個簡單的例子來說明。物件a向b(也可以就是a到a)傳送訊息。
1 傳送訊息
首先在a的標頭檔案中定義這個訊息:
#define wm_usermessage wm_user+30
所有自定義訊息都是以wm_user訊息為基礎加上乙個任意的自然數來表示的。a是向外傳送訊息的物件,因此在a的某個方法(函式)裡就會呼叫用來發訊息的函式b::sendmessage()/b::postmessage(),因為是b接受訊息,因此是如上的形式。
2 接受訊息
物件接受乙個訊息,應該有三部分:在標頭檔案中有該訊息的處理函式的原型;在實現檔案中有接受訊息對映的巨集;以及該訊息的處理函式的具體實現。
2.1 標頭檔案中加上自定義訊息的處理函式原型
在declare_message_map()語句之前,一對afx_msg之間加上如下形式的函式原型:
afx_msg lresult onprocname( wparam wparam, lparam lparam);
對win32來說,wparam, lparam是傳遞訊息最常用的手段。
2.2 在實現檔案中加上接受訊息對映的巨集
在cpp檔案裡,begin_message_map語句之後,在一對afx_msg_map之間,增加 如下形式的**:
on_message(wm_usermessage, onprocname)
上面是不用分號結尾的。
2.3 在實現檔案中給出訊息處理函式的具體實現。
這樣就ok了!
所有windows應用程式都是訊息驅動的,訊息處理是所有windows應用程式的核心部分。當使用者單擊滑鼠或改變視窗大小時,都將給適當的視窗傳送訊息。每個訊息都對應於某個特定的事件。
一、訊息處理和訊息對映的概念
1、訊息
訊息主要指由使用者操作而向應用程式發出的資訊,也包括作業系統內部產生的訊息。例如,單擊滑鼠左按鈕,windows將產wm_lbuttondown訊息,而釋放滑鼠左按鈕將產生wm_lbuttonup訊息,按下鍵盤上的字母鍵,將產生wm_char訊息。
2、windows訊息組成結構
windows訊息由訊息號和引數組成:
訊息號windows作業系統通過32整數標識一條windows訊息,稱為訊息號。windows訊息號具有三個特點:
(1)唯一性
唯一性指對於windows作業系統中的每一條訊息都有乙個且只有乙個訊息號與它相對應。由於windows作業系統通過訊息啟用相應的過程,因此訊息的標識必須是唯一的。
(2) 直觀性
訊息號在形式上表現為訊息名,訊息名往住直觀地說明了訊息的產生方式和型別,例如訊息名wm_lbuttondown直觀地表示了單擊產生的訊息。
(3)可自定義性
windows系統定義了一些訊息號和訊息名,程式設計師可以運用這些訊息,也可以使用自已定義的視窗的訊息。形式如下:
#define 訊息名 訊息號
注意,為了不與現有的windows系統訊息相衝突,在訊息號的定義中通常採用如下:
wm_user+nwm_user是windows作業系統定義的使用者訊息起始值,程式設計師必須從該起始值後選取訊息號,例如自定義訊息名為「message_1」和「message_2」,可採用如下形式:
#define message_1 wm_user+1
#define message_2 wm_user+2
參 數windows的訊息具有以下兩個引數:
(1)字引數(wparam)
(2)長引數(lparam)
字引數和長引數都是32位整數,用於提供訊息的附帶訊息,是訊息傳遞過程中引數的載體。附加資訊的訊息號取決於訊息號。
3、訊息處理
在mfc中,每個專門的處理函式旱單獨處理每個訊息。訊息處理函式通常是某一類的成員函式,編寫訊息處理函式是編寫框架應用程式的主要任務。
可以使用classwizard建立訊息處事函式,然後從classwizard直接跳到原始檔訊息處理函式,編寫處理**。
4、訊息對映
可以接收訊息和命令的所有框架類都有自已的訊息對映。框架利用訊息對映把訊息、命令與它們的處理函式鏈結起來。從ccmdtarget類派生的任何類都可以有訊息對映。雖然叫作「訊息對映」,但訊息對映既可以處理訊息,也可以處理命令。
二、訊息種類
訊息主要有三種型別,即windows訊息,命令訊息和控制項通知。
按訊息的產生可以分為四類:
*(1)外界輸入事件產生的訊息
*(2)windows系統向應用程式發出的訊息
*(3)應用程式之間傳送的訊息
*(4)其他
根據產生訊息的物件,可以進一步將訊息分為以下幾類:
*(1)視窗管理訊息
包括啟用基本視窗操作的訊息,如關閉、最大化等。
*(2)初始化訊息
應用程式、視窗、控制項等物件初始化的訊息。
*(3)輸入訊息
包括鍵盤、滑鼠、繪圖儀等處部輸入工具的輸入訊息。
*(4)系統訊息
windows系統內部訊息。
*(5)剪貼簿訊息
操作剪貼簿時產生的訊息。
*(6)系統資訊訊息
用於系統資訊傳送和處理的訊息。
*(7)控制項處理訊息
操作控制項時產生的訊息。
*(8)控制項通知訊息
系統採用空件通知訊息向控制項傳送訊息。
*(9)滾動條訊息
操作滾動條時產生的訊息
*(10)非使用者區訊息
非使用者區產生的訊息
*(11)mdi訊息
用於多文件操作的訊息
*(12)dde訊息
用於動態資料交換
的訊息。
*(13)應用程式自定義的訊息等等。
1、windows訊息
除wm_command外,所有以wm_開頭的訊息都是windows訊息。windows訊息由視窗和檢視處理。這類訊息通常含有用於確定如何對訊息進行處理的一些引數。
2、控制項訊息
控制項通知包含從控制項和其他子視窗傳遞給父視窗的wm_command通知訊息。例如,當使用者改變編輯控制項中的文字時,編輯控制項將傳送給父窗(例如對話方塊)一條含有en_exchange控制項通知碼的wm_command訊息。視窗的訊息處理函式將以適當的方式對通知訊息作出響應,如獲取編輯框中的文字等。
像其他標準windows訊息一樣,控制項通知訊息由視窗和檢視進行處理。但是如果使用者單擊控制項按鈕時發出的bn_clicked控制項通知訊息將作為命令訊息來處理。
3、命令訊息
命令訊息包括來自使用者介面物件的wm_command通知訊息。選單項、工具欄按鈕和加速鍵都是可以產生命令的使用者介面物件。每個這樣的物件都有乙個id。通過給物件和命令分配給同乙個id可以把使用者介面物件和命令聯絡起來。命令是被作為特殊的訊息來處理的。
通常,命令id是以其表示的使用者介面物件的功能來命名的。例如,edit選單中的copy命令就可以用id_edit_copy來表示。mfc類庫預定義了某些命令id(如id_edit_paste和id_file_open等等)。其他命令id則要程式設計人員自已定義,所有預定義命令id的列表,參見afxres.h檔案。
命令訊息的處理和其他訊息的處理不同。命令訊息可以被更廣泛的物件(如文件、文件模板、應用程式物件、視窗和檢視等)處理。windows把命令傳送給多個候選物件,稱為命令目標。通常其中乙個物件有針對該命令的處理函式。處理函式處理命令的方法和處理windows訊息的方法是一樣的。但呼叫機制不一樣。
三、常用訊息
windows中一些常用的訊息:
1、wm_lbuttondown
產生:單擊。
引數:wparam:包含乙個整數值,以標識滑鼠鍵的按下狀態。
滑鼠的按下標識及說明
數值說明
mk_lbutton標識按下滑鼠左鍵
mk_mbutton標識按下滑鼠中鍵
mk_rbutton標識按下滑鼠右鍵
lparam:長引數lparam的低字位包含當前座標的x座標,在高位元組包含當前座標的y座標。
相似的訊息有:
wm_lbuttonup
wm_rbuttondown
wm_rbuttonup
wm_lbuttondblclk
wm_rbuttondblclk
2、wm_keydown
產生:按下乙個非系統鍵的時候產生該事件,系統鍵是指實現系統操作的組合鍵,例如,alt與某個功能鍵的組合以實現選單操作等。
引數:wparam:按下鍵的虛擬鍵盤碼,虛擬鍵碼用來標識按下或者釋放的是哪個鍵,例如功能鍵f1的虛擬鍵碼在windows.h檔案中定義為vk_f1。
lparam:長引數中記錄了按鍵的重複次數,掃瞄碼、轉移**、先前鍵的狀態等資訊。
相似的訊息有:
wm_keyup:放開按下的非系統鍵時產生的事件。
在MFC中新增自定義訊息響應
第 一 在標頭檔案定義訊息字元,n必須大於0,因為wm user以前的用於windows內部定義 define wm my message wm user n 第二 在要響應訊息的窗體的標頭檔案新增 afx msg void onmymessage afx msg 表示的是訊息響應函式,只是乙個標記...
MFC自定義訊息
訊息機制是windows的典型執行機制,在mfc中有很多的訊息如wm btn 等。但是在有些情況下我們需要自定義一些訊息去做一些我們需要的功能,mfc的嚮導不能幫助我們做到這一點,我們可以通過新增相應的 去完成這個功能。新增自定義訊息操作如下 1.建立mfc工程,如基於對話方塊的應用程式,test。...
MFC自定義訊息
訊息機制是windows的典型執行機制,在mfc中有很多的訊息如wm btn 等。但是在有些情況下我們需要自定義一些訊息去做一些我們需要的功能,mfc的嚮導不能幫助我們做到這一點,我們可以通過新增相應的 去完成這個功能。新增自定義訊息操作如下 1.建立mfc工程,如基於對話方塊的應用程式,test。...