MFC典型應(yīng)用程序設(shè)計(jì)1 (2)PPT課件_第1頁
MFC典型應(yīng)用程序設(shè)計(jì)1 (2)PPT課件_第2頁
MFC典型應(yīng)用程序設(shè)計(jì)1 (2)PPT課件_第3頁
MFC典型應(yīng)用程序設(shè)計(jì)1 (2)PPT課件_第4頁
MFC典型應(yīng)用程序設(shè)計(jì)1 (2)PPT課件_第5頁
已閱讀5頁,還剩69頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、 第第12章章 MFC典型應(yīng)用程序設(shè)計(jì)典型應(yīng)用程序設(shè)計(jì) 課程設(shè)計(jì)題目課程設(shè)計(jì)題目3.考勤信息記錄了學(xué)生的缺課情況,它包括:缺課日期、第幾節(jié)課、課程名稱、學(xué)生姓名、缺課類型(遲到、早退、請假及曠課)。試設(shè)計(jì)一考勤管理系統(tǒng),使之能提供以下功能: 1)錄入學(xué)生的缺課記錄; 2)修改某個(gè)學(xué)生的缺課記錄; 3)查詢某個(gè)學(xué)生的缺課情況; 4)統(tǒng)計(jì)某段時(shí)間內(nèi),曠課學(xué)生姓名及曠課次數(shù),按曠課次數(shù)由多到少排序; 5)統(tǒng)計(jì)某段時(shí)間內(nèi),有學(xué)生曠課的課程及曠課人次,按曠課人次由多到少排序; 6)系統(tǒng)以菜單方式工作。12.1 消息處理機(jī)制消息處理機(jī)制 WindowsWindows程序與其他程序最大的不同之處在于使程序與

2、其他程序最大的不同之處在于使用消息機(jī)制。用消息機(jī)制。 WindowsWindows程序中所發(fā)生的一切都可以用消息表示,程序中所發(fā)生的一切都可以用消息表示,消息用于告訴操作系統(tǒng)所發(fā)生的事情,如按鍵操消息用于告訴操作系統(tǒng)所發(fā)生的事情,如按鍵操作或鼠標(biāo)操作等。作或鼠標(biāo)操作等。 MFCMFC應(yīng)用程序也使用基于消息的事件驅(qū)動(dòng)機(jī)制,應(yīng)用程序也使用基于消息的事件驅(qū)動(dòng)機(jī)制,而且而且MFCMFC提供的消息處理機(jī)制使得用戶可以更加提供的消息處理機(jī)制使得用戶可以更加方便、簡易的處理消息。方便、簡易的處理消息。在在WindowsWindows中,所有消息都是通過消息名進(jìn)行訪問中,所有消息都是通過消息名進(jìn)行訪問的,但不

3、同類型的消息由應(yīng)用程序的不同部分進(jìn)的,但不同類型的消息由應(yīng)用程序的不同部分進(jìn)行處理。行處理。 1. MFC1. MFC消息種類消息種類 消息機(jī)制是消息機(jī)制是 Windows應(yīng)用程序的核心,應(yīng)用程序的核心,MFC中的消息可以分為:中的消息可以分為: Windows消息消息 控件通知消息控件通知消息 定時(shí)消息定時(shí)消息 命令消息命令消息 12.1 消息處理機(jī)制消息處理機(jī)制 Windows消息消息 WindowsWindows消息通常指以消息通常指以WMWM開頭的消息,但開頭的消息,但WM_COMMANDWM_COMMAND除外。除外。鍵盤消息和鼠標(biāo)消息都屬于鍵盤消息和鼠標(biāo)消息都屬于WindowsWi

4、ndows消息,消息,WindowsWindows消息由窗口和視圖進(jìn)行處理。消息由窗口和視圖進(jìn)行處理。 WindowsWindows消息通常帶有若干個(gè)參數(shù)傳遞給消息通常帶有若干個(gè)參數(shù)傳遞給消息處理函數(shù),這些參數(shù)為處理函數(shù)正確消息處理函數(shù),這些參數(shù)為處理函數(shù)正確地處理消息提供了充分的信息。地處理消息提供了充分的信息。 控件通知消息是指當(dāng)控件的狀態(tài)發(fā)生改變時(shí),控件通知消息是指當(dāng)控件的狀態(tài)發(fā)生改變時(shí),控件向其父窗口發(fā)送的消息??丶蚱涓复翱诎l(fā)送的消息。 MFCMFC對控件通知消息的傳遞方式與其他以對控件通知消息的傳遞方式與其他以WMWM開頭的開頭的WindowsWindows消息一樣,但消息一樣,但

5、BN_CLICKEDBN_CLICKED例例外,該消息的傳遞方式與命令消息的傳遞機(jī)外,該消息的傳遞方式與命令消息的傳遞機(jī)制相同。制相同。對于對于WindowsWindows消息和控件通知消息,消息和控件通知消息,MFCMFC將消將消息傳遞給相應(yīng)的窗口處理。息傳遞給相應(yīng)的窗口處理。 控件通知消息控件通知消息 定時(shí)消息定時(shí)消息 定時(shí)消息也是Windows的一類重要消息。當(dāng)需要應(yīng)用程序每隔一個(gè)指定的時(shí)間間隔便執(zhí)行某一特定操作時(shí),就需要使用定時(shí)消息WM_TIMER。在進(jìn)行定時(shí)操作時(shí),用戶需要調(diào)用SetTimer函數(shù)創(chuàng)建一個(gè)定時(shí)器,并設(shè)置定時(shí)器的事件標(biāo)志nIDEvent及時(shí)間間隔nElapse,然后編寫

6、消息WM_TIMER的消息處理函數(shù)OnTimer(),實(shí)現(xiàn)定時(shí)操作。 命令消息 命 令 消 息 是 來 自 于 用 戶 界 面 對 象 的WM_COMMAND消息。包括菜單、工具欄按鈕和加速鍵都屬于命令消息等。即每當(dāng)用戶選擇一個(gè)菜單項(xiàng)、單擊一個(gè)按鈕或需要告訴操作系統(tǒng)應(yīng)當(dāng)執(zhí)行什么操作時(shí),則發(fā)送一條WM_COMMAND命令消息。W M _ C O M M A N D 消 息 的 消 息 映 射 宏 為OnCommand()。所有命令消息都包含有一個(gè)相同類型的參數(shù),即該命令消息需要操作的資源ID值,由ID值映射消息處理函數(shù)。2 MFC消息映射機(jī)制 消息映射是指將消息與處理函數(shù)相聯(lián)消息映射是指將消息與

7、處理函數(shù)相聯(lián)系,即當(dāng)系統(tǒng)產(chǎn)生一條消息時(shí),它能找系,即當(dāng)系統(tǒng)產(chǎn)生一條消息時(shí),它能找到處理該消息的函數(shù)。到處理該消息的函數(shù)。Visual C+的消息映射宏 消息映射宏消息映射宏 功功 能能DECLARE_MESSAGE_MAP在頭文件中使用,用于聲明在源文件中存在消息在頭文件中使用,用于聲明在源文件中存在消息映射映射BEGIN_MESSAGE_MAP表示消息映射的開始,用于源代碼文件中表示消息映射的開始,用于源代碼文件中END_MESSAGE_MAP表示消息映射的結(jié)束,用于源代碼文件中表示消息映射的結(jié)束,用于源代碼文件中ON_COMMAND將特定的命令消息映射到類的成員函數(shù),即使用將特定的命令消息

8、映射到類的成員函數(shù),即使用該成員函數(shù)處理消息該成員函數(shù)處理消息ON_COMMAND_RANGE將一組特定的命令消息映射到類的成員函數(shù)將一組特定的命令消息映射到類的成員函數(shù)Visual C+的消息映射分為兩個(gè)方面:的消息映射分為兩個(gè)方面: 一是在頭文件一是在頭文件.h中處理中處理 一是在實(shí)現(xiàn)文件一是在實(shí)現(xiàn)文件.cpp中處理中處理 消息映射宏消息映射宏在頭文件MyWinp.h中的消息映射代碼 /AFX_MSG(CMyWinPApp)afx_msg void OnAppAbout();/NOTE-the ClassWizard will add and remove member functions

9、 here./DO NOT EDIT what you see in these blocks of generated code !/AFX_MSGDECLARE_MESSAGE_MAP()在實(shí)現(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 the

10、se blocks of generated code!/AFX_MSG_MAP/Standard file based document commandsON_COMMAND(ID_FILE_NEW,CWinApp:OnFileNew)ON_COMMAND(ID_FILE_OPEN,CWinApp:OnFileOpen)/Standard print setup commandON_COMMAND(ID_FILE_PRINT_SETUP,CWinApp: OnFilePrintSetup)END_MESSAGE_MAP()消息映射宏的使用宏宏DECLARE_MESSAGE_MAP用用于類聲明

11、文件的結(jié)束處,即在于類聲明文件的結(jié)束處,即在.h文件的文件的結(jié)束處。結(jié)束處。宏宏BEGIN_MESSAGE_MAP和和END_MESSAGE_MAP用于類的實(shí)現(xiàn)用于類的實(shí)現(xiàn)文件(文件(.cpp)中實(shí)現(xiàn)消息映射,而且這)中實(shí)現(xiàn)消息映射,而且這兩個(gè)宏必須配合使用。兩個(gè)宏必須配合使用。 在在 B E G I N _ M E S S A G E _ M A P 與與END_MESSAGE_MAP中間列出了消息映射的中間列出了消息映射的各個(gè)入口。例如,以下消息映射語句:各個(gè)入口。例如,以下消息映射語句:ON_COMMAND(ID_FILE_OPEN, CWinApp:OnFileOpen)表示當(dāng)用戶單擊

12、了菜單項(xiàng)表示當(dāng)用戶單擊了菜單項(xiàng)File|Open時(shí),則發(fā)送時(shí),則發(fā)送WM_COMMAND消息,該消息找到此語句,發(fā)消息,該消息找到此語句,發(fā)現(xiàn)資源現(xiàn)資源ID值與資源值與資源ID_FILE_OPEN匹配,則執(zhí)匹配,則執(zhí)行該語句中指定的成員函數(shù)行該語句中指定的成員函數(shù)CWinApp:OnFileOpen ()。 消息映射宏的使用消息映射宏的使用(續(xù)續(xù)) 向?qū)驅(qū)ppWizard生成的單文檔生成的單文檔應(yīng)用程序一般包括四個(gè)基本類:應(yīng)用程序一般包括四個(gè)基本類:應(yīng)用程序類應(yīng)用程序類主框架窗口類主框架窗口類文檔類文檔類視圖類視圖類其他相關(guān)文件。其他相關(guān)文件。12.2應(yīng)用程序分析 1.AppWizard向

13、導(dǎo)生成的類和文件向?qū)傻念惡臀募?單擊項(xiàng)目工作區(qū)的單擊項(xiàng)目工作區(qū)的ClassViewClassView標(biāo)簽,則顯示標(biāo)簽,則顯示CMainFrameCMainFrame(主框架窗口類主框架窗口類)、)、CMyWinPAppCMyWinPApp(應(yīng)用程序類應(yīng)用程序類)、)、CMyWinPDocCMyWinPDoc( 文檔類文檔類)和)和CMyWipViewCMyWipView( 視圖類視圖類)等,這是應(yīng)用程序)等,這是應(yīng)用程序MyWinPMyWinP的全部類。的全部類。1.AppWizard向?qū)傻念惡臀募驅(qū)傻念惡臀募?利用利用AppWizardAppWizard向?qū)?chuàng)建應(yīng)用程序框架時(shí),

14、產(chǎn)生向?qū)?chuàng)建應(yīng)用程序框架時(shí),產(chǎn)生的各派生類將被創(chuàng)建單獨(dú)的源文件。的各派生類將被創(chuàng)建單獨(dú)的源文件。單擊某一類名(如單擊某一類名(如CMyWinPViewCMyWinPView)前的)前的“+”+”號(hào),號(hào),則列出該類的成員函數(shù),雙擊類名或成員函數(shù)名則列出該類的成員函數(shù),雙擊類名或成員函數(shù)名( (如如GetDocument)GetDocument),則源代碼編輯區(qū)顯示出該類或,則源代碼編輯區(qū)顯示出該類或該成員函數(shù)的實(shí)現(xiàn)代碼。該成員函數(shù)的實(shí)現(xiàn)代碼。 觀察應(yīng)用程序觀察應(yīng)用程序MyWinP 的類和文件的類和文件 MyWinPMyWinP程序的應(yīng)用程序類名為程序的應(yīng)用程序類名為CMyWinPApp CMyW

15、inPApp ,由,由CwinAppCwinApp類派生而來。類派生而來。 該類的每一個(gè)對象代表一個(gè)應(yīng)用程序,該類的每一個(gè)對象代表一個(gè)應(yīng)用程序,程序中默認(rèn)定義一個(gè)全局對象程序中默認(rèn)定義一個(gè)全局對象theApptheApp。(1)應(yīng)用程序類應(yīng)用程序類 CMyWinPAppCMyWinPApp類的類的功能功能是是管理整個(gè)應(yīng)用程序管理整個(gè)應(yīng)用程序,負(fù)責(zé)程序的啟動(dòng)、初始化、窗口的創(chuàng)建以及從負(fù)責(zé)程序的啟動(dòng)、初始化、窗口的創(chuàng)建以及從WindowsWindows中獲取消息并將消息分發(fā)到適當(dāng)?shù)哪康闹蝎@取消息并將消息分發(fā)到適當(dāng)?shù)哪康牡亍5亍?CMyWinPAppCMyWinPApp類的聲明在頭文件類的聲明在頭文

16、件MyWinPApp.hMyWinPApp.h中,類的實(shí)現(xiàn)在中,類的實(shí)現(xiàn)在CMyWinPApp.cppCMyWinPApp.cpp中。中。(1)應(yīng)用程序類應(yīng)用程序類 CMyWinP應(yīng)用程序的主框架窗口類名為應(yīng)用程序的主框架窗口類名為CMainFrame,它由,它由CWnd的一個(gè)子類派生的一個(gè)子類派生而來,該子類即而來,該子類即CFrameWnd。 C M a i n F r a m e 類 的 聲 明 在 頭 文 件類 的 聲 明 在 頭 文 件M a i n F r a m e . h 中 , 類 的 實(shí) 現(xiàn) 在 文 件中 , 類 的 實(shí) 現(xiàn) 在 文 件MainFrame.cpp中。中。(2

17、)主框架架窗口類主框架架窗口類 CMainFrame類管理主框架窗口,并擁有類管理主框架窗口,并擁有一些如菜單、工具欄和狀態(tài)欄等控件,同時(shí),一些如菜單、工具欄和狀態(tài)欄等控件,同時(shí),它還扮演轉(zhuǎn)發(fā)菜單和工具欄消息的角色。它還扮演轉(zhuǎn)發(fā)菜單和工具欄消息的角色。 (2)主框架架窗口類主框架架窗口類 C M y W i n PC M y W i n P 應(yīng) 用 程 序 的 文 檔 類 名 為應(yīng) 用 程 序 的 文 檔 類 名 為CMyWinPDocCMyWinPDoc,從,從MFCMFC的的CDocumentCDocument類派生而來。類派生而來。其類的聲明在頭文件其類的聲明在頭文件CMyWinPDoc

18、.hCMyWinPDoc.h中,類的中,類的實(shí)現(xiàn)在文件實(shí)現(xiàn)在文件CMyWinPDoc.cppCMyWinPDoc.cpp中。中。(3)文檔類文檔類 文檔類的主要作用是保存應(yīng)用程序的數(shù)文檔類的主要作用是保存應(yīng)用程序的數(shù)據(jù),并提供磁盤文件操作。據(jù),并提供磁盤文件操作。用戶需要修改文檔類,用戶需要修改文檔類,增加成員變量增加成員變量以以存儲(chǔ)存儲(chǔ)應(yīng)用程序的應(yīng)用程序的數(shù)據(jù)數(shù)據(jù)、增加成員函數(shù)增加成員函數(shù)以獲得以獲得和和修改數(shù)據(jù)修改數(shù)據(jù),然后為應(yīng)用程序服務(wù)。,然后為應(yīng)用程序服務(wù)。 (3)文檔類文檔類 CMyWinPCMyWinP應(yīng)用程序的視圖類名為應(yīng)用程序的視圖類名為CMyWinPViewCMyWinPVi

19、ew,類的聲明在頭文件類的聲明在頭文件MyWinPView.hMyWinPView.h中,而類的實(shí)現(xiàn)在中,而類的實(shí)現(xiàn)在文件文件MyWinPView.cppMyWinPView.cpp中。中。(4)視圖類視圖類 視圖類主要管理視圖窗口,負(fù)責(zé)視圖類主要管理視圖窗口,負(fù)責(zé)用戶數(shù)據(jù)用戶數(shù)據(jù)的輸入的輸入和數(shù)據(jù)的和數(shù)據(jù)的輸出顯示輸出顯示。(4)視圖類視圖類 (5)其他文件其他文件 除以上主要類之外,除以上主要類之外,AppWizard還自動(dòng)生成還自動(dòng)生成Stdafx.cpp和和stdafx.h兩個(gè)文件。兩個(gè)文件。 這兩個(gè)文件是每個(gè)基于這兩個(gè)文件是每個(gè)基于MFC程序所必需的,程序所必需的, 用于用于建立一個(gè)

20、預(yù)編譯頭文件建立一個(gè)預(yù)編譯頭文件*.pch和一個(gè)預(yù)定義的類型文件和一個(gè)預(yù)定義的類型文件stdafx.obj。 MFC包含很多頭文件,如果每次都編譯則比較費(fèi)時(shí),包含很多頭文件,如果每次都編譯則比較費(fèi)時(shí),將將afxwin.h、afxext.h、afxcmn.h、afxdisp.h都放在都放在stdafx.h文件中,這樣編譯系統(tǒng)可以識(shí)別哪些文件已經(jīng)文件中,這樣編譯系統(tǒng)可以識(shí)別哪些文件已經(jīng)編譯過,以加速應(yīng)用程序的編譯過程。編譯過,以加速應(yīng)用程序的編譯過程。 12.3 輸入輸入/輸出處理程序輸出處理程序 輸入輸出處理是幾乎所有輸入輸出處理是幾乎所有Windows應(yīng)應(yīng)用程序最基本的功能之一用程序最基本的功

21、能之一 Windows應(yīng)用程序通過對鍵盤消息應(yīng)用程序通過對鍵盤消息和鼠標(biāo)消息的響應(yīng)完成對用戶輸入的處和鼠標(biāo)消息的響應(yīng)完成對用戶輸入的處理理通過通過GDI提供的繪圖函數(shù)在窗口的客提供的繪圖函數(shù)在窗口的客戶區(qū)輸出信息。戶區(qū)輸出信息。 1.文本輸出程序 文本輸出指在窗口客戶區(qū)特定位置輸出用文本輸出指在窗口客戶區(qū)特定位置輸出用戶指定的相關(guān)文本信息。戶指定的相關(guān)文本信息。 在在MFCMFC中,中,CDCCDC類實(shí)現(xiàn)了對設(shè)備環(huán)境的封裝,類實(shí)現(xiàn)了對設(shè)備環(huán)境的封裝,CDCCDC類有許多成員函數(shù),完成各種與設(shè)備環(huán)境有類有許多成員函數(shù),完成各種與設(shè)備環(huán)境有關(guān)的操作。關(guān)的操作。 DrawText函數(shù)函數(shù) DrawT

22、ext函數(shù)是函數(shù)是CDC類用于文本輸出的成員類用于文本輸出的成員函數(shù)之一,它的作用是在指定矩形區(qū)域內(nèi)以當(dāng)前函數(shù)之一,它的作用是在指定矩形區(qū)域內(nèi)以當(dāng)前字體、顏色等屬性及指定的顯示方式顯示字符串。字體、顏色等屬性及指定的顯示方式顯示字符串。 DrawText函數(shù)的格式如下:函數(shù)的格式如下: 形式一:形式一:virtual int DrawText( LPCTSTR lpszString, int nCount, LPRECT lpRect, UINT nFormat );形式二:形式二:int DrawText(const CString&str, LPRECT lpRect, UINT

23、nFormat ); 參數(shù)含義參數(shù)含義參數(shù)參數(shù)1pszString1pszString是指向輸出字符串的指針;是指向輸出字符串的指針;參數(shù)參數(shù)nCountnCount指定字符串的長度,如果為指定字符串的長度,如果為-1-1,則則1pszString1pszString是一個(gè)指向以是一個(gè)指向以nullnull結(jié)尾的字符串結(jié)尾的字符串的長指針;的長指針;參數(shù)參數(shù)lpRectlpRect是指向是指向RECTRECT結(jié)構(gòu)的指針;結(jié)構(gòu)的指針;參數(shù)參數(shù)nFormatnFormat用于指定輸出格式;用于指定輸出格式; strstr表示存儲(chǔ)字符串的表示存儲(chǔ)字符串的CStringCString對象。對象。 Te

24、xtOut函數(shù) TextOutTextOut函數(shù)也是函數(shù)也是CDCCDC類用于文本輸出的成員函數(shù),類用于文本輸出的成員函數(shù),它的作用是在指定的起點(diǎn)坐標(biāo)上,以當(dāng)前字體、顏它的作用是在指定的起點(diǎn)坐標(biāo)上,以當(dāng)前字體、顏色等屬性顯示字符串。色等屬性顯示字符串。 TextOutTextOut函數(shù)格式函數(shù)格式 : 形式一:形式一:virtual int TextOut(int x,int y,LPCTSTR lpszString, int nCount);形式二:形式二: BOOL TextOut(int x,int y,const CString&str); 參數(shù)含義參數(shù)含義 參數(shù)參數(shù)x,yx,

25、y表示欲顯示字符串起點(diǎn)坐標(biāo);表示欲顯示字符串起點(diǎn)坐標(biāo);參數(shù)參數(shù)lpszStringlpszString指向要顯示字符串的指向要顯示字符串的指針;指針;參數(shù)參數(shù)nCountnCount指定字符串的長度;指定字符串的長度; strstr存儲(chǔ)字符串的存儲(chǔ)字符串的CStringCString對象。對象。 OnDraw函數(shù) void OnDraw(CDC *pDC) OnDrawOnDraw函數(shù)是視圖類的一個(gè)重要成員函數(shù)。函數(shù)是視圖類的一個(gè)重要成員函數(shù)。成員函數(shù)成員函數(shù)OnDrawOnDraw管理文檔類成員變量的顯示,管理文檔類成員變量的顯示,即即OnDrawOnDraw函數(shù)主要用于更新視圖窗口。函數(shù)主

26、要用于更新視圖窗口。 GetDocument函數(shù)函數(shù) GetDocument函數(shù)返回一個(gè)指向關(guān)聯(lián)文檔對函數(shù)返回一個(gè)指向關(guān)聯(lián)文檔對象的指針。象的指針。通過通過GetDocument函數(shù)返回的文檔對象指針,函數(shù)返回的文檔對象指針,視圖對象可以調(diào)用文檔類及其派生類的成員函視圖對象可以調(diào)用文檔類及其派生類的成員函數(shù)或直接讀取文檔對象的公有數(shù)據(jù)成員,獲取數(shù)或直接讀取文檔對象的公有數(shù)據(jù)成員,獲取應(yīng)用程序的數(shù)據(jù)。應(yīng)用程序的數(shù)據(jù)。GetDocument函數(shù)的格式如下:函數(shù)的格式如下:CDocument *GetDocument() const 2 鍵盤輸入處理程序鍵盤輸入處理程序 Windows環(huán)境下接受到按

27、鍵消息的窗口稱環(huán)境下接受到按鍵消息的窗口稱為為“有輸入焦點(diǎn)有輸入焦點(diǎn)”的窗口。的窗口。 鍵盤消息鍵盤消息 在在Windows應(yīng)用程序運(yùn)行時(shí)若用戶按下一個(gè)鍵,應(yīng)用程序運(yùn)行時(shí)若用戶按下一個(gè)鍵,就會(huì)產(chǎn)生一個(gè)鍵盤消息,如:就會(huì)產(chǎn)生一個(gè)鍵盤消息,如: WM_KEYDOWN WM_KEYUP WM_SYSKEYDOWN WM_SYSKEYUP 其中其中WM_SYSKEYDOWN、WM_SYSKEYUP中的中的SYS表示系統(tǒng)按鍵消息,表示系統(tǒng)按鍵消息,由由Windows處理處理,應(yīng)用應(yīng)用程序只需處理程序只需處理WM_KEYDOWN和和WM_KEYUP等非等非系統(tǒng)按鍵消息。系統(tǒng)按鍵消息。 afx_msg vo

28、id OnChar(UNIT nChar,UINT nRepCnt, UINT nFlags) WM_CHAR的消息處理函數(shù):的消息處理函數(shù): nChar表示按鍵的字符代碼值;表示按鍵的字符代碼值; nRepCnt表示按鍵的重復(fù)次數(shù),因此若用戶按表示按鍵的重復(fù)次數(shù),因此若用戶按下某鍵不放,該參數(shù)值將不斷增加;下某鍵不放,該參數(shù)值將不斷增加; nFlags用于傳遞按鍵的掃描碼、轉(zhuǎn)換碼、鍵的先用于傳遞按鍵的掃描碼、轉(zhuǎn)換碼、鍵的先前狀態(tài)、上一次按鍵狀態(tài)等相關(guān)信息。前狀態(tài)、上一次按鍵狀態(tài)等相關(guān)信息。 虛擬鍵代碼虛擬鍵代碼 鍵盤上每一個(gè)有意義的鍵都對應(yīng)著一個(gè)惟一的鍵盤上每一個(gè)有意義的鍵都對應(yīng)著一個(gè)惟一的

29、標(biāo)識(shí)值,即鍵盤掃描碼,當(dāng)用戶按下或釋放一個(gè)標(biāo)識(shí)值,即鍵盤掃描碼,當(dāng)用戶按下或釋放一個(gè)按鍵時(shí),都會(huì)產(chǎn)生掃描碼。按鍵時(shí),都會(huì)產(chǎn)生掃描碼。掃描碼是依賴于具體設(shè)備的。掃描碼是依賴于具體設(shè)備的。Windows應(yīng)用程應(yīng)用程序中一般使用與具體設(shè)備無關(guān)的虛擬碼。序中一般使用與具體設(shè)備無關(guān)的虛擬碼。虛擬碼是虛擬碼是Windows系統(tǒng)內(nèi)部定義的與設(shè)備無關(guān)系統(tǒng)內(nèi)部定義的與設(shè)備無關(guān)的鍵盤標(biāo)識(shí),從而有效避免了鍵盤對應(yīng)用程序的的鍵盤標(biāo)識(shí),從而有效避免了鍵盤對應(yīng)用程序的影響,提高了應(yīng)用程序的通用性。影響,提高了應(yīng)用程序的通用性。 部分常用的虛擬鍵代碼 虛擬鍵代碼虛擬鍵代碼對應(yīng)功能鍵對應(yīng)功能鍵虛擬鍵代碼虛擬鍵代碼對應(yīng)功能鍵對

30、應(yīng)功能鍵VK_INSERTInsertVK_DOWN(箭頭向下箭頭向下)VK_LEFT(左箭頭左箭頭)VK_NEXTPageDown鍵鍵VK_RIGHT(右箭頭右箭頭)VK_BACKBackSpace鍵鍵VK_UP(箭頭向上箭頭向上)VK_RETURNEnter鍵鍵VK_AZ字母字母AZVK_TABTab鍵鍵!顯示鍵盤輸入字符程序的實(shí)現(xiàn)方法!顯示鍵盤輸入字符程序的實(shí)現(xiàn)方法利用利用AppWizard向?qū)身?xiàng)目名為向?qū)身?xiàng)目名為MyWinKey的應(yīng)用程序框架。的應(yīng)用程序框架。向 文 檔 類 中 添 加 保 存 字 符 的 數(shù) 據(jù) 成 員向 文 檔 類 中 添 加 保 存 字 符 的 數(shù) 據(jù) 成

31、 員m_MyText(既可以利用向?qū)砑?,也可以手工添既可以利用向?qū)砑樱部梢允止ぬ砑蛹?。通過通過ClassWizard向?qū)蛞晥D類中添加消息處向?qū)蛞晥D類中添加消息處理函數(shù)理函數(shù)Onchar ,并建立消息映射。,并建立消息映射。編譯并運(yùn)行應(yīng)用程序即可實(shí)現(xiàn)將鍵盤輸入的字編譯并運(yùn)行應(yīng)用程序即可實(shí)現(xiàn)將鍵盤輸入的字符在窗口客戶區(qū)顯示。符在窗口客戶區(qū)顯示。 CClientDC Dc(this);/獲得窗口客戶區(qū)設(shè)備環(huán)境CCMyWinKeyDoc *pDoc=GetDocument();pDoc-m_MyText+=nChar;Dc.SetTextColor(RGB(0,0,255);Dc.Text

32、Out(0,0,pDoc-m_MyText);3. 鼠標(biāo)處理程序 Windows應(yīng)用程序的鼠標(biāo)消息,可以被任何應(yīng)用程序的鼠標(biāo)消息,可以被任何窗口接受窗口接受 只要鼠標(biāo)移動(dòng)到該窗口并有鼠標(biāo)按鍵消息,只要鼠標(biāo)移動(dòng)到該窗口并有鼠標(biāo)按鍵消息,該窗口就可以接受到鼠標(biāo)消息,該窗口就可以接受到鼠標(biāo)消息, 與該窗口是否活動(dòng)窗口或是否帶有輸入焦點(diǎn)與該窗口是否活動(dòng)窗口或是否帶有輸入焦點(diǎn)沒有關(guān)系。沒有關(guān)系。 鼠標(biāo)消息 鼠 標(biāo) 在 窗 口 客 戶 區(qū) 移 動(dòng) 時(shí) 產(chǎn) 生 鼠 標(biāo) 在 窗 口 客 戶 區(qū) 移 動(dòng) 時(shí) 產(chǎn) 生WM_MOUSEMOVE消息消息.鼠標(biāo)在客戶區(qū)產(chǎn)生的消鼠標(biāo)在客戶區(qū)產(chǎn)生的消息由息由Windows應(yīng)

33、用程序應(yīng)用程序處理,而在窗口邊界、菜單、處理,而在窗口邊界、菜單、標(biāo)題欄和滾動(dòng)條等非客戶區(qū)產(chǎn)生的鼠標(biāo)消息一般由標(biāo)題欄和滾動(dòng)條等非客戶區(qū)產(chǎn)生的鼠標(biāo)消息一般由Windows系統(tǒng)處理系統(tǒng)處理。 鼠標(biāo)消息屬于鼠標(biāo)消息屬于Windows消息消息鼠標(biāo)消息均可直接利用鼠標(biāo)消息均可直接利用Visual C+6.0的的ClassWizard向?qū)砑邮髽?biāo)消息處理函數(shù)向?qū)砑邮髽?biāo)消息處理函數(shù)與鼠標(biāo)消息對應(yīng)的消息處理函數(shù)如表與鼠標(biāo)消息對應(yīng)的消息處理函數(shù)如表12-3所示。所示。 消息處理函數(shù)消息處理函數(shù) 常用鼠標(biāo)消息處理函數(shù)表 鼠標(biāo)消息 消息處理函數(shù) 備注WM_MOUSEMOVEv o i d O n M o u s

34、e M o v e ( U I N T nFlags,CPoint point)鼠標(biāo)移動(dòng)WM_LBUTTONDOWNv o i d O n L B u t t o n D o w n ( U I N T nFlags,CPoint point)單擊鼠標(biāo)左鍵WM_MBUTTONDOWNv o i d O n M B u t t o n D o w n ( U I N T nFlags,CPoint point)單擊鼠標(biāo)中鍵WM_RBUTTONDOWNv o i d O n R B u t t o n D o w n ( U I N T nFlags,CPoint point)單擊鼠標(biāo)右鍵WM_L

35、BUTTONUPvoid OnLButtonUp(UINT nFlags, CPoint point)鼠標(biāo)左鍵釋放鼠標(biāo)消息處理函數(shù)表(續(xù))WM_MBUTTONUPvoid OnMButtonUp(UINT nFlags, CPoint point)鼠 標(biāo) 中 鍵鼠 標(biāo) 中 鍵釋放釋放WM_RBUTTONUPvoid OnRButtonUp(UINT nFlags, CPoint point)鼠 標(biāo) 右 鍵鼠 標(biāo) 右 鍵釋放釋放WM_LBUTTONDBLICKvoid OnLButtonDblClk(UINT nFlags, CPoint point)雙 擊 鼠 標(biāo)雙 擊 鼠 標(biāo)左鍵左鍵WM_M

36、BUTTONDBLICKvoid OnMButtonDblClk(UINT nFlags, CPoint point)雙 擊 鼠 標(biāo)雙 擊 鼠 標(biāo)中鍵中鍵WM_RBUTTONDBLICKvoid OnRButtonDblClk(UINT nFlags, CPoint point)雙 擊 鼠 標(biāo)雙 擊 鼠 標(biāo)右鍵右鍵菜單菜單和工具欄和工具欄在在VC+VC+程序設(shè)計(jì)中,菜單和工具欄的設(shè)計(jì)程序設(shè)計(jì)中,菜單和工具欄的設(shè)計(jì)過程相同,需要通過以下過程相同,需要通過以下3 3個(gè)步驟實(shí)現(xiàn):個(gè)步驟實(shí)現(xiàn):(1 1)通過資源編輯器修改或建立菜單與工具)通過資源編輯器修改或建立菜單與工具欄。欄。(2 2)通過)通過M

37、FCMFC向?qū)Ы⒏鞑藛雾?xiàng)或工具命令向?qū)Ы⒏鞑藛雾?xiàng)或工具命令按鈕的消息響應(yīng)函數(shù)。按鈕的消息響應(yīng)函數(shù)。(3 3)通過應(yīng)用程序框架提供的菜單或工具欄)通過應(yīng)用程序框架提供的菜單或工具欄加載命令,將菜單或工具欄加載到應(yīng)用程加載命令,將菜單或工具欄加載到應(yīng)用程序框架中。序框架中。1 1 直接修改直接修改應(yīng)用程序框架的菜單應(yīng)用程序框架的菜單設(shè)計(jì)菜單,并通過菜單完成畫線、畫橢設(shè)計(jì)菜單,并通過菜單完成畫線、畫橢圓、畫矩形圓、畫矩形菜單設(shè)計(jì)過程如下菜單設(shè)計(jì)過程如下 1用菜單編輯器添加菜單欄及菜單項(xiàng)用菜單編輯器添加菜單欄及菜單項(xiàng)(1)打開項(xiàng)目文件)打開項(xiàng)目文件My.Dsw,選擇工程管理,選擇工程管理窗口中的窗

38、口中的ResourceView標(biāo)簽,展開標(biāo)簽,展開My resources中的中的Menu菜單資源列表項(xiàng),在菜單資源列表項(xiàng),在其中可以見到其中可以見到IDR_MAINFRAME,它就是,它就是應(yīng)用程序菜單的標(biāo)識(shí),雙擊該標(biāo)識(shí)將在右邊應(yīng)用程序菜單的標(biāo)識(shí),雙擊該標(biāo)識(shí)將在右邊編輯窗口中見到它所代表的菜單內(nèi)容。編輯窗口中見到它所代表的菜單內(nèi)容。圖12-271用菜單編輯器添加菜單欄及菜單項(xiàng)用菜單編輯器添加菜單欄及菜單項(xiàng)(2)右鍵單擊圖中)右鍵單擊圖中“幫助幫助”菜單后面的虛線菜單后面的虛線框,將彈出屬性對話框。在框,將彈出屬性對話框。在“C標(biāo)題標(biāo)題”編輯編輯框中輸入框中輸入“繪圖繪圖”。由于。由于“繪圖繪

39、圖”是主菜單,是主菜單,選擇它時(shí)并不需要執(zhí)行任何程序功能,所以選擇它時(shí)并不需要執(zhí)行任何程序功能,所以其屬性對話框中的其屬性對話框中的“ID”是禁用的。是禁用的。1 直接修改應(yīng)用程序框架的菜單圖12-28(3)完成上面的步驟后,在)完成上面的步驟后,在“繪圖繪圖”菜單欄的下面將會(huì)菜單欄的下面將會(huì)出現(xiàn)虛線框,右鍵單擊它并將其出現(xiàn)虛線框,右鍵單擊它并將其“標(biāo)題標(biāo)題”設(shè)置為設(shè)置為“直直線線”,將其將其“ID”設(shè)置為設(shè)置為“ID_LINE”。(4)用同樣的方法在)用同樣的方法在“直線直線”下面添加下面添加“矩形矩形”,“橢橢圓圓”菜單項(xiàng),并將矩形的菜單項(xiàng),并將矩形的ID設(shè)置為設(shè)置為“ID_RECT”,將

40、將橢圓的橢圓的ID設(shè)置為設(shè)置為“ID_ELLIPSE”。(5)修改或刪除菜單欄中不需要的菜單,如刪除其中的)修改或刪除菜單欄中不需要的菜單,如刪除其中的“幫助幫助”菜單,方法是選中該菜單,然后按菜單,方法是選中該菜單,然后按Delete鍵或鍵或選擇選擇VC+“編輯編輯”菜單中的菜單中的“刪除刪除”命令。命令。1 直接修改直接修改應(yīng)用程序框架的菜單應(yīng)用程序框架的菜單上面的操作過程將建立如圖所示的菜單。上面的操作過程將建立如圖所示的菜單。1 直接修改直接修改應(yīng)用程序框架的菜單應(yīng)用程序框架的菜單2利用向?qū)刹藛蜗㈨憫?yīng)函數(shù)利用向?qū)刹藛蜗㈨憫?yīng)函數(shù)(1)按快捷鍵)按快捷鍵Ctrl+W鍵啟動(dòng)鍵啟動(dòng)

41、MFC的類向?qū)?,如圖所示。的類向?qū)?,如圖所示。(2)選擇類向?qū)е械模┻x擇類向?qū)е械摹癕essage Maps”標(biāo)簽,在標(biāo)簽,在“Class name”下拉列表中選擇下拉列表中選擇“CMyView”類,類,在在“Object IDs”列表中具有所有的菜單標(biāo)識(shí),找列表中具有所有的菜單標(biāo)識(shí),找到并選中到并選中“ID_LINE”菜單標(biāo)識(shí),并選中菜單標(biāo)識(shí),并選中“Messages:”列表中的列表中的“COMMAND”,然后單,然后單擊命令按鈕擊命令按鈕“Add Function”。該操作會(huì)為。該操作會(huì)為CMyView類添加消息響應(yīng)函數(shù)類添加消息響應(yīng)函數(shù)OnLine。(3)用同樣的方法為)用同樣的方法為C

42、MyView類增加類增加ID_RECT、ID_ELLIPSE和和ID_STUDENT菜單標(biāo)識(shí)的消息響菜單標(biāo)識(shí)的消息響應(yīng)函數(shù):應(yīng)函數(shù):OnRect、OnEllipse、OnStudent。 經(jīng)過上述操作,經(jīng)過上述操作,MFC向?qū)?huì)在向?qū)?huì)在CMyView類中完成類中完成下面的下面的3件事。件事。 向?qū)⒃谙驅(qū)⒃贑MyView類中添加消息響應(yīng)函數(shù)的聲明,類中添加消息響應(yīng)函數(shù)的聲明,如下所示:如下所示:class CMyView : public CView protected: afx_msg void OnLine(); afx_msg void OnEllipse(); afx_msg vo

43、id OnRect(); afx_msg void OnStudent();向?qū)砑拥南驅(qū)砑拥牟藛蜗⑻幉藛蜗⑻幚砗瘮?shù)理函數(shù) 向?qū)⒃诔绦驅(qū)崿F(xiàn)文件向?qū)⒃诔绦驅(qū)崿F(xiàn)文件CMyView.cpp的消息映射的消息映射宏中,添加菜單項(xiàng)與消息處理函數(shù)之間的映射,宏中,添加菜單項(xiàng)與消息處理函數(shù)之間的映射,如下所示:如下所示:BEGIN_MESSAGE_MAP(CMyView, CView) /AFX_MSG_MAP(CMyView) ON_COMMAND(ID_LINE, OnLine) ON_COMMAND(ID_ELLIPSE, OnEllipse) ON_COMMAND(ID_RECT, OnRe

44、ct) ON_COMMAND(ID_STUDENT, OnStudent) /AFX_MSG_MAPEND_MESSAGE_MAP()紅字是向?qū)Ъt字是向?qū)砑拥牟藛翁砑拥牟藛蜗⒂成浜晗⒂成浜? 2利用向?qū)刹藛蜗㈨憫?yīng)函數(shù)利用向?qū)刹藛蜗㈨憫?yīng)函數(shù) 向?qū)⒃陬惖某绦蛭募驅(qū)⒃陬惖某绦蛭募﨏MyView.cppCMyView.cpp中添中添加消息處理函數(shù)的雛形,如下所示。加消息處理函數(shù)的雛形,如下所示。void CMyView:OnLine() / TODO: Add your command handler code here向?qū)砑拥南驅(qū)砑拥牟藛蜗⑻幉藛蜗⑻幚砗瘮?shù)雛形理函數(shù)雛

45、形 在向?qū)傻南⑻幚砗瘮?shù)中添加函數(shù)功能代碼在向?qū)傻南⑻幚砗瘮?shù)中添加函數(shù)功能代碼void CMyView:OnLine()/選擇選擇“繪圖繪圖|直線直線”菜單執(zhí)行該函菜單執(zhí)行該函數(shù)數(shù) CClientDC dc(this);/獲取設(shè)備環(huán)境獲取設(shè)備環(huán)境 dc.MoveTo(50,100);/將光標(biāo)移到將光標(biāo)移到(50,100)位置位置 dc.LineTo(100,300);/從光標(biāo)位置即從光標(biāo)位置即(50,100)畫直線到畫直線到(100,300)void CMyView:OnEllipse()/選擇選擇“繪圖繪圖|橢圓橢圓”菜單執(zhí)行該函菜單執(zhí)行該函數(shù)數(shù) CClientDC dc(this

46、); dc.Ellipse(100,100,200,300);void CMyView:OnRect() /選擇選擇“繪圖繪圖|矩形矩形”菜單執(zhí)行該函數(shù)菜單執(zhí)行該函數(shù) CClientDC dc(this); dc.Rectangle(300,100,500,200);2 2 建立建立新菜單欄【例例】 為上一例重新建立一新菜單,實(shí)現(xiàn)同樣的為上一例重新建立一新菜單,實(shí)現(xiàn)同樣的功能。功能。實(shí)現(xiàn)過程簡述如下實(shí)現(xiàn)過程簡述如下 (1 1)在)在VC+VC+中打開例上例建立的項(xiàng)目文件中打開例上例建立的項(xiàng)目文件My.dswMy.dsw,在工程管理窗口在工程管理窗口“ResourceView”ResourceV

47、iew”中展開中展開“My My resources”resources”資源,右鍵單擊資源,右鍵單擊“Menu”,并從彈并從彈出的快捷菜單中選擇出的快捷菜單中選擇“Insert Menu”,VC+VC+將插將插入一個(gè)標(biāo)識(shí)為入一個(gè)標(biāo)識(shí)為“IDR_MENU1”的菜單。用前面的的菜單。用前面的方法添加方法添加“畫圖畫圖”和和“學(xué)生學(xué)生”菜單,如圖所示。菜單,如圖所示。圖12-32新菜單新菜單IDR_MENU1設(shè)置其中菜單項(xiàng)設(shè)置其中菜單項(xiàng)“直線直線”的的ID為為“IDR_LINE1”,“矩矩形形”的的ID為為“IDR_RECT1”、“橢圓橢圓”的的ID為為“IDR_ELLIPSE1”,“輸入學(xué)生檔案

48、輸入學(xué)生檔案”的的ID為為“ID_STUDENT1”。(2 2)按快捷鍵)按快捷鍵Ctrl+WCtrl+W,彈出如圖,彈出如圖12-3312-33(a a)所示的對話)所示的對話框,選擇框,選擇“Select an existing classSelect an existing class”,然后單擊,然后單擊“OKOK”按鈕,彈出如圖按鈕,彈出如圖12-3312-33(b b)所示對話框,選擇)所示對話框,選擇“CMyViewCMyView”,然后單擊,然后單擊“SelecSelect”t”按鈕。按鈕。3)通過消息映射向?qū)А癕essage Maps”建立菜單項(xiàng)IDR_LINE1、IDR_R

49、ECT1、IDR_ELLIPSE1和ID_STUDENT1的消息映射函數(shù)和函數(shù)代碼,方法和代碼同前例。4)加載新菜單。打開CMyApp:InitInstanceCMyApp:InitInstance函數(shù),將其中建立單文檔模板時(shí)指定的菜單標(biāo)識(shí)IDR_MAINFRAMEIDR_MAINFRAME修改為新菜單的標(biāo)識(shí)IDR_MENU1IDR_MENU1,如下所示。BOOL CMyApp:InitInstance() CSingleDocTemplate* pDocTemplate; pDocTemplate = new CSingleDocTemplate(IDR_MENU1 , RUNTIME_CLASS(CMyDoc), RUNTIME_CLASS(CMainFrame), RUNTI

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論