【正文】
數(shù),該菜單項(xiàng)或按鈕會被禁止使用。 b) 增加一個(gè)子菜單 若在定義菜單項(xiàng)時(shí)選中 Popup選項(xiàng),則在該菜單項(xiàng)右邊出現(xiàn)一個(gè)三角形符號,同時(shí)右邊出現(xiàn)一個(gè)新的菜單,再定義這個(gè)菜單。在 Resource View頁面,打開工程資源,選擇 Menu,然后雙擊主菜單資源IDR_MAINFRAME標(biāo)示,可打開菜單編輯器。 圖 例 資源是 windows應(yīng)用程序的一種特殊數(shù)據(jù) , 包括菜單 、 加速鍵 、光標(biāo) 、 位圖 、 圖標(biāo) 、 對話框 、 字符串 、 工具欄 、 狀態(tài)欄等 ,資源一般放在 exe或 DLL文件中 。 CEx3_1View 派生自 CView, 視圖類 。 1) 使用 AppWzard,根據(jù)實(shí)際需要,選擇創(chuàng)建合適的應(yīng)用程序框架 (是否使用文檔 /視圖結(jié)構(gòu),使用SDI或 MDI等 ) 2) 在文檔類中添加程序所處理的數(shù)據(jù),作為文檔類數(shù)據(jù)成員; 3) 在視圖類中取得文檔數(shù)據(jù),以合適的方式在窗口中顯示出來 例 3_1:創(chuàng)建一個(gè)包含文檔 /視圖結(jié)構(gòu)單文檔界面應(yīng)用的實(shí)例,為文檔類添加一個(gè)字符串?dāng)?shù)據(jù),在視圖窗口顯示出來。 通過 GetDocument獲得與視圖關(guān)聯(lián)的文檔類指針,通過指針pDoc訪問文檔類的數(shù)據(jù)成員和函數(shù)成員,在視圖(窗口)中顯示文檔對象,當(dāng)用戶通過視圖改變文檔數(shù)據(jù)時(shí),可設(shè)置自動更新文檔內(nèi)容。重定義這個(gè)函數(shù)實(shí)現(xiàn)在新文檔創(chuàng)建之前初始化文檔對象,如為指針申請內(nèi)存空間 √OnOpenDocument 當(dāng)從磁盤讀入文檔時(shí)由應(yīng)用程序框架調(diào)用。 詳見第 2章 。 例如 消息宏: (1).對標(biāo)準(zhǔn) Windows消息的響應(yīng) 消息宏 ON_WM_XXX定義對標(biāo)準(zhǔn) Windows消息 WM_XXX的響應(yīng),所有派生自 CWnd的類均可響應(yīng)這類消息,系統(tǒng)默認(rèn)的響應(yīng)函數(shù)為 OnXxx,對應(yīng)關(guān)系見下面的表 : 宏名 消息 默認(rèn)處理函數(shù) ON_WM_CHAR WM_CHAR OnChar ON_WM_ CLOSE WM_ CLOSE OnClose ON_WM_CREATE WM_ CREATE OnCreate ON_WM_LBUTTONDOWN WM_ LBUTTONDOWN OnLButtonDown ON_WM_LBUTTONUP WM_ LBUTTONUP OnLButtonUp ON_ WM_MOUSEMOVE WM_ MOUSEMOVE OnMouseMove 由于有系統(tǒng)默認(rèn)的消息和處理函數(shù),在消息映射表中只寫宏名,如: ON_WM_CREATE() (2).對命令消息的的響應(yīng) 。 (4).MFC應(yīng)用程序中看不到 WinMain()入口函數(shù),它被 封裝在應(yīng)用程序框架里,運(yùn)行時(shí)自動調(diào)用; 消息映射 (Message Map)機(jī)制 : 消息映射機(jī)制規(guī)定每個(gè)要響應(yīng)消息的類定義自己的消息映射表,將消息與處理消息的函數(shù)聯(lián)系在一起;當(dāng)事件發(fā)生產(chǎn)生消息時(shí),在程序中各個(gè)類的消息映射表中查找,當(dāng)找到消息處理函數(shù)時(shí),便將消息送至對應(yīng)的消息處理函數(shù)進(jìn)行處理。 m s g ) 。 m _ p M a i n W n d U p d a t e W i n d o w ( ) 。 A f x W i n I n i t ( . . . ) 。 (1).創(chuàng)建工程,工程類型選擇 Win32 Application,工程名為 Ex3_0; (2).創(chuàng)建 C++源文件,文件名 ,內(nèi)容如下 : include class CEx3_0App: public CWinApp{ //CWinApp派生類 public: virtual BOOL InitInstance() { MessageBox(NULL,”SimplistMFC Application.”, ”Ex3_0”,MB_OK)。 示例 關(guān)系圖 在打開的多個(gè)子窗口中 , 只有一個(gè)活動窗口 , 應(yīng)用程序菜單和工具欄的所有的命令都是針對活動窗口的 。 應(yīng)用程序框架介紹 程序的數(shù)據(jù)儲存在文檔類中(作為文檔類的數(shù)據(jù)成員),是對數(shù)據(jù)的抽象表示。第三章 MFC程序設(shè)計(jì) 本章的內(nèi)容 , 簡潔而不失完整性:由應(yīng)用程序向?qū)Ы⒊绦蚩蚣?, 由資源編輯器建立用戶界面 , 由類向?qū)Ы⒊蓡T變量 、 消息映射和處理函數(shù) , 加上文檔序列化和注冊 MFC包含了所有與系統(tǒng)相關(guān)的類 (包括圖形用戶界面相關(guān)的類 ), 其中封裝了大多數(shù)的 API函數(shù) , 提供了應(yīng)用程序框架和開發(fā)應(yīng)用程序的工具如應(yīng)用程序向?qū)?、 類向?qū)?、 可視化資源設(shè)計(jì)等高效工具 , 用消息映射處理消息響應(yīng) , 大大簡化了 Windows應(yīng)用程序的開發(fā)工作 , 使程序員可以從繁重的編程工作中解脫 , 提高工作效率 。使用應(yīng)用程序框架的應(yīng)用程序代碼小,運(yùn)行速度快,它提供的工具也降低了編碼的難度。 表 基于文檔 /視圖關(guān)系的 SDI應(yīng)用中的類 Document 文檔類 儲存與應(yīng)用程序相關(guān)的數(shù)據(jù) View 視圖類 決定文檔數(shù)據(jù)的顯示方式,提供用戶界面 Frame window框架窗口 派生自 CFrameWnd, 為 CWinApp類的m_pMainWnd成員賦值 Document template文檔模板 CSingelDocTemplate類對象,用構(gòu)造函數(shù)將文檔、視圖、框架窗口及用戶界面資源聯(lián)系在一起,創(chuàng)建并管理文檔 Application應(yīng)用程序類 代表應(yīng)用程序, 擁有指向文檔管理類的指針,管理應(yīng)用程序中所有文檔模板, 負(fù)責(zé)初始化和退出清理工作 返回 應(yīng)用程序類 框架類 ( 窗口框架 ) 資源 (決定用戶 界面的顯示 ) 視圖類 (顯示數(shù)據(jù)并 與用戶交互 ) 文檔類 (保存數(shù)據(jù) ) 單文檔模板 返回 應(yīng)用程序類 CDocManager* m_pDocManager 框架類 ( 窗口框架 ) 資源 (決定用戶 界面的顯示 ) m_pDocument 視圖類 (顯示數(shù)據(jù) 并與用戶交互 ) 文檔類 (保存數(shù)據(jù) ) m_pDocTemplate m_viewList 返回 單文檔模板 CRuntimeClass*m_pDocClass CRuntimeClass*m_pFrameClass CRuntimeClass*m_pViewClass UINT m_nIDResource 多文檔界面應(yīng)用簡稱 MDI(Multiple Document Interface),允許有多個(gè)文檔類、視圖類和多個(gè)文檔模板 CMultiDocTemplate(建立多種文檔 視圖 子框架關(guān)系 )存在,運(yùn)行時(shí)允許打開多個(gè) MDI子框架窗口,擁有各自的文檔和視圖對象。 例:顯示一個(gè)消息框。 (4).編譯生成并運(yùn)行此工程,結(jié)果顯示一個(gè)消息框 ,如下圖 : 圖 最簡單 MFC應(yīng)用示例 程序設(shè)計(jì) MFC應(yīng)用程序的執(zhí)行過程 (參見圖 ): — CWinApp派生類對象; WinMain函數(shù); i n t A F X A P I A f x W i n M a i n ( . . . ){ C W i n A p p * p A p p = A f x G e t A p p ( ) 。 m _ p M a i n W n d S h o w W i n d o w ( m _ n C m d S h o w ) 。 : : T r a n s l a t e M e s s a g e ( amp。 (3).每一個(gè) MFC應(yīng)用程序都包含唯一的 CWinApp派生類對象 ,代表應(yīng)用程序本身。例如 ② 在類的定義文件 (.cpp)定義消息映射表,方法是在 文件的開始處添加 BEIGN_MESSAGE_MAP和END_MESSAGE_MAP 這一對宏,在它們之間放置消息映射宏,定義并初始化消息映射表,在消息與處理消息的函數(shù)之間建立聯(lián)系; 例如 ③ 在類的定義文件 (.cpp)中添加消息處理函數(shù)。 對于一般的 Windows消息 , 由產(chǎn)生這些消息的對象響應(yīng) ,如窗口的創(chuàng)建 WM_CREATE,窗口的移動 WM_MOVE, 由產(chǎn)生消息的窗口類響應(yīng) , 如果找不到相應(yīng)的處理函數(shù) , 則將消息傳遞到其父類 , 一般情況都有缺省的響應(yīng)函數(shù); 對于命令消息 WM_COMMAND,可由擁有菜單資源的所有類來處理,傳遞的順序是視圖類、文檔類、文檔模板類、框架類、應(yīng)用程序類,即這些類處理命令消息的優(yōu)先順序。 /視圖結(jié)構(gòu) 文檔類的常用成員函數(shù) (帶 √ 的表示是可重定義函數(shù) ) 成員函數(shù) 說明 GetFirstViewPosition 返回一個(gè)第一個(gè)視圖的位置值 GetNextView 返回指向相關(guān)視圖隊(duì)列中下一個(gè)視圖的指針 GetPathName 取得文檔的文件名和路徑,若文檔未命名則返回空串 GetTitle 取得文檔的標(biāo)題,若文檔未命名則返回空串 IsModified 若文檔包含未保存數(shù)據(jù),則返回非 0,否則返回 0 SetModifiedFlag 設(shè)置或清除文檔的修改標(biāo)志 表 成員函數(shù) 說明 UpdateAllViews 文檔對應(yīng)多個(gè)視圖時(shí),更新所有視圖,它是通過調(diào)用每個(gè)視圖類的 OnUpdate函數(shù)來更新所有與本文檔關(guān)聯(lián)的視圖 √OnNewDocument 當(dāng)創(chuàng)建一個(gè)新文檔時(shí)由應(yīng)用程序框架調(diào)用。重定義這個(gè)函數(shù)可以實(shí)現(xiàn)只更新無效區(qū)域 表 CEx3_1Doc* pDoc = GetDocument()。 MDI允許有多個(gè)文檔模板,將不同文檔 視圖類聯(lián)系在一起,實(shí)現(xiàn)不同文檔視圖顯示關(guān)系。 CEx3_1Doc 派生自 CDocument, 文檔類 。 (4).顯示字符串 .在 CEx3_1View的 OnDraw()函數(shù)顯示字符串。 分類 : 頂層菜單 : 一般位于應(yīng)用程序主窗口或頂層窗口 彈出式菜單 : 選擇某個(gè)菜單項(xiàng)后彈出的子菜單 如果是 AppWizard產(chǎn)生的程序,系統(tǒng)已為框架創(chuàng)建了一個(gè)標(biāo)準(zhǔn)的主菜單,包括文件、編輯、視圖、窗口幫助等標(biāo)準(zhǔn)菜單,定義了各菜單項(xiàng)的 ID及相應(yīng)的命令處理函數(shù)。 在定義好的菜單后面,仍預(yù)留了一個(gè)空白菜單,可拖動該空白菜單到任意位置增加新的菜單。 圖 快捷鍵設(shè)置 注意 : (1).不要對不同菜單命令使用相同的加速鍵組合 , 以免產(chǎn)生二意性; (2).加速鍵命令必須有菜單命令與之對應(yīng),加速鍵不應(yīng)該是某個(gè)命令唯一啟動方式。 圖 ClassWizard 添加消息映射關(guān)系 工具欄 工具欄是一個(gè)包含一個(gè)或多個(gè)命令按鈕的窗口,一般情況下附著在窗口客戶區(qū)上方菜單欄下面,也可作為一個(gè)浮動的小窗口。 如果與工具欄按鈕對應(yīng)的菜單項(xiàng)定義了更新函數(shù) ,工具欄按鈕也會同步實(shí)現(xiàn)狀態(tài)的動態(tài)變化 。也就是說,該對話框打開后 , 程序等待用戶輸入,在關(guān)閉對話框后才執(zhí)行其它任務(wù)。 如 圖 。 將對話框與程序連結(jié) a)創(chuàng)建對話框類 對話框資源建立好后,在對話框中右擊鼠標(biāo),選擇 ClassWizard菜單項(xiàng),會出現(xiàn)提示框,說明新建的對話框資源是新資源,是否需要建立一個(gè)新類或選擇一個(gè)已存在的類。如 圖 。 CDC類派生自 CObject,它具有 CObject類的共同特性,如可以動態(tài)創(chuàng)建,可進(jìn)行序列化操作。 } POINT。 Windows預(yù)定義了標(biāo)準(zhǔn) GDI對象,供系統(tǒng)和程序使用,稱為 備用 GDI對象 ,可為多個(gè)程序同時(shí)使用。 //定義矩形 pDCRectangle(amp。 (HS_CROSS,RGB(dd,dd,dd)) 位圖畫刷 CBitmap指針 CBitmap bitmap。應(yīng)用程序框架提供了完成序列化的大多數(shù)結(jié)構(gòu),程序開發(fā)人員只需要完成針對特定應(yīng)用的數(shù)據(jù)序列化代碼。 (2)CDocument類存儲應(yīng)用程序的數(shù)據(jù) (數(shù)據(jù)成員和對象成員 ) MFC中與序列化相關(guān)的類 (4)CFile代表存儲在磁盤介質(zhì)上的文件,直接支持非緩沖文件和二進(jìn)制文件讀寫,其派生類支持文本文件和內(nèi)存文件。 //函數(shù)指針 , 指向該類的缺省構(gòu)造函數(shù) CRuntimeClass *m_pBaseClass。CObject::classObject。 e)重定義 Serialize函數(shù),其參數(shù)是一個(gè) CArchive對象的引用。 CEx3_1Doc::CEx3_1Doc():m_pStudent(0) { } //對象指針初始化為 0 void CEx3_1Doc::Serialize(CArchiveamp。