第05章笔记
主要內(nèi)容:
使程序能夠響應菜單事件和鼠標事件(按下左鍵、移動、松開左鍵)。
關于事件:
視窗程序通過事件進行用戶進行交互。當用戶進行單擊鼠標、選擇菜單、按下鍵盤等操作時都會產(chǎn)生一個事件。在程序中,我們需要:1,為指定的事件編寫處理程序;2.將事件處理程序進行注冊。
編寫事件處理程序
編寫事件處理程序其實就是為處理事件的類添加一個方法(即成員函數(shù))。在MFC中,無論是視窗框架類(如CFrameWnd,CMDIFrameWnd,CMDIChildWnd),還是文檔類,或者視圖類,都可以處理事件,我們只需要在類中添加相應的方法即可。
由于事件處理程序是特殊的方法,所以事件處理程序必須要以afx_msg開頭。
事件處理程序注冊
要處理事件的類,在類體中除了要添加負責處理事件的方法外,還要:1,在類體中添加以下宏DECLARE_MESSAGE_MAP();2,在類體外添加事件處理程序注冊宏,格式如下:
BEGIN_MESSAGE_MAP(類名,父類名)
????具體的事件注冊宏
END_MESSAGE_MAP()
有一些事件,如:單擊鼠標、移動鼠標等,被稱為系統(tǒng)消息,其特點是:1,處理該類事件的方法聲明是由系統(tǒng)固定的,如移動鼠標的方法聲明是:afx_msg void OnMouseMove(UINT nFlags, CPoint point);2,在注冊該類事件時,都是以ON_WM開頭的,如移動鼠標的事件注冊為:ON_WM_MOUSEMOVE()。
而對于有一些操作,例如選擇菜單,雖然動作都是單擊,但是由于不同的菜單項需要不同的處理函數(shù),所以對于此類方法來說:1,處理事件的函數(shù)名是可以自己定義的;2,注冊事件的宏名是固定的,如選擇菜單的注冊事件宏是:ON_COMMAND;3,需要給事件處理宏添加2個參數(shù),第一個參數(shù)是發(fā)生事件的資源ID,第二個是參數(shù)是處理在資源上指定事件的函數(shù)名。
例如:在菜單中有一個菜單項“Test”,其ID為:IDM_TEST,其事件處理函數(shù)的聲明是:afx_msg void OnTest(),則其事件注冊宏為:ON_COMMAND(IDM_TEST, OnTest)。
示例程序:
創(chuàng)建一個簡單的視窗程序,程序有一個簡單的菜單“File”,有兩個菜單項:“Exit1”和“Exit”。
| 菜單項 | 資源ID | 功能 |
| Exit1 | IDM_EXIT | 顯示提示信息后退出程序。 |
| Exit | ID_APP_EXIT | 退出程序。 |
其中:ID_APP_EXIT是系統(tǒng)提供的資源ID,功能是退出程序,無需用戶自己編程。而IDM_EXIT是用戶自定的資源ID,需要自己添加處理程序。
在程序窗口中按下鼠標左鍵移動時,會在窗口中繪制紅色的點。
主要事件分析:
1:單擊”Exit1“菜單時,調(diào)用程序,顯示對話框并退出程序。
2:在視窗中,按下鼠標,開始捕捉鼠標軌跡。
3:按住左鍵移動鼠標時,繪制紅色的點。
4:松開鼠標時,結束捕捉。
程序代碼:
#include?<afxwin.h> #include?"Message.h"class?CMyFrame?:?public?CFrameWnd { private:CMenu?*pMenu; public:CMyFrame(){Create(NULL,?"Hello?MFC");pMenu?=?new?CMenu;pMenu->LoadMenu(IDR_MENU1);SetMenu(pMenu);}~CMyFrame(){delete?pMenu;}afx_msg?void?OnExit()//事件處理函數(shù)必須以afx_msg開頭{MessageBox("Exit1");DestroyWindow();}afx_msg?void?OnLButtonDown(UINT?nFlags,?CPoint?point)//系統(tǒng)消息的方法聲明是固定格式的{SetCapture();}afx_msg?void?OnMouseMove(UINT?nFlags,?CPoint?point){if(GetCapture()?==?this){CClientDC?aDC(this);aDC.SetPixel(point,?RGB(255,?0,?0));}}afx_msg?void?OnLButtonUp(UINT?nFlags,?CPoint?point){ReleaseCapture();}DECLARE_MESSAGE_MAP() }; BEGIN_MESSAGE_MAP(CMyFrame,?CFrameWnd)ON_COMMAND(ID_Exit1,?OnExit)ON_WM_LBUTTONDOWN()ON_WM_MOUSEMOVE()ON_WM_LBUTTONUP() END_MESSAGE_MAP()class?CMyApp?:?public?CWinApp { public:BOOL?InitInstance(){CFrameWnd?*pFrame?=?new?CMyFrame;m_pMainWnd?=?pFrame;pFrame->ShowWindow(SW_SHOW);return?true;} }a_app;。。。
轉載于:https://blog.51cto.com/3677403/1655304
總結
- 上一篇: Linux CentOS下配置SVN+S
- 下一篇: 购物系统①