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