C程序設(shè)計(jì)語言揣錦華第11章VisualC環(huán)境下Windows.ppt
Windows程序要處理的消息種類如下:Windows消息。該類消息以WM_開頭(WM_COMMAND例外),通常由窗口和視圖來處理。這些消息常常帶有參數(shù),用于決定處理該消息的方式。由控件和其它子窗口發(fā)送給父窗口的WM_COMMAND消息。這些消息中包括EN_CHANGE通知碼。如當(dāng)用戶在編輯框中鍵入文本或進(jìn)行修改時(shí),就會(huì)向系統(tǒng)發(fā)送一個(gè)帶EN_CHANGE通知碼的WM_COMMAND消息。來自于用戶界面對象的WM_COMMAND消息。這些用戶界面對象包括菜單、工具欄按鈕和快捷鍵。,11.3MFC基礎(chǔ),11.3.1MFC類庫簡介類庫是一個(gè)可以在應(yīng)用程序中使用的相互關(guān)聯(lián)的C+類的集合。與一般類庫不同,MFC是一個(gè)Windows應(yīng)用程序框架,它定義了應(yīng)用程序的結(jié)構(gòu)并實(shí)現(xiàn)了標(biāo)準(zhǔn)的用戶接口。MFC提供了管理窗口、菜單、對話框的代碼,可實(shí)現(xiàn)基本的輸入輸出和數(shù)據(jù)存儲。MFC為我們提供了大量可重用代碼,隱藏了程序設(shè)計(jì)中的許多復(fù)雜工作,這也是面向?qū)ο蠓椒ǖ牡湫腕w現(xiàn)。,MFC的類可分為兩種:從CObject派生的類以及非派生類。本小節(jié)按功能組對MFC庫中的常用類做一簡要介紹。1根類CobjectMicrosoft基本類庫中的大多數(shù)類都是由CObject類派生而來的。CObject對所有由它派生出的類提供了有用的基本服務(wù)。,2MFC應(yīng)用結(jié)構(gòu)類MFC應(yīng)用結(jié)構(gòu)類用于構(gòu)造一個(gè)應(yīng)用的框架。它們對大多數(shù)應(yīng)用提供了通用功能。我們可以在框架中填寫對于應(yīng)用的特定的功能。AppWizard可以產(chǎn)生幾種類型的應(yīng)用,所有這些都以不同的方式使用應(yīng)用框架。1)應(yīng)用程序和線程支持類每一個(gè)應(yīng)用都有一個(gè)也只有一個(gè)應(yīng)用對象,這個(gè)對象派生自CWinApp。Microsoft基本類庫支持在一個(gè)應(yīng)用中有多個(gè)執(zhí)行線程。所有的應(yīng)用都必須至少有一個(gè)線程。CWinApp對象使用的線程叫做“主”線程。CWinThread封裝了一部分操作系統(tǒng)的線程功能。,2)命令例程類當(dāng)使用鼠標(biāo)選擇菜單或控制條按鈕,并與應(yīng)用程序交互時(shí),應(yīng)用程序把消息從受影響的界面對象發(fā)至合適的命令目標(biāo)對象。命令目標(biāo)對象從CCmdTarget派生出來,包括CWinApp、CWnd、CDocTemplate、CDocument、CView和它們的派生類??蚣苤С肿詣?dòng)命令例程,這樣,命令可被應(yīng)用程序中活動(dòng)的大多數(shù)相應(yīng)的對象處理。,3)文檔類文檔類對象管理應(yīng)用程序的數(shù)據(jù)并與視圖類對象交互。視圖對象表示窗口的客戶區(qū)并顯示文檔的數(shù)據(jù),允許用戶與之交互。文檔和視圖都是由文檔模板對象產(chǎn)生的。,4)文檔模板類當(dāng)創(chuàng)建一個(gè)新文檔/視圖時(shí),文檔模板對象一并創(chuàng)建文檔、視圖和框架窗口對象。3窗口、對話框和控件類1)CWnd類CWnd類是所有窗口的基類。程序中可以使用MFC中的CWnd派生類,也可以從其中派生出自己的類。,2)框架窗口類CFrameWnd是SDI應(yīng)用程序主框架窗口的基類??蚣艽翱谕ǔ0渌翱?,如視圖、工具條和狀態(tài)條。3)對話框類類CDialog和它的派生類封裝了對話框功能。由于對話框是一種特殊的窗口,所以CDialog是從CWnd派生的。CDialog又是所有對話框的基類。,4)視圖類CView是視圖類的基類。CView及其派生類是一些子窗口,表示框架窗口的客戶區(qū)。視圖顯示數(shù)據(jù),并接收文檔的輸入,以便編輯或選擇數(shù)據(jù)。5)控件類控件類封裝了各式各樣的標(biāo)準(zhǔn)Windows控件,從靜態(tài)文字控件到樹形控件。另外,MFC提供了一些新控件,包括帶位圖和控制條的按鈕。,6)控件條類控件條附加在一個(gè)框架窗口中。它們包含按鈕、狀態(tài)面板或一個(gè)對話模板。自由浮動(dòng)控件還可以調(diào)用工具調(diào)色板,這是通過把它們附加在CMiniFrameWnd對象上實(shí)現(xiàn)的。,4菜單類類CMenu直接從CObject派生出來,封裝了Windows中菜單的數(shù)據(jù)結(jié)構(gòu),它提供一個(gè)界面,通過它可訪問應(yīng)用程序的菜單。5繪圖和打印類在Windows中,所有的圖形輸出都在一個(gè)可視的繪圖區(qū)上,這叫做一個(gè)設(shè)備上下文(或DC),所有對繪圖的調(diào)用都是通過一個(gè)設(shè)備上下文對象完成的。,6簡單的數(shù)據(jù)類型類這些類封裝了繪圖坐標(biāo)、字符串、時(shí)間和數(shù)據(jù)信息。7數(shù)組、列表和映射類數(shù)組是一維數(shù)據(jù)結(jié)構(gòu),它們在內(nèi)存中是連續(xù)存儲的。因?yàn)閿?shù)組中任何一個(gè)給定元素的內(nèi)存地址可以通過將元素的下標(biāo)乘以一個(gè)元素的大小再加上數(shù)組的基地址而得到,所以數(shù)組支持非??斓碾S機(jī)訪問。,8文件和數(shù)據(jù)庫類這些類允許將信息存儲在一個(gè)數(shù)據(jù)庫或一個(gè)磁盤文件中。有兩個(gè)數(shù)據(jù)庫類的集合DAO和ODBC,它們提供了相似的功能。DAO組使用數(shù)據(jù)訪問對象實(shí)現(xiàn),ODBC組使用開放式數(shù)據(jù)庫對象實(shí)現(xiàn)。還有用于操作標(biāo)準(zhǔn)文件、Active流和HTML流的類的集合。1)文件I/O類這些類對傳統(tǒng)磁盤文件、內(nèi)存文件、Active流和Windows套接字提供了一個(gè)接口。,2)DAO類這些類與其它應(yīng)用框架一起工作,可以使對DAO(數(shù)據(jù)訪問對象)數(shù)據(jù)庫的訪問更簡便。DAO類使用的數(shù)據(jù)庫引擎與MicrosoftVisualBasic和MicrosoftAccess相同。DAO類還能訪問許多支持開放數(shù)據(jù)庫鏈接(ODBC)驅(qū)動(dòng)程序的數(shù)據(jù)庫。3)ODBC類這些類和其它應(yīng)用框架一起工作,可以使得對許多支持開放數(shù)據(jù)庫鏈接(ODBC)的數(shù)據(jù)庫的訪問更簡便。,9Internet和網(wǎng)絡(luò)類這些類允許和其它使用ISAPI的計(jì)算機(jī)或一個(gè)WindowsSocket交換信息。Internet和網(wǎng)絡(luò)類還有創(chuàng)建ISAPI擴(kuò)展DLL的類的集合和操作Windows套接字的類的集合。10.OLE類OLE類與其它應(yīng)用框架一起工作,可以使對ActiveX的訪問更方便,可以使程序更容易地提供ActiveX的功能。,11調(diào)試和異常類這些類提供對調(diào)試動(dòng)態(tài)內(nèi)存分配的支持,并且支持將異常信息從產(chǎn)生異常的函數(shù)傳遞給捕獲異常的函數(shù)。,11.3.2MFC應(yīng)用程序框架應(yīng)用程序框架包含用于生成應(yīng)用程序所必須的各種面向?qū)ο蠼M件的集合。在VisualC+中,MFCAppWizard能方便地生成應(yīng)用程序框架,用戶可以在此基礎(chǔ)上進(jìn)行進(jìn)一步的編程工作。MFCAppWizard生成的應(yīng)用程序包括以下要素。WinMain函數(shù)。Windows要求應(yīng)用程序必須有一個(gè)WinMain函數(shù)。但在我們的程序中看不到WinMain,因?yàn)樗[藏在應(yīng)用程序框架中。,應(yīng)用程序類CmyFirstApp。該類的每一個(gè)對象代表一個(gè)應(yīng)用程序。程序中默認(rèn)定義一個(gè)全局CMyFirstApp對象,即theApp。CWinApp基類決定theApp的大多數(shù)行為。應(yīng)用程序啟動(dòng)。啟動(dòng)應(yīng)用程序時(shí),Windows調(diào)用應(yīng)用程序框架內(nèi)置的WinMain函數(shù),WinMain尋找由CWinApp派生出的全局構(gòu)造的應(yīng)用程序?qū)ο?。在C+程序中,全局對象在主程序執(zhí)行之前構(gòu)造。,成員函數(shù)CmyFirstApp:InitInstance。當(dāng)WinMain函數(shù)找到應(yīng)用程序?qū)ο髸r(shí),它調(diào)用偽成員函數(shù)InitInstance,這個(gè)成員函數(shù)調(diào)用所需的構(gòu)造并顯示應(yīng)用程序的主框架窗口。必須在派生的應(yīng)用程序類中重載InitInstance,因?yàn)镃WinApp基類不知道需要什么樣的主框架窗口。成員函數(shù)CwinApp:Run。函數(shù)Run隱藏在基類中,但是它發(fā)送應(yīng)用程序的消息到窗口,以保持應(yīng)用程序的正常運(yùn)行。在WinMain調(diào)用InitInstance之后,便調(diào)用Run。,CMainFrame類。CMainFrame類的對象代表應(yīng)用程序的主框架窗口。當(dāng)構(gòu)造函數(shù)調(diào)用基類CMainFrame的成員函數(shù)Create時(shí),Windows創(chuàng)建實(shí)際窗口結(jié)構(gòu),應(yīng)用程序框架把它連接到C+對象。函數(shù)ShowWindows和UpdateWindow也是基類的成員函數(shù),必須調(diào)用它們來顯示窗口。,文檔與視圖類。MFC通過“文檔視圖”的結(jié)構(gòu)為應(yīng)用程序提供一種將數(shù)據(jù)與視圖相分離的存儲方式。文檔類的作用是將應(yīng)用程序的數(shù)據(jù)保存在文檔類對象中,以及從磁盤文件中讀或向磁盤文件中寫數(shù)據(jù)。視圖類的作用是顯示數(shù)據(jù)和編輯數(shù)據(jù)。在文檔、視圖以及應(yīng)用程序框架的其余部分之間存在著非常復(fù)雜的相互作用過程。一個(gè)文檔至少應(yīng)該有一個(gè)與之對應(yīng)的視圖。很多情況下,一個(gè)文檔有多個(gè)視圖與之對應(yīng)。,關(guān)閉應(yīng)用程序。如果用戶通過關(guān)閉主框架窗口來關(guān)閉應(yīng)用程序,這個(gè)操作就將激發(fā)一系列事件的發(fā)生,包括CMainFrame對象的析構(gòu)、從Run中退出、從WinMain中退出和CMyFirstApp對象的析構(gòu)。,11.4使用VisualC+開發(fā)Windows程序?qū)嵗?為了使讀者對Windows程序開發(fā)方法有一個(gè)初步印象,下面我們給出一個(gè)完整的使用VisualC+開發(fā)Windows程序的實(shí)例。用MFC向?qū)?chuàng)建如圖11-3所示的編輯框,在編輯框中實(shí)現(xiàn)算術(shù)加、減、乘和除的運(yùn)算。,圖11-3可實(shí)現(xiàn)算術(shù)加、減、乘和除的運(yùn)算的界面,1利用MFC向?qū)Ы⒊绦蚩蚣?1)在進(jìn)入VisualC+6.0的第一個(gè)界面下,選擇MFCAppwizard(exe),并設(shè)置工程名及其所在位置,如圖11-4所示。,