MFC消息映射與處理 介紹 你們好!我是小輝,不知前兩篇文章你看了感受怎樣?在前兩篇文章裏 咱們主要了解了Widows程序和MFC程序的基本框架。我但願你們記住它。 今天咱們主要了解一下MFC程序的消息映射 正文 【1】Windows處理消息的方法: 在第0篇中見到的 while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } 【2】MFC處理消息的方法: 在第1篇見到的 class CMyFrameWnd : public CFrameWnd { public: afx_msg void OnPaint() //重繪窗口內部的圖形 { CPaintDC paintDC(this); paintDC.TextOut(10,10,"小輝願和你們一塊兒進步!"); } DECLARE_MESSAGE_MAP()//聲明消息映射表 }; //消息映射表 BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd) ON_WM_PAINT()//響應WM_PAINT消息 END_MESSAGE_MAP() 【3】消息響應函數[afx_msg void OnPaint();]:即處理消息的函數。 afx_msg只是將函數標記爲消息響應函數,你把它去掉程序也能夠正常 運行,只不過是習慣的標記罷了! 【4】當MFC程序要處理消息時,你要告訴MFC你要處理什麼消息以及在 什麼位置出處理這些消息。爲此咱們聲名了一個消息映射表 DECLARE_MESSAGE_MAP()//聲明消息映射表 並填寫了消息映射表 //(填寫)消息映射表 BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd) ON_WM_PAINT()//響應WM_PAINT消息 END_MESSAGE_MAP() 還好,咱們使用AppWizard和ClassWizard建立應用程序時,他們哥倆幫 咱們作好了上面的事情(*AppWizard爲咱們建立了基本消息映射表, ClassWizard會根據須要給給消息映射表添加新的條目*): (A)在類的頭文件中說明了消息映射表(DECLARE_MESSAGE_MAP())。 (B)在類的頭文件中說明了消息響應函數函數(afx_msg void OnPaint();)。 (C)在類的實現文件中定義了消息映射表 BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd) ON_WM_PAINT()//響應WM_PAINT消息 END_MESSAGE_MAP() 消息映射表的做用是:經過它找到消息響應函數。 (D)在類的實現文件中定義了消息響應函數。 void CMFrameWnd::OnPaint() //重繪窗口內部的圖形 { CPaintDC paintDC(this); paintDC.TextOut(10,10,"小輝願和你們一塊兒進步!"); } 這些工做你也能夠手動完成(如第1篇看到的,只不過在那一篇中咱們把這些 東西都放在了MyApp.cpp文件中,應該把聲名放在".h"文件中,把實現放在 ".CPP"文件中,VC中就是這樣管理每個類的)! 【5】MFC程序中消息的種類: (A)窗口消息(Window Message): 這種消息通常與窗口的內部運做有關,如建立窗口、繪製窗口和銷燬窗口等。 一般,消息是從系統發送到窗口,或從窗口發送到窗口。形式一般爲WW_XXX (不包括WW_COMMAND)如: WM_CREATE,告訴窗口初始化本身。 WM_PAINT,告訴窗口繪製本身。 WM_MOUSEMOVE,告訴窗口鼠標移經它。 (B)由控件和其它子窗口發送給父窗口的WW_COMMAND消息: 這些消息中包括EN_CHANGE通知碼,例如當用戶在編輯框中鍵如文本或進行修改時, 就會向系統發送一個帶EN_CHANGE通知碼的WM_COMMAND消息。 (C)來自用戶界面對象的WW_COMMAND消息: 包括由菜單、工具欄按鈕和快捷鍵這些用戶界面對象發送的消息。 【6】說了這麼可能是不是有些亂?咱們須要記住的是消息發生時,經過消息映射表 找到相應的消息響應函數對消息進行處理!記住這三個宏: DECLARE_MESSAGE_MAP()//聲明消息映射表 //消息映射表 BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd) END_MESSAGE_MAP() 好了在瞭解了上面知識後,咱們在昨天的程序中加入鼠標左鍵按下的消息及其消息 響應函數: //MyApp.cpp #include //必要的包含文件 //主窗口類 class CMyFrameWnd : public CFrameWnd { public: afx_msg void OnPaint() //重繪窗口內部的圖形 { CPaintDC paintDC(this); paintDC.TextOut(10,10,"請按下鼠標左鍵!"); } afx_msg void OnLButtonDown(UINT nFlags, CPoint point) { ::AfxMessageBox("響應了鼠標左鍵消息!"); } DECLARE_MESSAGE_MAP()//聲明消息映射表 }; //消息映射表 BEGIN_MESSAGE_MAP(CMyFrameWnd,CFrameWnd) ON_WM_PAINT()//響應WM_PAINT消息,將會調用OnPaint() ON_WM_LBUTTONDOWN() //響應鼠標左鍵按下消息,將會調用 //OnLButtonDown(UINT nFlags, CPoint point) END_MESSAGE_MAP() //應用程序類 class CMyApp : public CWinApp { public: CMyApp() :CWinApp("個人應用程序!")//設定應用程序名稱 { } BOOL InitInstance() { CFrameWnd* MyFrame = new CMyFrameWnd; //產生主窗口對象 m_pMainWnd = MyFrame; MyFrame->Create(NULL,"個人程序!");//創建主窗口 MyFrame->ShowWindow(SW_SHOW);//顯示主窗口 MyFrame->UpdateWindow(); return TRUE; } }; CMyApp theApp; //應用程序對象 好了,請你們按照上篇的方法運行一下修改後的程序,是否是已經響應了鼠標左鍵 按下的消息。