標籤:window mem wm_keyup 聲明 define 應用程式 ram base 維護
Windows的三類訊息
1、標準訊息
宏名稱對映訊息訊息處理函數(名稱已由系統預設)
ON_WM_CHARWM_CAHROnChar
ON_WM_CLOSEWM_CLOSEOnClose
ON_WM_CREATEWM_CREATEOnCreate
ON_WM_DESTROYWM_DESTROYOnDestroy
ON_WM_LBUTTONDOWNWM_LBUTTONDOWNOnLButtonDown
ON_WM_LBUTTONUPWM_LBUTTONUPOnLButtonUp
ON_WM_MOUSEMOVEWM_MOUSEMOVEOnMouseMove
ON_WM_PAINTWM_PAINTOnPaint
...
如:鍵盤訊息
鍵盤訊息是應用程式中使用最頻繁的訊息之一,
當使用者使用鍵盤對應用程式進行操作,就發送鍵盤訊息。
一般來說,Visual C++中的鍵盤訊息主要有如下3種。
WM_CHAR:該訊息的處理函數OnChar()。
WM_KEYDOWN:使用者按下一個非系統鍵。
WM_KEYUP:在非系統鍵被釋放時產生。
如:滑鼠訊息
與鍵盤訊息類似,滑鼠訊息也是Windows應用程式中使用最為頻繁的訊息之一。
一般來說,Windows應用程式中的滑鼠訊息主要有如下幾種。
WM_MOUSEMOVE:使用者將滑鼠移進視窗或在視窗中移動。
WM_LBUTTONDOWN:使用者按下左鍵。
WM_LBUTTONUP:使用者釋放左鍵。
WM_LBUTTONDBCLICK:使用者雙擊左鍵。
WM_RBUTTONDOWN:使用者按下右鍵。
WM_RBUTTONUP:使用者釋放右鍵。
WM_RBUTTONDBCLICK:使用者雙擊右鍵。
如:視窗訊息
視窗訊息是指對Windows應用程式的視窗進行某些操作時發送的訊息。
Visual C++ 6.0中,包含了如下6種視窗訊息。
WM_CREATE:視窗被建立。
WM_DESTROY:視窗被銷毀。
WM_CLOSE:視窗被關閉。
WM_MOVE:視窗發生移動。
WM_SIZE:視窗發生改變。
WM_PAINT:視窗發生重繪。
如:焦點訊息
焦點訊息是指當視窗中的某個對象得到焦點和失去焦點的時候,
對應視窗或對象觸發的操作。一般來說,只有下面兩種焦點訊息。
WM_SETFOCUS:視窗得到焦點。
WM_KILLFOCUS:視窗失去焦點。
當一個視窗從非使用中變為具有輸入焦點的活動狀態的時候,
它就會收到WM_SETFOCUS訊息,
而當一個視窗失去輸入焦點變為非使用中的時候它就會收到WM_KILLFOCUS訊息。
如:定時器訊息
Windows的定時器是一種周期性訊息產生裝置,
當使用者為一個視窗設定了定時器資源之後,系統就會按
規定的時間間隔向視窗發送定時器訊息,在這個訊息中
就可以處理一些需要定期處理的事情
。定時器訊息只有一種:WM_TIMER,其響應函數是OnTimer。
對於定時器的操作,通常都會和函數SetTimer()配合使用。
在響應OnTimer函數之前,應先添加一個定時器對其進行觸發,
如果沒有建立定時器,系統是不會自己去觸發OnTimer函數的,
SetTimer()函數的作用就是設定定時器 。
2、命令訊息
命令訊息(WM_COMMAND)的一般對映規則是:
ON_COMMAND(<id>,<memberFxn>)
例如:
ON_COMMAND(IDM_ABOUT,OnAbout)
3、控制項通知訊息
[Notification訊息](由控制組件產生,例如BN_xxx)的對映機制的宏分為好幾種
(因為控制組件本來就分為好幾種),以下各舉一例做代表
控制組件宏名稱訊息處理函數
ButtonON_BN_CLICKED(<id>,<memberFxn>)memberFxn
ComboBoxON_CBN_DBLCLK(<id>,<memberFxn>)memberFxn
EditON_EN_SETFOCUS(<id>,<menberFxn>)memberFxn
ListBoxON_LBN_DBLCLK(<id>,<memberFxn>)memberFxn
各個訊息處理函數均應以afx_msg void 為函數形式
訊息映射及訊息響應:
MFC採用訊息映射(Message Map)機製取代C/C++語言中的switch-case結構來處理訊息。
MFC訊息映射機制包括一組訊息映射宏。一條訊息映射宏把一個Windows訊息和其訊息處
理函數連接起來。
在類的實現源檔案中用
BEGIN_MESSAGE_MAP(derived class,base class)
和
END_MESSAGE_MAP()宏來定義訊息映射。
在類定義的結尾用DECLARE_MESSAGE_MAP()宏來聲明使用訊息映射。
BEGIN_MESSAGE_MAP(theclass, baseclass)
//{{AFX_MSG_MAP(theclass)
ON_ . . . . . . // MFC預定義的訊息映射宏
ON_MESSAGE(message , memberFxn)
// 使用者自訂的訊息映射宏
. . . . . .
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
//注意:
特殊註解“//{{AFX_MSG_MAP”是ClassWizard類嚮導用於維護訊息映射宏的標記,
使用者不要刪除註解輕易修改註解內的代碼。
4、使用者自訂訊息
1.首先在為類實現檔案中定義訊息。
#define WM_MYMESSAGE WM_USER+100
2.在類中聲明訊息處理函數。
afx_msg LRESULT OnMyMessage(WPARAM wParam,LPARAM lParam)
3.在類的訊息映射表中加入映射項。
ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)
4.在類上實現訊息處理函數。
5.使用SendMessage函數或PostMessage發送訊息
SendMessage(WM_MYMESSAGE,0L,0L);
Windows的三類訊息