MFC應用程式程式設計
九MFC的訊息分類
MFC的訊息分類按照處理方式來分。主要分為4類:
1 視窗訊息
例如WM_CREATE、WM_PAINT、滑鼠、鍵盤等訊息,這些訊息的處理方式是直接呼叫訊息處理函式.
這類訊息使用的巨集:
ON_MESSAGE( )
ON_WM_XXXXX( ): ON_WM_CREATE()
訊息處理時,採用上面的處理方式.
前面的WM_CREATE訊息就不用寫成ON_MESSAGE( WM_CREATE, OnCreate ),而直接寫成ON_WM_CREATE即可。
函式的定義和宣告也要相應地修改為:
afx_msg LRESULT OnCreate( WPARAM wParam, LPARAM lParam ); |
afx_msg int OnCreate(); |
LRESULT CMsgFrame::OnCreate( WPARAM wParam, LPARAM lParam ) { AfxMessageBox("OnCreate"); return 0; } |
int CMsgFrame::OnCreate() { AfxMessageBox("OnCreate"); return 0; } |
2 命令訊息 WM_COMMAND
選單、工具欄、按鈕等點選時的命令. 訊息首先發送到主視窗,由主視窗逐層向子視窗派發。
這類的訊息使用的巨集:
ON_COMMAND( )
ON_COMMAND_RANGE( )
訊息處理時,在OnWndMsg中呼叫OnCommand處理函式進行訊息處理.
3 通知訊息 WM_NOTIFY
子視窗對父視窗的通知訊息。
控制元件訊息巨集,例如: EDIT控制元件 ON_EN_CHANGE、ON_NOTIFY/ON_NOTIFY_RANGE訊息處理時,在OnWndMsg中呼叫OnNotify(OnCommand)處理函式進行訊息處理。
4 自注冊訊息
使用者自注冊訊息的處理。
使用者需呼叫RegisterWindowMessage函式註冊訊息,然後在訊息對映中使用.
UINT RegisterWindowMessage(
LPCTSTR lpString //訊息名字串
);
返回註冊成功的訊息ID(0xC000-0xFFFF)
訊息對映巨集: ON_REGISTERED_MESSAGE
訊息處理時, 與視窗訊息處理類似,但是在查詢訊息處理函式和執行訊息處理函式時不同.
自注冊訊息使用舉例:
// RegisterMsg.cpp : Defines the entry point for the application. // #include "stdafx.h" //註冊訊息ID UINT g_nRegMsg = RegisterWindowMessage( "MYREGMSG" ); class CRegsiterFrame : public CFrameWnd { DECLARE_MESSAGE_MAP( ) public: afx_msg int OnCreate( LPCREATESTRUCT lpCreateStruct ); afx_msg void OnTest( ); //訊息處理函式 afx_msg LRESULT OnRegMsg( WPARAM wParam,LPARAM lParam ); }; BEGIN_MESSAGE_MAP( CRegsiterFrame, CFrameWnd ) ON_WM_CREATE( ) ON_COMMAND( 1001, OnTest ) //訊息巨集對映 ON_REGISTERED_MESSAGE( g_nRegMsg, OnRegMsg ) END_MESSAGE_MAP( ) int CRegsiterFrame::OnCreate( LPCREATESTRUCT lpCreateStruct ) { //父類的OnCreate處理 /*if(!CFrameWnd::OnCreate( lpCreateStruct ) ) { return 0; }*/ //建立按鈕 CreateWindow( "BUTTON", "Test", WS_CHILD|WS_VISIBLE, 50, 50, 200, 30, m_hWnd, (HMENU)1001, AfxGetApp()->m_hInstance, NULL ); return 1; } void CRegsiterFrame::OnTest( ) { //傳送訊息 SendMessage( g_nRegMsg ); } LRESULT CRegsiterFrame::OnRegMsg( WPARAM wParam,LPARAM lParam ) { AfxMessageBox( "OnRegMsg" ); return 0; } class CRegisterApp : public CWinApp { public: virtual BOOL InitInstance( ); }; CRegisterApp theApp; BOOL CRegisterApp::InitInstance( ) { CRegsiterFrame * pWnd = new CRegsiterFrame( ); pWnd->Create( NULL, "Register Msg" ); m_pMainWnd = pWnd; m_pMainWnd->ShowWindow( SW_SHOW ); m_pMainWnd->UpdateWindow( ); return TRUE; } |