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