




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、 第第12章章 MFC典型應用程序設計典型應用程序設計 課程設計題目課程設計題目3.考勤信息記錄了學生的缺課情況,它包括:缺課日期、第幾節(jié)課、課程名稱、學生姓名、缺課類型(遲到、早退、請假及曠課)。試設計一考勤管理系統(tǒng),使之能提供以下功能: 1)錄入學生的缺課記錄; 2)修改某個學生的缺課記錄; 3)查詢某個學生的缺課情況; 4)統(tǒng)計某段時間內,曠課學生姓名及曠課次數(shù),按曠課次數(shù)由多到少排序; 5)統(tǒng)計某段時間內,有學生曠課的課程及曠課人次,按曠課人次由多到少排序; 6)系統(tǒng)以菜單方式工作。12.1 消息處理機制消息處理機制 WindowsWindows程序與其他程序最大的不同之處在于使用消息
2、機制。程序與其他程序最大的不同之處在于使用消息機制。 WindowsWindows程序中所發(fā)生的一切都可以用消息表示,消息用于告訴操作系程序中所發(fā)生的一切都可以用消息表示,消息用于告訴操作系統(tǒng)所發(fā)生的事情,如按鍵操作或鼠標操作等。統(tǒng)所發(fā)生的事情,如按鍵操作或鼠標操作等。 MFCMFC應用程序也使用基于消息的事件驅動機制,而且應用程序也使用基于消息的事件驅動機制,而且MFCMFC提供的消息處理提供的消息處理機制使得用戶可以更加方便、簡易的處理消息。機制使得用戶可以更加方便、簡易的處理消息。在在WindowsWindows中,所有消息都是通過消息名進行訪問的,但不同類型的消息中,所有消息都是通過消
3、息名進行訪問的,但不同類型的消息由應用程序的不同部分進行處理。由應用程序的不同部分進行處理。 1. MFC1. MFC消息種類消息種類 消息機制是消息機制是 Windows應用程序的核心,應用程序的核心,MFC中的消息可以分為:中的消息可以分為: Windows消息消息 控件通知消息控件通知消息 定時消息定時消息 命令消息命令消息 12.1 消息處理機制消息處理機制 Windows消息消息 WindowsWindows消息通常指以消息通常指以WMWM開頭的消息,但開頭的消息,但WM_COMMANDWM_COMMAND除外。除外。鍵盤消息和鼠標消息都屬于鍵盤消息和鼠標消息都屬于WindowsWi
4、ndows消息,消息,WindowsWindows消息由窗口和視圖進消息由窗口和視圖進行處理。行處理。 WindowsWindows消息通常帶有若干個參數(shù)傳遞給消息處理函數(shù),這些參數(shù)為處理消息通常帶有若干個參數(shù)傳遞給消息處理函數(shù),這些參數(shù)為處理函數(shù)正確地處理消息提供了充分的信息。函數(shù)正確地處理消息提供了充分的信息。 控件通知消息是指當控件的狀態(tài)發(fā)生改變時,控件向其父窗口發(fā)送的控件通知消息是指當控件的狀態(tài)發(fā)生改變時,控件向其父窗口發(fā)送的消息。消息。 MFCMFC對控件通知消息的傳遞方式與其他以對控件通知消息的傳遞方式與其他以WMWM開頭的開頭的WindowsWindows消息一樣,消息一樣,但但
5、BN_CLICKEDBN_CLICKED例外,該消息的傳遞方式與命令消息的傳遞機制相同。例外,該消息的傳遞方式與命令消息的傳遞機制相同。對于對于WindowsWindows消息和控件通知消息,消息和控件通知消息,MFCMFC將消息傳遞給相應的窗口處理。將消息傳遞給相應的窗口處理。 控件通知消息控件通知消息 定時消息定時消息 定時消息也是Windows的一類重要消息。當需要應用程序每隔一個指定的時間間隔便執(zhí)行某一特定操作時,就需要使用定時消息WM_TIMER。在進行定時操作時,用戶需要調用SetTimer函數(shù)創(chuàng)建一個定時器,并設置定時器的事件標志nIDEvent及時間間隔nElapse,然后編寫
6、消息WM_TIMER的消息處理函數(shù)OnTimer(),實現(xiàn)定時操作。 命令消息 命令消息是來自于用戶界面對象的WM_COMMAND消息。包括菜單、工具欄按鈕和加速鍵都屬于命令消息等。即每當用戶選擇一個菜單項、單擊一個按鈕或需要告訴操作系統(tǒng)應當執(zhí)行什么操作時,則發(fā)送一條WM_COMMAND命令消息。WM_COMMAND消息的消息映射宏為OnCommand()。所有命令消息都包含有一個相同類型的參數(shù),即該命令消息需要操作的資源ID值,由ID值映射消息處理函數(shù)。2 MFC消息映射機制 消息映射是指將消息與處理函數(shù)相聯(lián)系,即當系統(tǒng)產生一條消息時,消息映射是指將消息與處理函數(shù)相聯(lián)系,即當系統(tǒng)產生一條消息
7、時,它能找到處理該消息的函數(shù)。它能找到處理該消息的函數(shù)。Visual C+的消息映射宏 消息映射宏消息映射宏 功功 能能DECLARE_MESSAGE_MAP在頭文件中使用,用于聲明在源文件中存在消息映射在頭文件中使用,用于聲明在源文件中存在消息映射BEGIN_MESSAGE_MAP表示消息映射的開始,用于源代碼文件中表示消息映射的開始,用于源代碼文件中END_MESSAGE_MAP表示消息映射的結束,用于源代碼文件中表示消息映射的結束,用于源代碼文件中ON_COMMAND將特定的命令消息映射到類的成員函數(shù),即使用該成將特定的命令消息映射到類的成員函數(shù),即使用該成員函數(shù)處理消息員函數(shù)處理消息O
8、N_COMMAND_RANGE將一組特定的命令消息映射到類的成員函數(shù)將一組特定的命令消息映射到類的成員函數(shù)Visual C+的消息映射分為兩個方面:的消息映射分為兩個方面: 一是在頭文件一是在頭文件.h中處理中處理 一是在實現(xiàn)文件一是在實現(xiàn)文件.cpp中處理中處理 消息映射宏消息映射宏在頭文件MyWinp.h中的消息映射代碼 /AFX_MSG(CMyWinPApp)afx_msg void OnAppAbout();/NOTE-the ClassWizard will add and remove member functions here./DO NOT EDIT what you see
9、in these blocks of generated code !/AFX_MSGDECLARE_MESSAGE_MAP()在實現(xiàn)文件中的消息映射代碼 BEGIN_MESSAGE_MAP(CMyWinPApp,CWinApp)/AFX_MSG_MAP(CMyWinPApp)ON_COMMAND(ID_APP_ABOUT,OnAppAbout)/NOTE-the ClassWizard will add and remove mapping macros here./DO NOT EDIT what you see in these blocks of generated code!/AFX
10、_MSG_MAP/Standard document commandsON_COMMAND(ID_)ON_COMMAND(ID_)/Standard print setup commandON_COMMAND(ID_: On)END_MESSAGE_MAP()消息映射宏的使用宏宏DECLARE_MESSAGE_MAP用于類聲明文件的結束處,即在用于類聲明文件的結束處,即在.h文件文件的結束處。的結束處。宏宏BEGIN_MESSAGE_MAP和和END_MESSAGE_MAP用于類的實現(xiàn)文件用于類的實現(xiàn)文件(.cpp)中實現(xiàn)消息映射,而且這兩個宏必須配合使用。)中實現(xiàn)消息映射,而且這兩個宏必須配
11、合使用。 在在BEGIN_MESSAGE_MAP與與END_MESSAGE_MAP中間列出了消息中間列出了消息映射的各個入口。例如,以下消息映射語句:映射的各個入口。例如,以下消息映射語句:ON_COMMAND(ID_, CWinApp:On)表示當用戶單擊了菜單項時,則發(fā)送表示當用戶單擊了菜單項時,則發(fā)送WM_COMMAND消息,該消息找消息,該消息找到此語句,發(fā)現(xiàn)資源到此語句,發(fā)現(xiàn)資源ID值與資源值與資源ID_匹配,則執(zhí)行該語句中指定的成員函數(shù)匹配,則執(zhí)行該語句中指定的成員函數(shù)CWinApp:On ()。 消息映射宏的使用消息映射宏的使用(續(xù)續(xù)) 向導向導AppWizard生成的單文檔應用
12、程序一般包括四個基本類:生成的單文檔應用程序一般包括四個基本類:應用程序類應用程序類主框架窗口類主框架窗口類文檔類文檔類視圖類視圖類其他相關文件。其他相關文件。12.2應用程序分析 1.AppWizard向導生成的類和文件向導生成的類和文件 單擊項目工作區(qū)的單擊項目工作區(qū)的ClassViewClassView標簽,則顯示標簽,則顯示CMainFrameCMainFrame(主框架窗口類主框架窗口類)、)、CMyWinPAppCMyWinPApp(應用程序類應用程序類)、)、CMyWinPDocCMyWinPDoc( 文檔類文檔類)和)和CMyWipViewCMyWipView( 視圖類視圖類)
13、等,這是應用程序)等,這是應用程序MyWinPMyWinP的全部類。的全部類。1.AppWizard向導生成的類和文件向導生成的類和文件 利用利用AppWizardAppWizard向導創(chuàng)建應用程序框架時,產生的各派生類將被創(chuàng)建單獨的向導創(chuàng)建應用程序框架時,產生的各派生類將被創(chuàng)建單獨的源文件。源文件。單擊某一類名(如單擊某一類名(如CMyWinPViewCMyWinPView)前的)前的“+”+”號,則列出該類的成員函數(shù),雙號,則列出該類的成員函數(shù),雙擊類名或成員函數(shù)名擊類名或成員函數(shù)名( (如如GetDocument)GetDocument),則源代碼編輯區(qū)顯示出該類或該成員,則源代碼編輯區(qū)
14、顯示出該類或該成員函數(shù)的實現(xiàn)代碼。函數(shù)的實現(xiàn)代碼。 觀察應用程序觀察應用程序MyWinP 的類和文件的類和文件NoImage MyWinPMyWinP程序的應用程序類名為程序的應用程序類名為CMyWinPApp CMyWinPApp ,由,由CwinAppCwinApp類派生而類派生而來。來。 該類的每一個對象代表一個應用程序,程序中默認定義一個全局該類的每一個對象代表一個應用程序,程序中默認定義一個全局對象對象theApptheApp。(1)應用程序類應用程序類 CMyWinPAppCMyWinPApp類的功能是類的功能是管理整個應用程序管理整個應用程序,負責程序的啟動、初始化、,負責程序的
15、啟動、初始化、窗口的創(chuàng)建以及從窗口的創(chuàng)建以及從WindowsWindows中獲取消息并將消息分發(fā)到適當?shù)哪康牡?。中獲取消息并將消息分發(fā)到適當?shù)哪康牡亍?CMyWinPAppCMyWinPApp類的聲明在頭文件類的聲明在頭文件MyWinPApp.hMyWinPApp.h中,類的實現(xiàn)在中,類的實現(xiàn)在CMyWinPApp.cppCMyWinPApp.cpp中。中。(1)應用程序類應用程序類 CMyWinP應用程序的主框架窗口類名為應用程序的主框架窗口類名為CMainFrame,它由,它由CWnd的一個子類派生而來,該子類即的一個子類派生而來,該子類即CFrameWnd。CMainFrame類的聲明在
16、頭文件類的聲明在頭文件MainFrame.h中,類的實現(xiàn)在文件中,類的實現(xiàn)在文件MainFrame.cpp中。中。(2)主框架架窗口類主框架架窗口類 CMainFrame類管理主框架窗口,并擁有一些如菜單、工具欄和類管理主框架窗口,并擁有一些如菜單、工具欄和狀態(tài)欄等控件,同時,它還扮演轉發(fā)菜單和工具欄消息的角色。狀態(tài)欄等控件,同時,它還扮演轉發(fā)菜單和工具欄消息的角色。 (2)主框架架窗口類主框架架窗口類 CMyWinPCMyWinP應用程序的文檔類名為應用程序的文檔類名為CMyWinPDocCMyWinPDoc,從,從MFCMFC的的CDocumentCDocument類派生而來。其類的聲明在
17、頭文件類派生而來。其類的聲明在頭文件CMyWinPDoc.hCMyWinPDoc.h中,類的實現(xiàn)在文件中,類的實現(xiàn)在文件CMyWinPDoc.cppCMyWinPDoc.cpp中。中。(3)文檔類文檔類 文檔類的主要作用是保存應用程序的數(shù)據(jù),并提供磁盤文件操作。文檔類的主要作用是保存應用程序的數(shù)據(jù),并提供磁盤文件操作。用戶需要修改文檔類,增加成員變量以存儲應用程序的數(shù)據(jù)、增用戶需要修改文檔類,增加成員變量以存儲應用程序的數(shù)據(jù)、增加成員函數(shù)以獲得和修改數(shù)據(jù),然后為應用程序服務。加成員函數(shù)以獲得和修改數(shù)據(jù),然后為應用程序服務。 (3)文檔類文檔類 CMyWinPCMyWinP應用程序的視圖類名為應
18、用程序的視圖類名為CMyWinPViewCMyWinPView,類的聲明在頭文件,類的聲明在頭文件MyWinPView.hMyWinPView.h中,而類的實現(xiàn)在文件中,而類的實現(xiàn)在文件MyWinPView.cppMyWinPView.cpp中。中。(4)視圖類視圖類 視圖類主要管理視圖窗口,負責用戶數(shù)據(jù)的輸入和數(shù)據(jù)的輸出顯示。視圖類主要管理視圖窗口,負責用戶數(shù)據(jù)的輸入和數(shù)據(jù)的輸出顯示。(4)視圖類視圖類 (5)其他文件其他文件 除以上主要類之外,除以上主要類之外,AppWizard還自動生成還自動生成Stdafx.cpp和和stdafx.h兩個兩個文件。文件。 這兩個文件是每個基于這兩個文件
19、是每個基于MFC程序所必需的,程序所必需的, 用于建立一個預編譯頭用于建立一個預編譯頭文件文件*.pch和一個預定義的類型文件和一個預定義的類型文件stdafx.obj。 MFC包含很多頭文件,如果每次都編譯則比較費時,將包含很多頭文件,如果每次都編譯則比較費時,將afxwin.h、afxext.h、afxcmn.h、afxdisp.h都放在都放在stdafx.h文件中,這樣編譯系統(tǒng)可以文件中,這樣編譯系統(tǒng)可以識別哪些文件已經編譯過,以加速應用程序的編譯過程。識別哪些文件已經編譯過,以加速應用程序的編譯過程。 12.3 輸入輸入/輸出處理程序輸出處理程序 輸入輸出處理是幾乎所有輸入輸出處理是幾
20、乎所有Windows應用程序最基本的功能之一應用程序最基本的功能之一 Windows應用程序通過對鍵盤消息和鼠標消息的響應完成對用戶輸應用程序通過對鍵盤消息和鼠標消息的響應完成對用戶輸入的處理入的處理通過通過GDI提供的繪圖函數(shù)在窗口的客戶區(qū)輸出信息。提供的繪圖函數(shù)在窗口的客戶區(qū)輸出信息。 1.文本輸出程序 文本輸出指在窗口客戶區(qū)特定位置輸出用戶指定的相關文本信息。文本輸出指在窗口客戶區(qū)特定位置輸出用戶指定的相關文本信息。 在在MFCMFC中,中,CDCCDC類實現(xiàn)了對設備環(huán)境的封裝,類實現(xiàn)了對設備環(huán)境的封裝,CDCCDC類有許多成員函數(shù),類有許多成員函數(shù),完成各種與設備環(huán)境有關的操作。完成各
21、種與設備環(huán)境有關的操作。 DrawText函數(shù)函數(shù) DrawText函數(shù)是函數(shù)是CDC類用于文本輸出的成員函數(shù)之一,它的作用是在指類用于文本輸出的成員函數(shù)之一,它的作用是在指定矩形區(qū)域內以當前字體、顏色等屬性及指定的顯示方式顯示字符串。定矩形區(qū)域內以當前字體、顏色等屬性及指定的顯示方式顯示字符串。 DrawText函數(shù)的格式如下:函數(shù)的格式如下: 形式一:形式一:virtual int DrawText( LPCTSTR lpszString, int nCount, LPRECT lpRect, UINT nFormat );形式二:形式二:int DrawText(const CStrin
22、g&str, LPRECT lpRect, UINT nFormat ); 參數(shù)含義參數(shù)含義參數(shù)參數(shù)1pszString1pszString是指向輸出字符串的指針;是指向輸出字符串的指針;參數(shù)參數(shù)nCountnCount指定字符串的長度,如果為指定字符串的長度,如果為-1-1,則,則1pszString1pszString是一個指向以是一個指向以nullnull結尾的字符串的長指針;結尾的字符串的長指針;參數(shù)參數(shù)lpRectlpRect是指向是指向RECTRECT結構的指針;結構的指針;參數(shù)參數(shù)nFormatnFormat用于指定輸出格式;用于指定輸出格式; strstr表示存儲字符串
23、的表示存儲字符串的CStringCString對象。對象。 TextOut函數(shù) TextOutTextOut函數(shù)也是函數(shù)也是CDCCDC類用于文本輸出的成員函數(shù),它的作用是在指定的起點坐類用于文本輸出的成員函數(shù),它的作用是在指定的起點坐標上,以當前字體、顏色等屬性顯示字符串。標上,以當前字體、顏色等屬性顯示字符串。 TextOutTextOut函數(shù)格式函數(shù)格式 : 形式一:形式一:virtual int TextOut(int x,int y,LPCTSTR lpszString, int nCount);形式二:形式二: BOOL TextOut(int x,int y,const CStr
24、ing&str); 參數(shù)含義參數(shù)含義 參數(shù)參數(shù)x,yx,y表示欲顯示字符串起點坐標;表示欲顯示字符串起點坐標;參數(shù)參數(shù)lpszStringlpszString指向要顯示字符串的指針;指向要顯示字符串的指針;參數(shù)參數(shù)nCountnCount指定字符串的長度;指定字符串的長度; strstr存儲字符串的存儲字符串的CStringCString對象。對象。 OnDraw函數(shù) void OnDraw(CDC *pDC) OnDrawOnDraw函數(shù)是視圖類的一個重要成員函數(shù)。函數(shù)是視圖類的一個重要成員函數(shù)。成員函數(shù)成員函數(shù)OnDrawOnDraw管理文檔類成員變量的顯示,即管理文檔類成員變量的
25、顯示,即OnDrawOnDraw函數(shù)主要用于更新函數(shù)主要用于更新視圖窗口。視圖窗口。 GetDocument函數(shù)函數(shù) GetDocument函數(shù)返回一個指向關聯(lián)文檔對象的指針。函數(shù)返回一個指向關聯(lián)文檔對象的指針。通過通過GetDocument函數(shù)返回的文檔對象指針,視圖對象可以調用文檔類函數(shù)返回的文檔對象指針,視圖對象可以調用文檔類及其派生類的成員函數(shù)或直接讀取文檔對象的公有數(shù)據(jù)成員,獲取應用程及其派生類的成員函數(shù)或直接讀取文檔對象的公有數(shù)據(jù)成員,獲取應用程序的數(shù)據(jù)。序的數(shù)據(jù)。GetDocument函數(shù)的格式如下:函數(shù)的格式如下:CDocument *GetDocument() const 2
26、 鍵盤輸入處理程序鍵盤輸入處理程序 Windows環(huán)境下接受到按鍵消息的窗口稱為環(huán)境下接受到按鍵消息的窗口稱為“有輸入焦點有輸入焦點”的窗口。的窗口。 鍵盤消息鍵盤消息 在在Windows應用程序運行時若用戶按下一個鍵,就會產生一個鍵盤消息,如:應用程序運行時若用戶按下一個鍵,就會產生一個鍵盤消息,如: WM_KEYDOWN WM_KEYUP WM_SYSKEYDOWN WM_SYSKEYUP 其中其中WM_SYSKEYDOWN、WM_SYSKEYUP中的中的SYS表示系統(tǒng)按鍵消息,表示系統(tǒng)按鍵消息,由由Windows處理,應用程序只需處理處理,應用程序只需處理WM_KEYDOWN和和WM_K
27、EYUP等非系統(tǒng)按等非系統(tǒng)按鍵消息。鍵消息。 afx_msg void OnChar(UNIT nChar,UINT nRepCnt, UINT nFlags) WM_CHAR的消息處理函數(shù):的消息處理函數(shù): nChar表示按鍵的字符代碼值;表示按鍵的字符代碼值; nRepCnt表示按鍵的重復次數(shù),因此若用戶按下某鍵不放,該參數(shù)值將不斷表示按鍵的重復次數(shù),因此若用戶按下某鍵不放,該參數(shù)值將不斷增加;增加; nFlags用于傳遞按鍵的掃描碼、轉換碼、鍵的先前狀態(tài)、上一次按鍵狀態(tài)等用于傳遞按鍵的掃描碼、轉換碼、鍵的先前狀態(tài)、上一次按鍵狀態(tài)等相關信息。相關信息。 虛擬鍵代碼虛擬鍵代碼 鍵盤上每一個有
28、意義的鍵都對應著一個惟一的標識值,即鍵盤掃描碼,鍵盤上每一個有意義的鍵都對應著一個惟一的標識值,即鍵盤掃描碼,當用戶按下或釋放一個按鍵時,都會產生掃描碼。當用戶按下或釋放一個按鍵時,都會產生掃描碼。掃描碼是依賴于具體設備的。掃描碼是依賴于具體設備的。Windows應用程序中一般使用與具體設備應用程序中一般使用與具體設備無關的虛擬碼。無關的虛擬碼。虛擬碼是虛擬碼是Windows系統(tǒng)內部定義的與設備無關的鍵盤標識,從而有效避系統(tǒng)內部定義的與設備無關的鍵盤標識,從而有效避免了鍵盤對應用程序的影響,提高了應用程序的通用性。免了鍵盤對應用程序的影響,提高了應用程序的通用性。 部分常用的虛擬鍵代碼 虛擬鍵
29、代碼虛擬鍵代碼對應功能鍵對應功能鍵虛擬鍵代碼虛擬鍵代碼對應功能鍵對應功能鍵VK_INSERTInsertVK_DOWN(箭頭向下箭頭向下)VK_LEFT(左箭頭左箭頭)VK_NEXTPageDown鍵鍵VK_RIGHT(右箭頭右箭頭)VK_BACKBackSpace鍵鍵VK_UP(箭頭向上箭頭向上)VK_RETURNEnter鍵鍵VK_AZ字母字母AZVK_TABTab鍵鍵!顯示鍵盤輸入字符程序的實現(xiàn)方法!顯示鍵盤輸入字符程序的實現(xiàn)方法利用利用AppWizard向導生成項目名為向導生成項目名為MyWinKey的應用程序框架。的應用程序框架。向文檔類中添加保存字符的數(shù)據(jù)成員向文檔類中添加保存字符
30、的數(shù)據(jù)成員m_MyText(既可以利用向導添加,也既可以利用向導添加,也可以手工添加可以手工添加)。通過通過ClassWizard向導向視圖類中添加消息處理函數(shù)向導向視圖類中添加消息處理函數(shù)Onchar ,并建立消息,并建立消息映射。映射。編譯并運行應用程序即可實現(xiàn)將鍵盤輸入的字符在窗口客戶區(qū)顯示。編譯并運行應用程序即可實現(xiàn)將鍵盤輸入的字符在窗口客戶區(qū)顯示。 CClientDC Dc(this);/獲得窗口客戶區(qū)設備環(huán)境CCMyWinKeyDoc *pDoc=GetDocument();pDoc-m_MyText+=nChar;Dc.SetTextColor(RGB(0,0,255);Dc.T
31、extOut(0,0,pDoc-m_MyText);3. 鼠標處理程序 Windows應用程序的鼠標消息,可以被任何窗口接受應用程序的鼠標消息,可以被任何窗口接受 只要鼠標移動到該窗口并有鼠標按鍵消息,該窗口就可以接受到鼠標只要鼠標移動到該窗口并有鼠標按鍵消息,該窗口就可以接受到鼠標消息,消息, 與該窗口是否活動窗口或是否帶有輸入焦點沒有關系。與該窗口是否活動窗口或是否帶有輸入焦點沒有關系。 鼠標消息 鼠標在窗口客戶區(qū)移動時產生鼠標在窗口客戶區(qū)移動時產生WM_MOUSEMOVE消息消息.鼠標在客戶區(qū)產生鼠標在客戶區(qū)產生的消息由的消息由Windows應用程序處理,而在窗口邊界、菜單、標題欄和滾動
32、條等非應用程序處理,而在窗口邊界、菜單、標題欄和滾動條等非客戶區(qū)產生的鼠標消息一般由客戶區(qū)產生的鼠標消息一般由Windows系統(tǒng)處理。系統(tǒng)處理。 鼠標消息屬于鼠標消息屬于Windows消息消息鼠標消息均可直接利用鼠標消息均可直接利用Visual C+6.0的的ClassWizard向導添加鼠標消息處理向導添加鼠標消息處理函數(shù)函數(shù)與鼠標消息對應的消息處理函數(shù)如表與鼠標消息對應的消息處理函數(shù)如表12-3所示。所示。 消息處理函數(shù)消息處理函數(shù) 常用鼠標消息處理函數(shù)表 鼠標消息 消息處理函數(shù) 備注WM_MOUSEMOVEvoid OnM o use M o v e ( U IN T nFlags,CP
33、oint point)鼠標移動WM_LBUTTONDOWNvoid OnLButtonDown(UINT nFlags,CPoint point)單 擊 鼠 標左鍵WM_MBUTTONDOWNvoid OnMButtonDown(UINT nFlags,CPoint point)單 擊 鼠 標中鍵WM_RBUTTONDOWNvoid OnRButtonDown(UINT nFlags,CPoint point)單 擊 鼠 標右鍵WM_LBUTTONUPvoid OnLButtonUp(UINT nFlags, CPoint point)鼠 標 左 鍵釋放鼠標消息處理函數(shù)表(續(xù))WM_MBUTT
34、ONUPvoid OnMButtonUp(UINT nFlags, CPoint point)鼠標中鍵鼠標中鍵釋放釋放WM_RBUTTONUPvoid OnRButtonUp(UINT nFlags, CPoint point)鼠標右鍵鼠標右鍵釋放釋放WM_LBUTTONDBLICKvoid OnLButtonDblClk(UINT nFlags, CPoint point)雙擊鼠標雙擊鼠標左鍵左鍵WM_MBUTTONDBLICKvoid OnMButtonDblClk(UINT nFlags, CPoint point)雙擊鼠標雙擊鼠標中鍵中鍵WM_RBUTTONDBLICKvoid OnR
35、ButtonDblClk(UINT nFlags, CPoint point)雙擊鼠標雙擊鼠標右鍵右鍵菜單和工具欄菜單和工具欄在在VC+VC+程序設計中,菜單和工具欄的設計過程相同,需要通過以下程序設計中,菜單和工具欄的設計過程相同,需要通過以下3 3個步個步驟實現(xiàn):驟實現(xiàn):(1 1)通過資源編輯器修改或建立菜單與工具欄。)通過資源編輯器修改或建立菜單與工具欄。(2 2)通過)通過MFCMFC向導建立各菜單項或工具命令按鈕的消息響應函數(shù)。向導建立各菜單項或工具命令按鈕的消息響應函數(shù)。(3 3)通過應用程序框架提供的菜單或工具欄加載命令,將菜單或工具欄加)通過應用程序框架提供的菜單或工具欄加載命
36、令,將菜單或工具欄加載到應用程序框架中。載到應用程序框架中。1 1 直接修改應用程序框架的菜單直接修改應用程序框架的菜單設計菜單,并通過菜單完成畫線、畫橢圓、畫矩形設計菜單,并通過菜單完成畫線、畫橢圓、畫矩形菜單設計過程如下菜單設計過程如下 1用菜單編輯器添加菜單欄及菜單項用菜單編輯器添加菜單欄及菜單項(1)打開項目文件)打開項目文件My.Dsw,選擇工程管理窗口中的,選擇工程管理窗口中的ResourceView標標簽,展開簽,展開My resources中的中的Menu菜單資源列表項,在其中可以見菜單資源列表項,在其中可以見到到IDR_MAINFRAME,它就是應用程序菜單的標識,雙擊該標識
37、將,它就是應用程序菜單的標識,雙擊該標識將在右邊編輯窗口中見到它所代表的菜單內容。在右邊編輯窗口中見到它所代表的菜單內容。圖12-27NoImage1用菜單編輯器添加菜單欄及菜單項用菜單編輯器添加菜單欄及菜單項(2)右鍵單擊圖中)右鍵單擊圖中“幫助幫助”菜單后面的虛線框,將彈出屬性對話框。菜單后面的虛線框,將彈出屬性對話框。在在“C標題標題”編輯框中輸入編輯框中輸入“繪圖繪圖”。由于。由于“繪圖繪圖”是主菜單,選擇是主菜單,選擇它時并不需要執(zhí)行任何程序功能,所以其屬性對話框中的它時并不需要執(zhí)行任何程序功能,所以其屬性對話框中的“ID”是禁是禁用的。用的。1 直接修改應用程序框架的菜單圖12-2
38、8(3)完成上面的步驟后,在)完成上面的步驟后,在“繪圖繪圖”菜單欄的下面將會出現(xiàn)虛線框,右鍵菜單欄的下面將會出現(xiàn)虛線框,右鍵單擊它并將其單擊它并將其“標題標題”設置為設置為“直線直線”,將其,將其“ID”設置為設置為“ID_LINE”。(4)用同樣的方法在)用同樣的方法在“直線直線”下面添加下面添加“矩形矩形”,“橢圓橢圓”菜單項,并將菜單項,并將矩形的矩形的ID設置為設置為“ID_RECT”,將橢圓的,將橢圓的ID設置為設置為“ID_ELLIPSE”。(5)修改或刪除菜單欄中不需要的菜單,如刪除其中的)修改或刪除菜單欄中不需要的菜單,如刪除其中的“幫助幫助”菜單,方菜單,方法是選中該菜單,
39、然后按法是選中該菜單,然后按Delete鍵或選擇鍵或選擇VC+“編輯編輯”菜單中的菜單中的“刪除刪除”命令。命令。1 直接修改應用程序框架的菜單直接修改應用程序框架的菜單上面的操作過程將建立如圖所示的菜單。上面的操作過程將建立如圖所示的菜單。1 直接修改應用程序框架的菜單直接修改應用程序框架的菜單2利用向導生成菜單消息響應函數(shù)利用向導生成菜單消息響應函數(shù)(1)按快捷鍵)按快捷鍵Ctrl+W鍵啟動鍵啟動MFC的類向導,如圖所示。的類向導,如圖所示。NoImage(2)選擇類向導中的)選擇類向導中的“Message Maps”標簽,在標簽,在“Class name”下拉列下拉列表中選擇表中選擇“C
40、MyView”類,在類,在“Object IDs”列表中具有所有的菜單標識,列表中具有所有的菜單標識,找到并選中找到并選中“ID_LINE”菜單標識,并選中菜單標識,并選中“Messages:”列表中的列表中的“COMMAND”,然后單擊命令按鈕,然后單擊命令按鈕“Add Function”。該操作會為。該操作會為CMyView類添加消息響應函數(shù)類添加消息響應函數(shù)OnLine。(3)用同樣的方法為)用同樣的方法為CMyView類增加類增加ID_RECT、ID_ELLIPSE和和ID_STUDENT菜單標識的消息響應函數(shù):菜單標識的消息響應函數(shù):OnRect、OnEllipse、OnStuden
41、t。 經過上述操作,經過上述操作,MFC向導會在向導會在CMyView類中完成下面的類中完成下面的3件事。件事。 向導將在向導將在CMyView類中添加消息響應函數(shù)的聲明,如下所示:類中添加消息響應函數(shù)的聲明,如下所示:class CMyView : public CView protected: afx_msg void OnLine(); afx_msg void OnEllipse(); afx_msg void OnRect(); afx_msg void OnStudent();向導添加的菜單消向導添加的菜單消息處理函數(shù)息處理函數(shù) 向導將在程序實現(xiàn)文件向導將在程序實現(xiàn)文件CMyVie
42、w.cpp的消息映射宏中,添加菜單項與消的消息映射宏中,添加菜單項與消息處理函數(shù)之間的映射,如下所示:息處理函數(shù)之間的映射,如下所示:BEGIN_MESSAGE_MAP(CMyView, CView) /AFX_MSG_MAP(CMyView) ON_COMMAND(ID_LINE, OnLine) ON_COMMAND(ID_ELLIPSE, OnEllipse) ON_COMMAND(ID_RECT, OnRect) ON_COMMAND(ID_STUDENT, OnStudent) /AFX_MSG_MAPEND_MESSAGE_MAP()紅字是向導添加的紅字是向導添加的菜單消息映射宏菜
43、單消息映射宏2 2利用向導生成菜單消息響應函數(shù)利用向導生成菜單消息響應函數(shù) 向導將在類的程序文件向導將在類的程序文件CMyView.cppCMyView.cpp中添加消息處理函數(shù)的雛形,如下中添加消息處理函數(shù)的雛形,如下所示。所示。void CMyView:OnLine() / TODO: Add your command handler code here向導添加的菜單消向導添加的菜單消息處理函數(shù)雛形息處理函數(shù)雛形 在向導生成的消息處理函數(shù)中添加函數(shù)功能代碼在向導生成的消息處理函數(shù)中添加函數(shù)功能代碼void CMyView:OnLine()/選擇選擇“繪圖繪圖|直線直線”菜單執(zhí)行該函數(shù)菜單執(zhí)
44、行該函數(shù) CClientDC dc(this);/獲取設備環(huán)境獲取設備環(huán)境 dc.MoveTo(50,100);/將光標移到將光標移到(50,100)位置位置 dc.LineTo(100,300);/從光標位置即從光標位置即(50,100)畫直線到畫直線到(100,300)void CMyView:OnEllipse()/選擇選擇“繪圖繪圖|橢圓橢圓”菜單執(zhí)行該函數(shù)菜單執(zhí)行該函數(shù) CClientDC dc(this); dc.Ellipse(100,100,200,300);void CMyView:OnRect()/選擇選擇“繪圖繪圖|矩形矩形”菜單執(zhí)行該函數(shù)菜單執(zhí)行該函數(shù) CClientD
45、C dc(this); dc.Rectangle(300,100,500,200);2 2 建立建立新菜單欄【例例】 為上一例重新建立一新菜單,實現(xiàn)同樣的功能。為上一例重新建立一新菜單,實現(xiàn)同樣的功能。實現(xiàn)過程簡述如下實現(xiàn)過程簡述如下 (1 1)在)在VC+VC+中打開例上例建立的項目文件中打開例上例建立的項目文件My.dswMy.dsw,在工程管理窗口,在工程管理窗口“ResourceView”ResourceView”中展開中展開“My resources”My resources”資源,右鍵單擊資源,右鍵單擊“Menu”,并從彈出的快捷菜單中選擇并從彈出的快捷菜單中選擇“Insert M
46、enu”,VC+VC+將插入一個標識為將插入一個標識為“IDR_MENU1”的菜單。用前面的方法添加的菜單。用前面的方法添加“畫圖畫圖”和和“學生學生”菜單,菜單,如圖所示。如圖所示。圖12-32新菜單新菜單IDR_MENU1設置其中菜單項設置其中菜單項“直線直線”的的ID為為“IDR_LINE1”,“矩形矩形”的的ID為為“IDR_RECT1”、“橢圓橢圓”的的ID為為“IDR_ELLIPSE1”,“輸入學生檔輸入學生檔案案”的的ID為為“ID_STUDENT1”。(2 2)按快捷鍵)按快捷鍵Ctrl+WCtrl+W,彈出如圖,彈出如圖12-3312-33(a a)所示的對話框,選擇)所示的
47、對話框,選擇“Select Select an existing class”an existing class”,然后單擊,然后單擊“OK”O(jiān)K”按鈕,彈出如圖按鈕,彈出如圖12-3312-33(b b)所)所示對話框,選擇示對話框,選擇“CMyView”CMyView”,然后單擊,然后單擊“Select”Select”按鈕。按鈕。3)通過消息映射向導“Message Maps”建立菜單項IDR_LINE1、IDR_RECT1、IDR_ELLIPSE1和ID_STUDENT1的消息映射函數(shù)和函數(shù)代碼,方法和代碼同前例。4)加載新菜單。打開CMyApp:InitInstanceCMyApp:InitInstance函數(shù),將其中建立單文檔模板時指定的菜單標識IDR_MAINFRAMEIDR_MAINFRAME修改為新菜單的標識IDR_MENU1IDR_MENU1,如下所示。BOOL CMyApp:InitInstance() CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate(IDR_MENU1 , RUNTIME_CLASS(CMyDoc), RUNTIME_CLASS(CMainFrame), RUNT
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 專利使用合同范例
- 代賬記賬合同范例
- 上海徐匯金杯租車合同范例
- 作物秸稈加工銷售合同范例
- 買賣物品交易合同范例
- 做紗網合同范例
- 事務委托合同范例
- 教育培訓機構增資擴股股權合作與課程體系升級合同
- 國際房產租賃收益分成與租賃合同備案及續(xù)簽合同
- 網絡虛擬財產稅費繳納及代繳合同
- 鋁塑板發(fā)光字招牌施工方案
- 舊房改造施工設計方案
- DBJT15-工程泥漿原地處理和資源化利用技術標準
- 農貿批發(fā)市場管理制度(3篇)
- 《糖尿病監(jiān)測及意義》課件
- 2025年廣西貴港市公安警務輔助人員招聘287人歷年高頻重點提升(共500題)附帶答案詳解
- 江蘇省南京市(2024年-2025年小學六年級語文)部編版期末考試(下學期)試卷及答案
- 跨學科實踐活動5基于碳中和理念設計低碳行動方案(教學課件)九年級化學上冊(人教版2024)
- 《大學心理》筆記(1-14章節(jié))
- 《日語聽說》課件-第六課 餐館就餐
- 【MOOC】遙感原理與應用-西北大學 中國大學慕課MOOC答案
評論
0/150
提交評論