《面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言-C》課件-第4章.ppt
《《面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言-C》課件-第4章.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《《面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言-C》課件-第4章.ppt(42頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1 第四章利用MFC開(kāi)發(fā)Windows應(yīng)用程序 本章導(dǎo)讀理解MFC的概念和作用 理解Windows應(yīng)用程序的特點(diǎn)和運(yùn)行機(jī)制 掌握利用MFCAppwizard創(chuàng)建Windows應(yīng)用程序的步驟和方法 弄清MFCAppwizard所創(chuàng)建的應(yīng)用程序中所產(chǎn)生的主要類(lèi)及其功能 組成文件和程序的框架結(jié)構(gòu) 理解消息的概念 掌握編寫(xiě)Windows應(yīng)用程序過(guò)程中所涉及到的消息的種類(lèi) 特點(diǎn) 消息的發(fā)送和接收的基本過(guò)程和機(jī)制 掌握消息映射 消息處理函數(shù)的概念及二者間的關(guān)系 掌握利用ClassWizard增加 修改和刪除窗口消息處理函數(shù)的方法和步驟 并理解程序代碼的變化過(guò)程和特點(diǎn) 2 本章導(dǎo)讀 MFC MicrosoftFoundationClass 是Microsoft公司推出的Microsoft基本類(lèi)庫(kù) 在編寫(xiě)Windows應(yīng)用程序時(shí) 必須編寫(xiě)的大量重復(fù)代碼都由MFC中定義的類(lèi)和支持代碼提供了 不必再直接使用WindowsAPI 應(yīng)用程序接口 來(lái)進(jìn)行編程工作 使用MFC提供的位于WindowsAPI之上的C 庫(kù) 使程序員的工作變得更加容易 在VisualC 6 0中 用戶(hù)不僅可以方便地使用MFC 而且還可以使用向?qū)?Wizard 來(lái)輔助開(kāi)發(fā)應(yīng)用程序 MFC實(shí)際上是一個(gè)擴(kuò)展的 豐富的C 類(lèi)層次結(jié)構(gòu) 在MFC中封裝了SDK結(jié)構(gòu) 功能及應(yīng)用程序框架內(nèi)部技術(shù) 隱藏了過(guò)去許多Windows程序不得不處理的許多重復(fù)工作 因此 從本章開(kāi)始 將著重討論如何利用VisualC 6 0的強(qiáng)大功能開(kāi)發(fā)Windows下的應(yīng)用程序 3 4 1Windows應(yīng)用程序的特點(diǎn)與消息驅(qū)動(dòng)機(jī)制 基于Windows操作系統(tǒng)的應(yīng)用程序的特點(diǎn)是 標(biāo)準(zhǔn)的圖形用戶(hù)界面 比如窗口 菜單 按鈕 列表框等 應(yīng)用程序與硬件無(wú)關(guān)的特性 對(duì)于同一類(lèi)硬件 不論廠家 型號(hào) 程序都無(wú)需進(jìn)行任何修改就可以運(yùn)行 所有的Windows應(yīng)用程序都是消息驅(qū)動(dòng)機(jī)制 也就是說(shuō)Windows程序是通過(guò)操作系統(tǒng)發(fā)送的消息來(lái)處理用戶(hù)的輸入的 在進(jìn)行Windows編程之前 必須了解Windows的運(yùn)行機(jī)制 在Windows操作系統(tǒng)中 無(wú)論是系統(tǒng)產(chǎn)生的動(dòng)作或是用戶(hù)運(yùn)行應(yīng)用程序產(chǎn)生的動(dòng)作都稱(chēng)為事件 Events 產(chǎn)生的消息 Message 無(wú)論是Windows應(yīng)用程序的設(shè)計(jì) 還是它的應(yīng)用 都是基于消息驅(qū)動(dòng)方式的 這是Windows應(yīng)用程序與傳統(tǒng)的應(yīng) 4 用程序最大的區(qū)別 在傳統(tǒng)的編程方式中 程序是主動(dòng)的 程序主動(dòng)執(zhí)行 只有當(dāng)需要用戶(hù)通過(guò)鍵盤(pán)或鼠標(biāo)輸入信息時(shí) 才進(jìn)行查詢(xún)或等待 獲得輸入后 程序繼續(xù)運(yùn)行 而Windows應(yīng)用程序是被動(dòng)的 正常情況下 只是等待被消息觸發(fā) 當(dāng)用戶(hù)點(diǎn)擊鼠標(biāo)或按下了鍵盤(pán) 則由操作系統(tǒng)將這些操作轉(zhuǎn)化為特殊的消息 傳遞給應(yīng)用程序 應(yīng)用程序再用對(duì)應(yīng)的消息處理過(guò)程進(jìn)行處理 處理完畢后 繼續(xù)等待下一個(gè)消息 消息驅(qū)動(dòng)是Windows操作系統(tǒng)的一大特色 操作系統(tǒng)將包括用戶(hù)輸入在內(nèi)的各種事件以消息的形式發(fā)送到目標(biāo) 目標(biāo)系統(tǒng)再根據(jù)消息的具體內(nèi)容進(jìn)行相應(yīng)的處理 4 1Windows應(yīng)用程序的特點(diǎn)與消息驅(qū)動(dòng)機(jī)制 5 4 2利用MFCAppwizard創(chuàng)建Windows應(yīng)用程序 在C 中 事物之間的關(guān)系是通過(guò)類(lèi)的派生和類(lèi)的成員函數(shù)的重載來(lái)反映的 而在VisualC 6 0中 類(lèi)同樣是最重要的元素 如一個(gè)字符串可以是類(lèi)Cstring的對(duì)象 一個(gè)窗口可以是類(lèi)CWnd的對(duì)象 一個(gè)對(duì)話框可以是類(lèi)Cdialog的對(duì)象等等 VisualC 6 0中的MFCAppWizard 應(yīng)用程序向?qū)?可以使用戶(hù)自動(dòng)生成一些常用的標(biāo)準(zhǔn)程序結(jié)構(gòu)和編程風(fēng)格 例如一般的Windows應(yīng)用程序結(jié)構(gòu) DLL應(yīng)用程序結(jié)構(gòu) 單文檔 SDI 應(yīng)用程序結(jié)構(gòu) 多文檔 MDI 應(yīng)用程序結(jié)構(gòu)等 下面詳細(xì)介紹利用MFCAppWizard創(chuàng)建一個(gè)Windows應(yīng)用程序的步驟 第零步啟動(dòng)VisualC 6 0 選擇 File 菜單下的 New 菜單項(xiàng) 選擇 Projects 標(biāo)簽 選擇 MFCAppWizard exe 項(xiàng)目類(lèi)型 在 Projectname 中輸入 6 項(xiàng)目名MyExp 定位于 E C EXAMPLE 文件夾中 單擊 OK 按鈕 第一步選擇 Singledocument 應(yīng)用類(lèi)型 即單文檔應(yīng)用程序 其他使用默認(rèn)值 單擊 Next 按鈕 第二步讓用戶(hù)選擇程序中是否加入數(shù)據(jù)庫(kù)支持 在此使用默認(rèn)值 None 單擊 Next 按鈕 第三步讓用戶(hù)選擇在程序中加入復(fù)合文檔 自動(dòng)化或ActiveX控件的支持 在此使用默認(rèn)值 單擊 Next 按鈕 第四步讓用戶(hù)選擇應(yīng)用程序的一些特性 在此使用默認(rèn)值 單擊 Next 按鈕 第五步讓用戶(hù)選擇應(yīng)用程序主窗口的風(fēng)格 在源文件中是否加入注釋 使用怎樣的MFC類(lèi)庫(kù) 在此使用默認(rèn)值 單擊 Next 按鈕 4 2利用MFCAppwizard創(chuàng)建Windows應(yīng)用程序 7 第六步用戶(hù)可以對(duì)MFCAppWizard提供的缺省類(lèi)名 基類(lèi)名 頭文件名 源文件名進(jìn)行修改 使用默認(rèn)值 單擊 Finish 按鈕 則會(huì)顯示出用戶(hù)在前面幾個(gè)步驟中作出的選擇內(nèi)容 單擊 OK 按鈕 系統(tǒng)開(kāi)始創(chuàng)建應(yīng)用程序 并回到VisualC 6 0的主界面 運(yùn)行過(guò)的應(yīng)用程序MyExp可以脫離VisualC 6 0單獨(dú)運(yùn)行 運(yùn)行該文檔可以雙擊 E C EXAMPLE Debug 下的MyExp exe文件 和所有的Windows應(yīng)用程序一樣 MyExp也包含標(biāo)題欄 菜單欄 工具欄 狀態(tài)欄等窗口元素 4 2利用MFCAppwizard創(chuàng)建Windows應(yīng)用程序 8 4 3MFC應(yīng)用程序的類(lèi)和文件 4 3 1類(lèi)說(shuō)明AppWiZard在生成應(yīng)用程序時(shí) 共派生了5個(gè)類(lèi)單擊 MyExpclasses 左側(cè)的 展開(kāi)所有的類(lèi) 即可顯示出應(yīng)用程序MyExp的5個(gè)類(lèi) 其中 CAboutDlg 關(guān)于About對(duì)話框的對(duì)話框類(lèi)CMainFrame 主框架窗口類(lèi)CMyExpApp 應(yīng)用程序類(lèi)CMyExpDoc 文檔類(lèi)CMyExpView 視圖類(lèi)在工程中 每個(gè)類(lèi)都擁有自己的類(lèi)定義文件 H 和類(lèi)實(shí)現(xiàn)文件 CPP 類(lèi)定義文件主要保存各種類(lèi)的定義 類(lèi)實(shí)現(xiàn)文件主要保存各種類(lèi)的成員函數(shù)的實(shí)現(xiàn)代碼 9 下面分別對(duì)這5個(gè)類(lèi)進(jìn)行說(shuō)明 關(guān)于About對(duì)話框的對(duì)話框類(lèi)CAboutDlgCAboutDlg是工程MyExp的對(duì)話框類(lèi) 它是由MFC類(lèi)庫(kù)中的CDialog類(lèi)派生而來(lái)的 主框架窗口類(lèi)CMainFrameCMainFrame是工程MyExp的主框架窗口類(lèi) 它的基類(lèi)是CFrameWnd 頭文件為MainFrm h 實(shí)現(xiàn)文件為MainFrm cpp 主框架窗口類(lèi)用于管理主程序的窗口 來(lái)顯示窗口的標(biāo)題欄 工具欄 狀態(tài)欄等 同時(shí)還處理對(duì)窗口操作的消息 例如窗口最大化 最小化 改變窗口大小等一般操作 視圖窗口是主框架窗口的子集 對(duì)于多文檔界面 MDI 應(yīng)用程序 主框架窗口是所有MDI子窗口的容器 4 3MFC應(yīng)用程序的類(lèi)和文件 10 應(yīng)用程序類(lèi)CMyExpAppCMyExpApp是工程MyExp的應(yīng)用程序類(lèi) 它的基類(lèi)是CWinApp 頭文件為MyExp h 實(shí)現(xiàn)文件為MyExp cpp 應(yīng)用程序類(lèi)管理程序的整體 控制應(yīng)用程序的所有對(duì)象 包括文檔 視圖和邊框窗口 并完成應(yīng)用程序的初始化工作和程序退出時(shí)的清除工作 注意 每個(gè)基于MFC的應(yīng)用程序都必須有一個(gè)從CWinApp類(lèi)派生的對(duì)象 文檔類(lèi)CMyExpDocCMyExpDoc是工程MyExp的文檔類(lèi) 它的基類(lèi)是CDocument 頭文件為MyExpDoc h 實(shí)現(xiàn)文件為MyExpDoc cpp 4 3MFC應(yīng)用程序的類(lèi)和文件 11 文檔類(lèi)負(fù)責(zé)存放程序的數(shù)據(jù)并讀取磁盤(pán)文件數(shù)據(jù) 或?qū)⒋疟P(pán)文件數(shù)據(jù)寫(xiě)入磁盤(pán)文件中 文檔類(lèi)必須通過(guò)視圖類(lèi)實(shí)現(xiàn)與用戶(hù)的交互 視圖類(lèi)CMyExpViewCMyExpView是工程MyExp的視圖類(lèi) 它的基類(lèi)是CView 頭文件為MyExpView h 實(shí)現(xiàn)文件為MyExpView cpp 視圖類(lèi)主要負(fù)責(zé)管理視圖窗口 顯示文檔類(lèi)中的數(shù)據(jù) 可以顯示在屏幕上 也可以輸出到打印機(jī)或其他設(shè)備上 也負(fù)責(zé)處理用戶(hù)數(shù)據(jù) 接受用戶(hù)對(duì)數(shù)據(jù)的鼠標(biāo) 鍵盤(pán)操作并傳送給文檔類(lèi)對(duì)象 4 3MFC應(yīng)用程序的類(lèi)和文件 12 4 3MFC應(yīng)用程序的類(lèi)和文件 4 3 2文件說(shuō)明AppWizard在自動(dòng)生成工程時(shí) 除了生成上面介紹的各個(gè)類(lèi)的頭文件和實(shí)現(xiàn)文件外 還生成了一些為建立應(yīng)用程序所需要的其他文件 這些文件可以在應(yīng)用程序生成時(shí)指定的路徑 E C EXAMPLE MyExp 中找到 下面分別對(duì)這些文件加以說(shuō)明 1 MyExp clw ClassWizard的信息存儲(chǔ)文件 存儲(chǔ)由ClassWizard編輯已有的類(lèi)或添加新類(lèi)的信息 存儲(chǔ)由ClassWizard建立和編輯各種消息處理函數(shù)和映射變量等的信息 2 MyExp dsp Project文件 即工程文件 Project文件中保存著工程的各種信息 一個(gè)工程文件對(duì)應(yīng)一個(gè)工程應(yīng)用程序 13 3 MyExp dsw Workspace文件 一個(gè)Workspace文件可包含一個(gè)或多個(gè)工程 4 MyExp rc 資源定義文件 包含程序資源的定義 其中保存了應(yīng)用程序中使用到的各種資源的信息 包括存貯在文件夾中的圖標(biāo) 位圖和光標(biāo)等 5 Resource h 標(biāo)準(zhǔn)的頭文件 它包含了所有資源符號(hào)的定義 與MyExp rc文件相對(duì)應(yīng) 6 StdAfx h 包含在所有AppWizard程序中的標(biāo)準(zhǔn)頭文件 它用于包含其他包含在預(yù)編譯頭文件中文件 7 StdAfx cpp 包含在所有AppWizard程序中 它包含所有標(biāo)準(zhǔn)include文件 8 res MyExpDoc ico 文件中包含了打開(kāi)文檔時(shí)所用的圖標(biāo)文件 4 3MFC應(yīng)用程序的類(lèi)和文件 14 9 res MyExp rc2 資源定義文件 包含了用vc不能直接編輯的資源 可以將所有不能由資源編輯器編輯的資源放置到這個(gè)文件中 10 res MyExp ico 應(yīng)用程序的圖標(biāo)文件 應(yīng)用程序圖標(biāo)包含在資源文件MyExp rc中 11 res Toolbar bmp 用于創(chuàng)建工具欄按鈕的位圖文件 初始欄工具欄和狀態(tài)欄是在主邊框窗口類(lèi)中構(gòu)造的 12 ReadMe txt 包含了對(duì)所有該程序的文件的解釋信息 并說(shuō)明了所有創(chuàng)建的類(lèi) 另外 如果在AppWizard的第4步中選擇了Context sensitiveHelp選項(xiàng) 則AppWizard會(huì)自動(dòng)生成一個(gè) hpj文件和一些 rtf文件 它們用以給出上下文的幫助 4 3MFC應(yīng)用程序的類(lèi)和文件 15 Windows應(yīng)用程序一般是由消息驅(qū)動(dòng)的 message driven 這也是Windows編程方式與其他編程方式最大的不同之處 消息就是操作系統(tǒng)通知應(yīng)用程序某件事情已經(jīng)發(fā)生的一種方式 例如 當(dāng)用戶(hù)移動(dòng)或雙擊鼠標(biāo) 改變窗口大小等 都將向適當(dāng)?shù)拇翱诎l(fā)送消息 一個(gè)窗口可以向另一個(gè)窗口發(fā)送消息 并且大多數(shù)窗口通過(guò)向其他窗口發(fā)送一個(gè)稍有不同的消息來(lái)響應(yīng)消息 Windows系統(tǒng)中的消息主要有三種類(lèi)型 標(biāo)準(zhǔn)的Windows消息 控件消息和命令消息 4 4Windows消息 16 4 4Windows消息 4 4 1標(biāo)準(zhǔn)的Windows消息所有以WM 為前綴的消息都是標(biāo)準(zhǔn)的Windows消息 WM COMMAND消息除外 如WM PAINT WM QUIT等 這些消息通常含有用于確定如何對(duì)消息進(jìn)行處理的一些參數(shù) 標(biāo)準(zhǔn)的Windows消息一般由窗口對(duì)象和視圖對(duì)象進(jìn)行處理 窗口對(duì)象指的是從CWnd中派生出的類(lèi)的對(duì)象 如從CWnd CFrameWnd CMDIFrameWnd CMDIChildWnd Cview Cdialog等MFC類(lèi)或這些類(lèi)的派生類(lèi)定義的對(duì)象 這些類(lèi)都是CWnd類(lèi)直接或間接派生的 17 4 4Windows消息 標(biāo)準(zhǔn)的Windows消息可以分為三類(lèi) 即鍵盤(pán)消息 鼠標(biāo)消息和窗口消息 下面分別加以說(shuō)明 鍵盤(pán)消息當(dāng)鍵盤(pán)的某個(gè)鍵被按下時(shí) 將產(chǎn)生WM CHAR消息 這個(gè)消息帶有字符代碼值 重復(fù)次數(shù)和先前狀態(tài)碼三個(gè)參數(shù) WM CHAR消息的處理函數(shù)為OnChar 此函數(shù)的原型為 afx msgvoidOnchar UINTnChar UINTnRepCnt UINTnFlags 其中 nChar是所按鍵的字符代碼值 nRepCnt是重復(fù)的次數(shù) 它表示用戶(hù)按鍵時(shí)重復(fù)擊鍵的次數(shù) nFlags表示掃描碼 先前鍵狀態(tài)和鍵轉(zhuǎn)換狀態(tài)等 其參數(shù)值功能描述見(jiàn)表4 1所示 18 4 4Windows消息 表4 1nFlags參數(shù)值功能描述 19 4 4Windows消息 鼠標(biāo)消息在Windows中處理鼠標(biāo)的操作基本上有三種 單擊 Click 2 雙擊 DoubleClick 3 拖動(dòng) Drag 所有這些鼠標(biāo)的操作 都會(huì)產(chǎn)生相應(yīng)的消息 鼠標(biāo)移動(dòng)時(shí)產(chǎn)生WM MOUSEMOVE消息 鼠標(biāo)左鍵按下時(shí)產(chǎn)生WM LBUTTONDOWN消息 鼠標(biāo)右鍵按下時(shí)產(chǎn)生WM RBUTTONDOWN消息 鼠標(biāo)左鍵雙擊時(shí)產(chǎn)生WM LBOTTONDBLCLK消息等等 所有這些鼠標(biāo)消息的處理函數(shù)都有相似的原型 它們都有兩個(gè)參數(shù) 我們以處理鼠標(biāo)左鍵按下的消息函數(shù)OnLButtonDown 為例來(lái)進(jìn)行說(shuō)明 此函數(shù)的原型如下 afx msgvoidOnLButtonDown UINTnFlags Cpointpoint 其中 參數(shù)point是鼠標(biāo)事件發(fā)生時(shí)鼠標(biāo)光標(biāo)所在的位置 它是相對(duì)于窗口左上角的水平坐標(biāo)和垂直坐標(biāo)而言的 20 4 4Windows消息 參數(shù)nFlag指明鼠標(biāo)按鈕的狀態(tài)以及鼠標(biāo)事件發(fā)生時(shí)鍵盤(pán)上某些鍵的狀態(tài) 每一狀態(tài)都可以由nFlag的一位來(lái)表示 我們可以從表4 2中所列的位屏蔽中得到每一位 4 2nFlags參數(shù)每位的含義其中 MK CONTROL MK LBUTTON MK MBUTTON MK MBUTTON MK RBUTTON和MK SHIFT都是預(yù)定義的宏 21 4 4Windows消息 窗口消息所有窗口的變化 包括窗口內(nèi)容重繪WM PAINT 窗口最大化WM MAXIMIZE 窗口最小化WM MINIMIZE 窗口重定義大小WM RESIZE 窗口滾動(dòng)WM HSCROLL WM VSCROLL 窗口定時(shí)WM TIMER等消息所帶參數(shù)各不相同 在這里我們來(lái)詳細(xì)討論一下WM PAINT消息 當(dāng)調(diào)用成員函數(shù)UpdateWindow 或RedrawWindow 要求重新繪制窗口內(nèi)容時(shí) 應(yīng)用程序?qū)⑹盏絎M PAINT消息 當(dāng)窗口最小化后再還原或被其他窗口遮蓋后又重新顯示時(shí) 則當(dāng)前窗口中的內(nèi)容必須重新繪制 消息WM PAINT就是為實(shí)現(xiàn)這個(gè)功能的 22 4 4Windows消息 當(dāng)向Windows應(yīng)用程序發(fā)送WM PAINT消息 應(yīng)用程序檢索到此消息后 就重新顯示窗口中的內(nèi)容 WM PAINT消息的處理函數(shù)為OnPaint 函數(shù)原型為 afx msgvoidOnPaint 如果想詳細(xì)了解所有的標(biāo)準(zhǔn)的Windows消息 可以參閱VisualC 6 0聯(lián)機(jī)幫助中的有關(guān)內(nèi)容 4 4 2控件消息控件是一個(gè)小的子窗口 屬于其他窗口 如對(duì)話框等 能夠接受操作并象父窗口發(fā)送消息 常見(jiàn)的控件有按鈕 列表框 編輯框 復(fù)合框 滾動(dòng)條等 在VisualC 6 0中 對(duì)控件的操作都是通過(guò)生成相應(yīng)的控件類(lèi)來(lái)進(jìn)行 這些控件類(lèi)僅能發(fā)送少量特定的消息 這些消息就叫做控件消息 發(fā)送控件消息的控件在VisualC 中 23 4 4Windows消息 使用唯一ID號(hào)來(lái)進(jìn)行標(biāo)識(shí) 使用控件類(lèi)來(lái)操縱 控件消息分為兩類(lèi) 1 從控件傳給消息 通常這類(lèi)消息的前綴的最后一個(gè)字符為N 2 由系統(tǒng)發(fā)送給控件的消息 這類(lèi)消息的前綴的最后一個(gè)字符為M 例如 當(dāng)用戶(hù)對(duì)編輯框中的文本進(jìn)行修改時(shí) 編輯框?qū)l(fā)送給父窗口一條包含控件通知碼EN CHANGE的WM COMMAND消息 窗口的消息處理函數(shù)將以某種適當(dāng)?shù)姆绞綄?duì)通知消息作出響應(yīng) 如檢索編輯框中的文本 與其他標(biāo)準(zhǔn)的Windows消息一樣 控件消息也是由窗口對(duì)象和視圖對(duì)象進(jìn)行處理 24 4 4Windows消息 4 4 3命令消息命令消息主要包括由用戶(hù)界面對(duì)象發(fā)送的M COMMAND消息 用戶(hù)界面對(duì)象是指菜單 工具欄 快捷鍵等 它和控件消息的區(qū)別在于 控件消息只能由特定控件向Windows系統(tǒng)傳送 而命令消息是由用戶(hù)界面發(fā)送的 它可以被更多的對(duì)象處理 在文檔對(duì)象 視圖對(duì)象 窗體對(duì)象 控件對(duì)象中都能處理這種消息 1 用戶(hù)界面對(duì)象菜單 工具欄 快捷鍵等都是可以產(chǎn)生命令的用戶(hù)界面對(duì)象 每個(gè)這樣的對(duì)象都分配了一個(gè)ID號(hào) 通過(guò)給對(duì)象和命令分配同一個(gè)ID號(hào) 將用戶(hù)界面對(duì)象和命令聯(lián)系在一起 例如 選擇程序中的 文件 菜單下的 打開(kāi) 菜單項(xiàng) 則產(chǎn)生一條ID FILE OPEN命令 然后通過(guò)消息映射調(diào)用函數(shù)OnFileOpen 來(lái)進(jìn)行處理 25 4 4Windows消息 2 命令I(lǐng)D在MFC編程中 命令完全由命令I(lǐng)D來(lái)進(jìn)行描述 命令I(lǐng)D分配給產(chǎn)生此命令的用戶(hù)界面對(duì)象 通常情況下 命令I(lǐng)D是由它所表示的用戶(hù)界面對(duì)象的功能來(lái)命名的 MFC預(yù)定義了一些命令I(lǐng)D 如ID EDIT CUT ID FILE SAVE等 而其他命令I(lǐng)D則要由編程人員自己定義 3 命令目標(biāo)當(dāng)用戶(hù)界面對(duì)象被單擊后 將調(diào)用處理函數(shù)來(lái)執(zhí)行所產(chǎn)生的命令 Windows把非命令消息的消息直接發(fā)送給窗口 窗口中用于處理這些消息的處理函數(shù)將被調(diào)用 而對(duì)于命令消息 將把命令發(fā)送給多個(gè)目標(biāo) 也就是命令目標(biāo) 其中通常有一個(gè)要調(diào)用此命令的處理函數(shù) 26 4 5消息的發(fā)送和接收的基本過(guò)程和機(jī)制 在Windows中 大部分的消息都是由用戶(hù)和應(yīng)用程序的相互作用而產(chǎn)生的 CWinApp類(lèi)的成員函數(shù)Run 用于處理消息循環(huán) 它唯一的功能就是等待消息 并將消息發(fā)送到適當(dāng)?shù)拇翱?當(dāng)消息循環(huán)接收到一條Windows消息時(shí) 它首先通過(guò)查詢(xún)一種內(nèi)部結(jié)構(gòu)來(lái)確定消息要發(fā)送的窗口 這種內(nèi)部結(jié)構(gòu)把當(dāng)前所有的窗口映像成其對(duì)應(yīng)的窗口類(lèi) MFC的基類(lèi)還能夠檢測(cè)這一目標(biāo)類(lèi)是否在其消息中為這一消息提供了處理函數(shù)入口 如果找到入口 則消息被送往處理函數(shù) 結(jié)束消息發(fā)送過(guò)程 如果消息無(wú)對(duì)應(yīng)入口 則對(duì)目標(biāo)類(lèi)進(jìn)行基類(lèi)消息映射檢測(cè) 沿著層次向上查找 直到找到入口函數(shù)為止 對(duì)于命令消息來(lái)說(shuō) 查找較為復(fù)雜 通常 每個(gè)命令目標(biāo)類(lèi)先把命令發(fā)送給某些其他的對(duì)象 使其他對(duì)象有 27 4 5消息的發(fā)送和接收的基本過(guò)程和機(jī)制 優(yōu)先處理的機(jī)會(huì) 如果這些對(duì)象都不能處理此命令 則起始類(lèi)檢查自己的消息映射 若也不能處理此消息 則將命令發(fā)送給更多的命令目標(biāo) 在大多數(shù)情況下 命令目標(biāo)將以下列順序發(fā)送命令 1 發(fā)送至當(dāng)前活動(dòng)的子命令目標(biāo)對(duì)象 2 發(fā)送至其本身 3 發(fā)送至其他命令目標(biāo) 例 在一個(gè)MDI應(yīng)用程序中 如果選擇了 文件 菜單中的 保存 菜單項(xiàng) 則產(chǎn)生一條命令消息 我們假定命令處理函數(shù)是應(yīng)用程序文檔類(lèi)的成員函數(shù) 則此命令的發(fā)送順序?yàn)?28 4 5消息的發(fā)送和接收的基本過(guò)程和機(jī)制 1 命令消息首先傳給主框架窗口 2 主框架窗口給當(dāng)前活動(dòng)的子窗口處理此命令的機(jī)會(huì) 3 視圖檢查其消息映射 若沒(méi)有找到處理函數(shù) 再把此命令發(fā)送給與其相連的文檔 4 文檔檢查其消息映射 如果找到命令的處理函數(shù) 則調(diào)用此函數(shù) 發(fā)送過(guò)程結(jié)束 否則繼續(xù)下面的步驟 5 將命令發(fā)送給文檔模板 然后返回到視圖 再返回邊框窗口 邊框窗口檢查其消息映射 6 命令回送到主邊框窗口 主邊框窗口檢查自己的消息映射 7 檢測(cè)應(yīng)用程序的消息映射 進(jìn)到消息入口 并調(diào)用適當(dāng)?shù)奶幚沓绦?29 4 6消息映射與消息處理函數(shù) 4 6 1消息映射與消息處理函數(shù)的概念通過(guò)消息映射 消息就和它的處理函數(shù)對(duì)應(yīng)起來(lái) 消息處理函數(shù)指的是與某個(gè)消息對(duì)應(yīng)的函數(shù) 消息處理函數(shù)的執(zhí)行是由其對(duì)應(yīng)的消息引發(fā)的 某個(gè)類(lèi)對(duì)象中的消息處理函數(shù)是與這個(gè)類(lèi)對(duì)象能夠得到的一個(gè)消息對(duì)應(yīng)的 當(dāng)這個(gè)消息發(fā)生時(shí) 這個(gè)函數(shù)就會(huì)被執(zhí)行 消息處理函數(shù)的定義與使用方法與類(lèi)的一般的成員函數(shù)不同 一般成員函數(shù)包括兩部分 函數(shù)的定義部分和函數(shù)的實(shí)現(xiàn)部分 而消息處理函數(shù)除了這兩部分以外 還有消息映射部分 30 4 6消息映射與消息處理函數(shù) 4 6 2管理窗口消息處理函數(shù)利用ClassWizard可以管理消息處理函數(shù) ClassWizard是一個(gè)非常強(qiáng)大有用的工具 我們可以用ClassWizard來(lái)創(chuàng)建新類(lèi) 定義消息處理函數(shù) 覆蓋MFC的虛擬函數(shù) 從對(duì)話框 表單視圖或記錄視圖的控件中獲取數(shù)據(jù) 可以用三種方法來(lái)激活ClassWizard對(duì)話框 1 選擇 View 菜單中的 ClassWizard 菜單項(xiàng) 2 直接按下Ctrl W鍵 3 在代碼編輯窗口中單擊鼠標(biāo)右鍵 此時(shí) 代碼編輯窗口中必須有打開(kāi)的文件 在彈出菜單中選擇 ClassWizard 菜單項(xiàng) 31 4 6消息映射與消息處理函數(shù) 當(dāng)執(zhí)行了以上操作 窗口中將彈出 MFCClassWizard 對(duì)話框 此時(shí)顯示的是 MessageMap 選項(xiàng)卡 在這個(gè)選項(xiàng)卡的最上面有兩個(gè)下拉列表框 Project 列表中顯示的是當(dāng)前的項(xiàng)目名稱(chēng) Classname 列表中顯示的是正在編輯的消息映射所屬的類(lèi)名 選項(xiàng)卡的中間也有兩個(gè)多行的列表框 左邊的 ObjectIDs 列表框中顯示的對(duì)象有三種類(lèi)型 在 Classname 欄中列出的類(lèi)名 菜單項(xiàng)對(duì)象和其他可能在 Classname 中所選的類(lèi)傳遞消息的控件 當(dāng)其中的某一個(gè)類(lèi)被選中時(shí) 右面的 Messages 列表框就顯示出此類(lèi)的能捕獲的所有Windows消息 其中還列出了一些能夠捕獲的普通消息的虛函數(shù) 最下面 Memberfunctions 列表中顯示的是與此消息相關(guān)的類(lèi)的成員函數(shù)的列表 32 4 6消息映射與消息處理函數(shù) 在 MFCClassWizard 對(duì)話框中共有五個(gè)選項(xiàng)卡 分別說(shuō)明如下 1 MessageMaps 選項(xiàng)卡用于進(jìn)行消息映射的處理 2 MemberVariables 選項(xiàng)卡用于為對(duì)話框中的控件所用到的類(lèi)創(chuàng)建成員變量 3 Automation 選項(xiàng)卡幫助用戶(hù)管理與OLE自動(dòng)化相聯(lián)系的方法和屬性 4 ActiveXEvents 選項(xiàng)卡幫助用戶(hù)管理ActiveX類(lèi)支持的ActiveX事件 5 ClassInfo 選項(xiàng)卡顯示類(lèi)的一般信息 包括定義它的頭文件和源文件 類(lèi)名以及與之相聯(lián)系的基類(lèi) 33 4 6消息映射與消息處理函數(shù) 4 6 2 1增加一個(gè)窗口消息以應(yīng)用程序MyExp為例 說(shuō)明用ClassWizard增加一個(gè)窗口消息處理函數(shù)的過(guò)程 1 在VC 工作界面下打開(kāi)MyExp項(xiàng)目 并啟動(dòng)ClassWizard 進(jìn)入對(duì)話框界面 2 從 ClassName 復(fù)合框中選擇視圖類(lèi)CMyExpView 在 ObjectIDs 列表框中就會(huì)列出各種消息來(lái)源的組件 3 從 ObjectIDs 列表框中選擇CMyExpView 在列表框 Message 中列出的就是CMyExpView類(lèi)對(duì)象能夠從窗口對(duì)象CWnd接受到的窗口消息和各種可重載的虛函數(shù) 從中可以找到名為WM LBUTTONDOWN的消息 用鼠標(biāo)選中這個(gè)消息 34 4 6消息映射與消息處理函數(shù) 4 此時(shí) AddFunction 按鈕處于可執(zhí)行狀態(tài) 單擊此按鈕 就會(huì)在CMyExpView類(lèi)中增加一個(gè)被CWnd保護(hù)的消息處理函數(shù)OnLButtonDown 5 在 Memberfunctions 列表框中能夠發(fā)現(xiàn)這個(gè)函數(shù)及其對(duì)應(yīng)的消息映射機(jī)制 OnLButtonDownON WM LBUTTONDOWN 在函數(shù)前有一個(gè) W 標(biāo)志 表示這個(gè)函數(shù)是一個(gè)窗口消息處理函數(shù) 6 單擊 OK 按鈕 完成一個(gè)窗口消息處理函數(shù)的增加 4 6 2 2增加窗口消息處理函數(shù)的過(guò)程的分析以上介紹了用ClassWizard增加一個(gè)窗口消息處理函數(shù)的過(guò)程 增加了該函數(shù)后 對(duì)于應(yīng)用程序MyExp的代碼做了如下的修改 35 4 6消息映射與消息處理函數(shù) 1 在視圖類(lèi)CMyExpView中 增加了消息處理函數(shù)的定義代碼 省略以上代碼protected AFX MSG CMyExpView afx msgvoidOnLButtonDown UINTnFlags CPointpoint 單擊鼠標(biāo)左鍵調(diào)用 AFX MSGDECLARE MESSAGE MAP 省略以下代碼 36 4 6消息映射與消息處理函數(shù) 2 在CMyExpView類(lèi)的實(shí)現(xiàn)文件MyExpview cpp中 增加了函數(shù)的實(shí)際代碼 voidCMyExpView OnLButtonDown UINTnFlags CPointpoint TODO Addyourmessagehandlercodehereand orcalldefaultCView OnLButtonDown nFlags point 3 在實(shí)現(xiàn)文件MyExpView cpp中 還增加了函數(shù)的消息映射機(jī)制 BEGIN MESSAGE MAP CMyExpView CView AFX MSG MAP CMyExpView 37 4 6消息映射與消息處理函數(shù) ON WM LBUTTONDOWN 單擊鼠標(biāo)左鍵 OnLButtonDown函數(shù)的消息映射 AFX MSG MAP StandardprintingcommandsON COMMAND ID FILE PRINT CView OnFilePrint ON COMMAND ID FILE PRINT DIRECT view OnFilePrint ON COMMAND ID FILE PRINT PREVIEW CView OnFilePrintPreview END MESSAGE MAP 38 4 6消息映射與消息處理函數(shù) 4 6 2 3ClassWizard識(shí)別和處理窗口消息處理函數(shù)所需要的標(biāo)識(shí)1 窗口消息處理函數(shù)的定義在類(lèi)的定義文件中 ClassWizard通過(guò)以下兩行固定的代碼來(lái)標(biāo)識(shí)消息處理函數(shù) AFX MSG CMyExpView ClassWizard標(biāo)識(shí)消息 處理函數(shù)定義的起始代碼 AFX MSG ClassWizard標(biāo)識(shí)消息處理函數(shù)定義 的結(jié)束代碼AFX MSG括號(hào)中的內(nèi)容 CMyExpView 是消息處理函數(shù)所在類(lèi)的名稱(chēng) 只有將消息處理函數(shù)定義在以上兩行代碼間時(shí) 才能被ClassWizard識(shí)別和處理 39 4 6消息映射與消息處理函數(shù) 2 窗口消息處理函數(shù)的實(shí)現(xiàn)在實(shí)現(xiàn)文件中 消息映射機(jī)制寫(xiě)在如下的兩行代碼間而被ClassWizard識(shí)別 AFX MSG MAP CMyExpView ClassWizard標(biāo)識(shí)消 息處理映射機(jī)制的起始代碼 AFX MSG MAP ClassWizard標(biāo)識(shí)消息處理 映射機(jī)制的結(jié)束代碼同樣 AFX MSG MAP括號(hào)中的內(nèi)容是擁用消息映射機(jī)制的類(lèi)的名稱(chēng) 只有當(dāng)一個(gè)消息處理函數(shù)的消息映射機(jī)制寫(xiě)在以上兩行代碼間時(shí) 才能被ClassWizard識(shí)別和處理 40 4 6消息映射與消息處理函數(shù) 4 6 2 4刪除窗口消息處理函數(shù)用ClassWizard刪除窗口消息處理函數(shù)的方法很簡(jiǎn)單 在操作界面中 從 MemberFunctions 列表框中選擇剛剛增加的OnLButtonDown函數(shù) 這時(shí) DeleteFuntion 按鈕處于激活可執(zhí)狀態(tài) 單擊此按鈕 系統(tǒng)會(huì)提示是否對(duì)OnLButtonDown函數(shù)進(jìn)行刪除 并提示必須用手工從實(shí)現(xiàn)文件中刪除函數(shù)的實(shí)際代碼 確認(rèn)后就刪除了這個(gè)消息處理函數(shù) 以上操作只是從視圖類(lèi)CMyExpView中刪除了函數(shù)的定義代碼 從實(shí)現(xiàn)文件中刪除了映射消息機(jī)制 而對(duì)于實(shí)現(xiàn)文件中的函數(shù)實(shí)現(xiàn)代碼 需要手工進(jìn)行刪除 這樣做的目的是避免誤操作而刪除大量有用的代碼 41 本章小結(jié) 42 習(xí)題- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言-C 面向 對(duì)象 程序設(shè)計(jì)語(yǔ)言 課件
鏈接地址:http://m.szxfmmzy.com/p-7407589.html