C++課程設(shè)計(jì).ppt_第1頁
C++課程設(shè)計(jì).ppt_第2頁
C++課程設(shè)計(jì).ppt_第3頁
C++課程設(shè)計(jì).ppt_第4頁
C++課程設(shè)計(jì).ppt_第5頁
已閱讀5頁,還剩104頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、C+課程設(shè)計(jì),課程設(shè)計(jì)目的,通過本課程設(shè)計(jì)教學(xué),為學(xué)生提供一個(gè)綜合運(yùn)用所學(xué)知識(shí),解決實(shí)際問題的機(jī)會(huì),增強(qiáng)其實(shí)踐動(dòng)手能力和工程實(shí)踐能力,鍛煉和培養(yǎng)學(xué)生的自學(xué)能力,使學(xué)生能利用C+語言設(shè)計(jì)功能較全的一個(gè)應(yīng)用程序,得到程序設(shè)計(jì)方法、文獻(xiàn)資料查詢、設(shè)計(jì)報(bào)告寫作的綜合訓(xùn)練。同時(shí)加深對課程所學(xué)知識(shí)的理解,進(jìn)一步鞏固C+語言語法規(guī)則,學(xué)會(huì)編制結(jié)構(gòu)清晰、風(fēng)格良好、數(shù)據(jù)結(jié)構(gòu)適當(dāng)?shù)腃+語言程序。,課程設(shè)計(jì)任務(wù),參照C+程序設(shè)計(jì)實(shí)踐教程中P92的實(shí)例,從p106-108的 7-11題中任選一題,在vc+環(huán)境下實(shí)現(xiàn)(Win32 Console Application,25學(xué)時(shí)) 編寫一個(gè)簡單的基于MFC的應(yīng)用程序(5

2、學(xué)時(shí)) 撰寫設(shè)計(jì)報(bào)告,課程設(shè)計(jì)的基本步驟,分析問題及確定解決方案 綜合運(yùn)用模塊化設(shè)計(jì)思想和面向?qū)ο笤O(shè)計(jì)思想,使系統(tǒng)結(jié)構(gòu)清晰、合理、簡單和易于調(diào)試。 詳細(xì)設(shè)計(jì) 設(shè)計(jì)好每一個(gè)類及模塊,畫出程序框圖。 編碼 靜態(tài)檢查 上機(jī)調(diào)試 完成設(shè)計(jì)報(bào)告,設(shè)計(jì)報(bào)告包括的內(nèi)容,問題描述:設(shè)計(jì)任務(wù)及系統(tǒng)需求 系統(tǒng)設(shè)計(jì):系統(tǒng)的功能模塊結(jié)構(gòu)、各模塊的功能;各功能模塊的設(shè)計(jì)思路、主要算法思想(算法流程圖或偽代碼) 系統(tǒng)調(diào)試:調(diào)試過程中遇到的主要問題及解決的方法;對設(shè)計(jì)和編碼的回顧討論和分析;改進(jìn)思想;收獲和體會(huì)等 參考文獻(xiàn) 附錄:主要源程序清單,程序調(diào)試,語法錯(cuò)誤,邏輯錯(cuò)誤 1、插入調(diào)試語句 1)設(shè)置狀態(tài)變量 2)設(shè)置計(jì)數(shù)

3、器 3)插入輸出語句 2、利用調(diào)試工具,進(jìn)入調(diào)試狀態(tài) 選擇“Build-Start Debug-Step Into”或者按“F11”鍵進(jìn)入單步執(zhí)行狀態(tài) 設(shè)置需要觀察的變量 選則適當(dāng)?shù)膱?zhí)行方式,第一章 鏈 表,鏈表是最簡單也是最常用的一種動(dòng)態(tài)數(shù)據(jù)結(jié)構(gòu)。它是對動(dòng)態(tài)獲得的內(nèi)存進(jìn)行組織的一種結(jié)構(gòu);不同于數(shù)組,數(shù)組存儲(chǔ)數(shù)據(jù)時(shí),必須事先定義固定的長度(即數(shù)組元素個(gè)數(shù))。,鏈表的結(jié)點(diǎn)是結(jié)構(gòu)體變量,它可包含若干成員,其中有些成員可以是任何類型,如基本類型、數(shù)組類型、結(jié)構(gòu)體類型等,一般用于存儲(chǔ)數(shù)據(jù)元素的信息,稱之為數(shù)據(jù)域;另一些成員是指針類型,是用來存儲(chǔ)與之相連的結(jié)點(diǎn)的地址,稱之為指針域,單向鏈表的結(jié)點(diǎn)只包含一

4、個(gè)這樣的指針成員。,一、鏈表的概念,下面是一個(gè)單向鏈表結(jié)點(diǎn)的類型說明: struct node int data; struct node *next; /存放下一結(jié)點(diǎn)的地址 ; 其中,data成員用于存儲(chǔ)一個(gè)整數(shù),next成員是指針類型的,它指向struct node類型數(shù)據(jù)(這就是next所在的結(jié)構(gòu)體類型,每一個(gè)結(jié)點(diǎn)都屬于node類型,在它的成員next中存放下一個(gè)結(jié)點(diǎn)的地址,程序設(shè)計(jì)者不必知道各結(jié)點(diǎn)的具體地址,只要保證能將下一個(gè)結(jié)點(diǎn)的地址放到前一結(jié)點(diǎn)的成員next中即可。,鏈表有一個(gè)“頭指針”變量,圖中以head表示,二、內(nèi)存動(dòng)態(tài)管理運(yùn)算符,申請一個(gè)存儲(chǔ)指定數(shù)據(jù)類型的值的內(nèi)存空間 = n

5、ew (); 為數(shù)組申請內(nèi)存: = new ;,內(nèi)存空間申請new new運(yùn)算符的功能是根據(jù)指定數(shù)據(jù)類型的大小申請一塊適當(dāng)?shù)膭?dòng)態(tài)存儲(chǔ)區(qū),并返回指向該動(dòng)態(tài)存儲(chǔ)空間的起始地址;若申請不成功,則會(huì)返回NULL值。 一般將new操作的結(jié)果賦給具有相應(yīng)數(shù)據(jù)類型的指針變量。,二、內(nèi)存動(dòng)態(tài)管理運(yùn)算符,2. 內(nèi)存空間釋放delete 使用new運(yùn)算符動(dòng)態(tài)分配給用戶的存儲(chǔ)空間,可以通過使用delete運(yùn)算符重新歸還給系統(tǒng),若沒有使用delete釋放該內(nèi)存區(qū)域,則只有等到整個(gè)程序運(yùn)行結(jié)束才被系統(tǒng)重新自動(dòng)回收。,用于釋放先前申請到的內(nèi)存空間: delete ; 用于釋放先前為數(shù)組申請到的空間: delete ;,例

6、如: float *pf=new float(55.8); int *pa=new int20; int m; int *pi= /釋放pa所指的動(dòng)態(tài)數(shù)組內(nèi)存空間,delete只能釋放用new申請的動(dòng)態(tài)內(nèi)存空間。,三、鏈表的基本操作,鏈表的基本操作包括建立鏈表、鏈表的插入、刪除、輸出和查找等。 1. 建立鏈表 所謂建立鏈表是指一個(gè)一個(gè)地輸入各結(jié)點(diǎn)數(shù)據(jù),并建立起各結(jié)點(diǎn)前后相鏈的關(guān)系。 下面通過一個(gè)例子來說明如何建立一個(gè)鏈表。 兩種方式:插鏈表尾、插鏈表頭,三、鏈表的基本操作,插鏈表尾:是指新插入的結(jié)點(diǎn)總是放在鏈表尾部。一般地,鏈表是在一個(gè)空鏈表的基礎(chǔ)上逐步插入新結(jié)點(diǎn)而成的,空鏈表是指沒有一個(gè)結(jié)點(diǎn)

7、,此時(shí)鏈表的頭指針為空。,用插表尾法建立鏈表的過程如下: 1) 建立空鏈表,head = last =NULL; head表示頭表頭,指向空,表示鏈表為空, last是表尾指針。 2) 產(chǎn)生新結(jié)點(diǎn)p,對新結(jié)點(diǎn)的數(shù)據(jù)域和指針域賦值。由于新插入的結(jié)點(diǎn)總是表尾結(jié)點(diǎn),則它的后繼結(jié)點(diǎn)為空。,三、鏈表的基本操作,3) 將p結(jié)點(diǎn)插入鏈表,如果head 為NULL,則 head = p; 新結(jié)點(diǎn)作為表頭,這時(shí)鏈表只有一個(gè)結(jié)點(diǎn),否則,last-next=p; 即插入鏈尾操作。 4) last = p;表示表尾指針last指向新結(jié)點(diǎn)p。 5) 循環(huán)執(zhí)行2)4),可繼續(xù)建立新結(jié)點(diǎn)直到結(jié)束為止,寫一函數(shù)采用插表尾法建

8、立一個(gè)有n個(gè)node結(jié)點(diǎn)的單向鏈表。 struct node int data; struct node *next; ; void creat(node * /置表頭、表尾指針為空,此時(shí)為空鏈表,p=new node; /產(chǎn)生一個(gè)p所指的動(dòng)態(tài)結(jié)點(diǎn) cinx; p-data=x; p-next=NULL; head=last=p; if(n=1) return; for(i=1;inext=p; cinx; p-data=x; last=p; p-next=NULL; ,2.鏈表的輸出 要依次輸出鏈表中各結(jié)點(diǎn)的數(shù)據(jù)比較容易處理。首先要知道鏈表頭結(jié)點(diǎn)的地址,也就是head的值,然后設(shè)一個(gè)指針變量

9、p,先指向第一個(gè)結(jié)點(diǎn),輸出p所指結(jié)點(diǎn)的數(shù)據(jù)域的值,然后使p后移一個(gè)結(jié)點(diǎn),再輸出其數(shù)據(jù)域的值;依鏈表順序而行,依次輸出相應(yīng)結(jié)點(diǎn)數(shù)據(jù)域的值,直到鏈表的尾結(jié)點(diǎn)。,輸出鏈表的函數(shù)traverse如下: void traverse (node *head) node *p; p=head; while(p) coutdatanext; /使p指針移動(dòng)到下一個(gè)結(jié)點(diǎn) coutendl; head的值由實(shí)參傳過來也就是將已有的鏈表的頭指針傳給被調(diào)用的函數(shù),在traverse函數(shù)中從head所指的第一個(gè)結(jié)點(diǎn)出發(fā),順序輸出各個(gè)結(jié)點(diǎn)。,3.鏈表的刪除操作 從一個(gè)鏈表中刪去一個(gè)結(jié)點(diǎn),首先從表頭開始,找到被刪結(jié)點(diǎn)后,只

10、要改變鏈接關(guān)系即可,即修改結(jié)點(diǎn)指針域的值,使被刪結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)的指針域指向被刪結(jié)點(diǎn)的后繼結(jié)點(diǎn)。,刪除結(jié)點(diǎn)算法描述如下: 用指針p指向刪除結(jié)點(diǎn),p1指向其前驅(qū)結(jié)點(diǎn), 1) p = head ;從第一個(gè)結(jié)點(diǎn)開始檢查; 2) 當(dāng) p指向的結(jié)點(diǎn)不是滿足刪除條件的結(jié)點(diǎn)且沒有到表尾,p1 = p; p = p-next; (移動(dòng)指針p,繼續(xù)找) 3) 如果找到了刪除結(jié)點(diǎn)p,如果 p= = head 刪除的是頭結(jié)點(diǎn),則 head = head-next ; /*刪除頭結(jié)點(diǎn)*/ else p1-next = p-next ; /*刪除p指向的結(jié)點(diǎn)*/ 4)delete p; 釋放刪除結(jié)點(diǎn)的內(nèi)存空間。,刪除鏈表

11、中一個(gè)結(jié)點(diǎn)的函數(shù)erase如下: void erase(node* ,else while(p-data!=no) p1=p; p=p-next; if(p=NULL) coutnext=p-next; delete p; cout刪除結(jié)點(diǎn)成功endl; ,實(shí)例:設(shè)計(jì)一個(gè)學(xué)生成績管理系統(tǒng)。,第二章 MFC編程基礎(chǔ)知識(shí),本章介紹MFC的基本原理 Windows操作系統(tǒng)采用了圖形用戶界面,借助于它提供的API(Application Programming Interface)函數(shù),用戶可以編出具有漂亮圖形界面的程序。 Windows本身是面向?qū)ο蟮?,因此采用面向?qū)ο蟮某绦蛟O(shè)計(jì)更為自然。VC+的微

12、軟基礎(chǔ)類庫(Microsoft Foundation Class Library,MFC)封裝了大部分API函數(shù),并提供了一個(gè)應(yīng)用程序框架,簡化和標(biāo)準(zhǔn)化了Windows程序設(shè)計(jì),因此MFC編程被稱為標(biāo)準(zhǔn)Windows程序設(shè)計(jì)。,第二章 MFC編程基礎(chǔ)知識(shí)(選讀),2.1 傳統(tǒng)的Windows編程,2.3 MFC基礎(chǔ)類及其層次結(jié)構(gòu),2.5 MFC對象和Windows對象,2.4 MFC編程,2.7 MFC中的文件處理,2.6 MFC的消息映射,2.2 Windows對象句柄,2.1 傳統(tǒng)的Windows 編程,Windows操作系統(tǒng)的特征: Windows操作系統(tǒng)是多任務(wù)、圖形界面的操作系統(tǒng)。W

13、indows擁有一個(gè)圖形用戶界面(GUI)。用戶可以用鍵盤和鼠標(biāo)與顯示器上的圖形實(shí)現(xiàn)直接交互。 Windows支持多任務(wù)操作,可在同一時(shí)刻運(yùn)行多個(gè)程序,并可在程序間進(jìn)行信息交互。每個(gè)程序只能在稱為“窗口”的屏幕矩形區(qū)中實(shí)現(xiàn)輸出。 Windows的圖形設(shè)備接口(GDI),實(shí)現(xiàn)了程序與設(shè)備的無關(guān)性,即為Windows編寫的應(yīng)用程序可以運(yùn)行于任何具有Windows設(shè)備驅(qū)動(dòng)程序的硬件環(huán)境中,方便了使用。,2.1 傳統(tǒng)的Windows 編程,API函數(shù): 為使程序員在編寫應(yīng)用程序時(shí)實(shí)現(xiàn)這些特征,Windows提供了一個(gè)應(yīng)用程序編程接口,稱Windows API(Application Programmi

14、ng Interface),這是Windows支持的函數(shù)定義、參數(shù)定義和消息格式的集合,可供應(yīng)用程序調(diào)用。 這上千個(gè)API函數(shù)包含了各種窗口類和系統(tǒng)資源(內(nèi)存管理、文件、線程等等)。利用這些函數(shù)就可以編出具有Windows風(fēng)格的程序。Windows API也是Windows操作系統(tǒng)自帶的在Windows環(huán)境下運(yùn)行的軟件開發(fā)包(SDK)。程序員總是直接或間接引用API進(jìn)行應(yīng)用程序的開發(fā),所以Windows應(yīng)用程序就有大致相同的用戶界面。,2.1 傳統(tǒng)的Windows 編程,C/C+調(diào)用API函數(shù)的優(yōu)勢: Windows環(huán)境下的最佳編程語言就是C/C+語言,因?yàn)閃indows API函數(shù)本身就是用

15、C語言編寫的,C和C+調(diào)用C語言的API函數(shù)是直接調(diào)用,而其他語言則多一道轉(zhuǎn)換。C/C+編程可以很方便地利用計(jì)算機(jī)的底層資源,其程序運(yùn)行速度遠(yuǎn)遠(yuǎn)高于其他語言。,2.1 傳統(tǒng)的Windows 編程,1) 系統(tǒng)服務(wù),2) 通用控件庫,3) 圖形設(shè)備接口,4) 網(wǎng)絡(luò)服務(wù),5) 用戶接口,6) 系統(tǒng)Shell,7) Windows 系統(tǒng)信息,標(biāo)準(zhǔn)Win32 API 函數(shù)分類:,2.1 傳統(tǒng)的Windows 編程,傳統(tǒng)的Windows編程 :直接采用API進(jìn)行的C/C+程序設(shè)計(jì) 【例2.1】一個(gè)對話框的簡單Windows程序: #include int APIENTRY WinMain(HINSTANC

16、E hInstance, HINSTANCE hPreinstance, LPSTR lpCmdLine, int nCmdshow) MessageBox(NULL,This is a MessageBox windows example,Ex2_1,MB_OK); return 0; ,2.1 傳統(tǒng)的Windows 編程,說明: (1) windows.h是windows程序最基本的頭文件,它包含了其它幾個(gè)windows頭文件,它們定義了windows的所有數(shù)據(jù)類型、數(shù)據(jù)結(jié)構(gòu)、符號(hào)常量和API函數(shù)原型聲明。 (2) MessageBox 是一個(gè)API函數(shù),顯示一個(gè)消息框。其中:第一個(gè)參數(shù)指

17、明此消息框的父窗口句柄,為NULL則說明沒有父窗口; 第二、三個(gè)參數(shù)類型均為字符型指針,分別指向消息框中要顯示的字符串和消息框標(biāo)題欄顯示的字符串; 第四個(gè)參數(shù)是一個(gè)無符號(hào)整數(shù),表明消息框中顯示的按鈕和風(fēng)格。 #define MB_OK 0 x00000000L / OK按鈕 #define MB_OKCANCEL 0 x00000001L / OK和CANCEL兩個(gè)按鈕 #define MB_ABORTRETYRIGNORE 0 x00000002L /ABORT,RETRY和IGNORE3個(gè)按鈕 #define MB_YESNOCANCEL0 x00000003L / YES、NO和CANC

18、EL共3個(gè)按鈕,2.1 傳統(tǒng)的Windows 編程,(3) WinMain函數(shù)是windows程序的入口函數(shù),包含4個(gè)參數(shù): hInstance是唯一標(biāo)識(shí)本程序的實(shí)例句柄,系統(tǒng)和其它應(yīng)用程序通過該句柄與本程序通訊。 hPrevInstance是本程序的前一個(gè)實(shí)例句柄,由于32位windows采用進(jìn)程線程模式,每一線程擁有自己的句柄,因此該參數(shù)始終為空。 lpCmdLine是一個(gè)字符串指針,指向命令行參數(shù)字符串,沒有命令行參數(shù)時(shí)為空。 nCmdShow指明程序最初運(yùn)行時(shí)窗口打開方式,如正常方式、最大化或最小化運(yùn)行。 WinMain返回一個(gè)整數(shù)值,作為退出代碼。 APIENTRY表示函數(shù)調(diào)用約定,

19、函數(shù)調(diào)用時(shí)參數(shù)按從左至右的順序壓入棧,由被調(diào)用者將參數(shù)彈出棧。,2.1 傳統(tǒng)的Windows 編程,典型的Windows程序結(jié)構(gòu): Windows程序采用事件驅(qū)動(dòng)、消息傳遞方式,由入口函數(shù)和窗口函數(shù)兩部分組成。 入口函數(shù)中有一個(gè)由while語句組成的消息循環(huán),其中調(diào)用了諸如獲取消息、鍵盤消息轉(zhuǎn)換、派送消息和窗口處理函數(shù)等API函數(shù),循環(huán)直到取得退出消息(WIN-QUIT)結(jié)束。 在應(yīng)用程序中還有由操作系統(tǒng)的API函數(shù)回調(diào)(callback)的窗口處理函數(shù)(簡稱窗口函數(shù)),根據(jù)消息值轉(zhuǎn)向相應(yīng)的消息處理,這是由switch語句組成的多向選擇。如果不能處理則轉(zhuǎn)缺省的窗口函數(shù)。參見圖2.3。,2.1

20、傳統(tǒng)的Windows 編程,圖2.3 Windows消息流程,2.1 傳統(tǒng)的Windows 編程,【例2.2】顯示一個(gè)窗口的Windows應(yīng)用程序。,#include /包含windows.h頭文件 LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM ); /窗口函數(shù)聲明 /*入口函數(shù) WinMain()*/ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine,int nCmdShow) WNDCLASS wndclass; /定

21、義窗口類結(jié)構(gòu)變量 HWND hwnd; /定義窗口句柄 MSG msg; /定義消息結(jié)構(gòu)變量,2.1 傳統(tǒng)的Windows 編程,/*窗口類使用步驟*/ /*定義窗口類的各屬性*/ wndclass.style = CS_HREDRAW|CS_VREDRAW; /改變窗口大小則重畫 wndclass.lpfnWndProc = WndProc; /窗口函數(shù)為 WndProc wndclass.cbClsExtra = 0;/窗口類無擴(kuò)展 wndclass.cbWndExtra = 0;/窗口實(shí)例無擴(kuò)展 wndclass.hInstance = hInstance; /注冊窗口類實(shí)例句柄 wnd

22、class.hIcon = LoadIcon(NULL,IDI_APPLICATION); /用默認(rèn)光標(biāo) wndclass.hCursor = LoadCursor(NULL,IDC_ARROW); /用箭頭光標(biāo) wdclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); /背景為白色 wndclass.lpszMenuName = NULL;/窗口缺省無菜單 wndclass.lpszClassName = Ex2_2; /窗口類名為Ex2_2,2.1 傳統(tǒng)的Windows 編程,/*設(shè)置后,必須注冊窗口類設(shè)置才生效*/ if(!

23、 RegisterClass( /此窗口無創(chuàng)建參數(shù),2.1 傳統(tǒng)的Windows 編程,/*顯示并更新窗口*/ ShowWindow(hwnd,nCmdShow); /顯示窗口 UpdateWindow (hwnd); /更新窗口的客戶區(qū) /*消息循環(huán)*/ /獲取消息,遇WM_QUIT退出循環(huán) while(GetMessage ( /返回退出值 ,2.1 傳統(tǒng)的Windows 編程,/*窗口函數(shù)*/ LRESULT CALLBACK WndProc(HWND hwnd,UINT message, WPARAM wParam, LPARAM lParam) /根據(jù)消息值轉(zhuǎn)相應(yīng)的消息處理 swit

24、ch (message) case WM_PAINT: /重畫窗口客戶區(qū)消息處理 HDC hdc; /定義設(shè)備描述表句柄 PAINTSTRUCT ps; /定義繪圖信息結(jié)構(gòu)變量 /獲取要重畫的窗口的設(shè)備描述表句柄 hdc = BeginPaint (hwnd,2.1 傳統(tǒng)的Windows 編程,case WM_DESTROY:/撤消窗口消息處理 PostQuitMessage (0); /產(chǎn)生退出程序消息WM_QUIT return 0; return DefWindowProc (hwnd, message, wParam, lParam); /其它轉(zhuǎn)缺省窗口函數(shù) ,程序的運(yùn)行結(jié)果:,事件驅(qū)

25、動(dòng)、消息傳遞,事件與消息: 事件-在Windows環(huán)境下,應(yīng)用程序啟動(dòng)后,系統(tǒng)等待用戶在圖形用戶界面內(nèi)的輸入選擇,如鼠標(biāo)按鍵、鍵盤按鍵、窗口被創(chuàng)建、關(guān)閉、改變大小、移動(dòng)等,對系統(tǒng)來說,這都是事件。 只要有事件發(fā)生,系統(tǒng)即產(chǎn)生特定的消息。消息描述了事件的類別,包含了相關(guān)信息,Windows應(yīng)用程序利用消息與系統(tǒng)及其它應(yīng)用程序進(jìn)行信息交換。 由于windows事件的發(fā)生的是隨機(jī)的,程序的執(zhí)行先后順序也無法預(yù)測,系統(tǒng)采用消息隊(duì)列來存放事件發(fā)生的消息,然后從消息隊(duì)列中依次取出消息進(jìn)行相應(yīng)的處理。,事件驅(qū)動(dòng)、消息傳遞,消息結(jié)構(gòu)的定義如下: typedef struct tagMSG HWND hWnd;

26、/指定消息發(fā)向的窗口句柄 UINTmessage;/標(biāo)識(shí)消息的消息值 WPARAMwParam;/消息參數(shù) LPARAMlParam;/消息參數(shù) DWORDtime;/消息進(jìn)入隊(duì)列的時(shí)間 POINTpt;/消息進(jìn)入隊(duì)列時(shí)鼠標(biāo)指針 的屏幕坐標(biāo) MSG,*PMSG,NEAR *NPMSG, FAR * LPMSG;,事件驅(qū)動(dòng)、消息傳遞,消息結(jié)構(gòu)中各個(gè)成員的意義: message是標(biāo)識(shí)消息的消息值或消息名。每個(gè)消息都有唯一一個(gè)數(shù)值標(biāo)識(shí),常用不同前綴的符號(hào)常量以示區(qū)別。例如,WM_表示窗口消息 。,Windows常用的窗口消息和消息值定義于winuser.h中 #define WM_CREATE 0X

27、0001 /創(chuàng)建窗口產(chǎn)生的消息 #define WM_DESTROY 0X0002 /撤銷窗口產(chǎn)生的消息 #define WM_PAINT 0X000F /重畫窗口產(chǎn)生的消息 #define WM_CLOSE 0X0010 /關(guān)閉窗口產(chǎn)生的消息 #define WM_CHAR 0X0102 /按下非系統(tǒng)鍵產(chǎn)生的字符消息 #define WM_USER 0X0400 /用戶自定義消息,事件驅(qū)動(dòng)、消息傳遞,wParam,lParam消息參數(shù),均為32位 其數(shù)據(jù)類型在windef.h中定義如下: typedef UINT WPARAM; typedef LONG LPARAM;,pt表示消息進(jìn)入消息

28、隊(duì)列時(shí)鼠標(biāo)指針的屏幕坐標(biāo), 數(shù)據(jù)類型POINT是定義在windef.h中的結(jié)構(gòu)體,表示屏 幕上一點(diǎn),定義如下: typedef struct tagPOINT LONG x;/表示點(diǎn)的屏幕橫坐標(biāo) LONGy;/表示點(diǎn)的屏幕縱坐標(biāo) POINT, *PPOINT,NEAR *NPPOINT,FAR *LPPOINT;,Windows數(shù)據(jù)類型,常用windows數(shù)據(jù)類型:,Windows數(shù)據(jù)類型,窗口類及其使用步驟,窗口結(jié)構(gòu)類型: typedef struct tagWNDCLASS UINT style; /窗口風(fēng)格 WNDPROC lpfnWndProc; /指向窗口處理函數(shù)的函數(shù)指針 int

29、cbClsExtra; /窗口結(jié)構(gòu)中的預(yù)留字節(jié)數(shù) int cbWndExtra; /為其它創(chuàng)建窗口預(yù)留字節(jié)數(shù) HINSTANCE hInstance; /注冊該窗口類的實(shí)例句柄 HICON hIcon; /代表該窗口類的圖標(biāo)句柄 HCURSOR hCursor; / 該窗口客戶區(qū)鼠標(biāo)光標(biāo)句柄 HBRUSH hbrBackGround; /該窗口背景顏色句柄 LPCSTR lpszMenuName; /指向窗口菜單名的字符指針 LPCSTR lpszClassName; /指向窗口名的字符指針 WNDCLASS, *PWNDCLASS,NEAR *NPWNDCLASS, FAR *LPWNDCL

30、ASS;,窗口類及其使用步驟,WinMain()函數(shù)完成第一項(xiàng)工作建立一個(gè)窗口 (1) 定義一個(gè)窗口類,包括定義窗口對象并對它的相關(guān)成員賦值。 (2) 注冊窗口類,調(diào)用RegisterClass()注冊窗口類,并判斷是否注冊成功。其參數(shù)是WNDCLASS結(jié)構(gòu)類型指針,用需要注冊的窗口對象地址進(jìn)行調(diào)用。 (3) 創(chuàng)建窗口,定義注冊窗口后,可以創(chuàng)建一個(gè)或多個(gè)同類型的窗口;由API函數(shù)CreateWindow()創(chuàng)建窗口,并返回所創(chuàng)建窗口的句柄。 (4) 調(diào)用API函數(shù)ShowWindow()和UpdateWindow()顯示并更新窗口,它們的參數(shù)相同,第一個(gè)參數(shù)是要顯示的窗口句柄,第二個(gè)參數(shù)是窗口

31、顯示的方式。,消息循環(huán)與消息傳遞,消息循環(huán)(while循環(huán)) GetMessage()函數(shù)從應(yīng)用程序消息隊(duì)列中讀取消息, TranslateMessage()函數(shù)進(jìn)行鍵盤消息轉(zhuǎn)換,然后由DispatchMessag()將消息派送給相應(yīng)的窗口函數(shù)進(jìn)行處理;當(dāng)消息隊(duì)列為空時(shí),應(yīng)用程序進(jìn)入等待狀態(tài),等待用戶輸入。 GetMessage()函數(shù)聲明如下: BOOL WINAPI GetMessage (LPMSG, HWND, UINT, UINT ); 其中第1個(gè)參數(shù)為存放消息的MSG結(jié)構(gòu)指針,第2個(gè)參數(shù)表示接收消息的窗口句柄,第3、4個(gè)參數(shù)分別表示要獲取的最大和最小消息值。當(dāng)后3個(gè)參數(shù)值設(shè)為NUL

32、L或0時(shí),表示應(yīng)用程序接收它所創(chuàng)建的所有窗口的所有消息。 當(dāng)GetMessage()獲取到WM_QUIT消息時(shí),返回FALSE,結(jié)束消息循環(huán)。,消息循環(huán)與消息傳遞,TranslateMessage()函數(shù)負(fù)責(zé)鍵盤消息轉(zhuǎn)換。 擊鍵消息除字符鍵消息外,其它擊鍵操作產(chǎn)生虛擬鍵消息,包括WM_KEYDOWN,WM_SYSKEYDOWN,WM_KEYUP,WM_SYSKEYUP,這些虛擬鍵消息必須通過轉(zhuǎn)換成字符消息程序才能響應(yīng)。,消息循環(huán)與消息傳遞,消息派送流程,DispatchMessage函數(shù) 根據(jù)消息所包含的信息,將消息派送到相應(yīng)的窗口函數(shù),過程如圖:,hWnd Message wParaw Ip

33、aram Time Pt,MSG,Ex2_2 Ex2_2 ,HWND,Style Wndproc Ex2_2 Ex2_2,WNDCLASS,窗口處理函數(shù) WndProc(),應(yīng)用程序創(chuàng)建的每一個(gè)窗口或?qū)υ捒蚨紝?yīng)一個(gè)窗口處理函數(shù),處理來自窗口的消息。對于應(yīng)用程序,WinMain()函數(shù)都差不多,編程的主要任務(wù)就是編寫窗口函數(shù)。WndProc()的原型如下: LRESULT CALLBACK WndProc(HWND hwnd,UINT message, WPARAM wParam, LPARAM lParam); 其中,第一個(gè)參數(shù)表示對應(yīng)窗口的句柄,第二個(gè)參數(shù)是需要處理的消息的消息值,第三、四

34、個(gè)參數(shù)包含了相應(yīng)消息的某些信息,如消息發(fā)生時(shí)鼠標(biāo)位置等。 WndProc()函數(shù)的結(jié)構(gòu)是一個(gè)switch語句,根據(jù)消息值不同,選擇不同的case子句執(zhí)行,如WM_PAINT消息表示窗口客戶區(qū)需要重畫,WM_DESTROY消息表示窗口要被撤銷等。如果message參數(shù)的值與各個(gè)case子句的常量都不同,則調(diào)用DefWindowProc()函數(shù)處理。,進(jìn)隊(duì)和不進(jìn)隊(duì)消息,窗口函數(shù)一般由系統(tǒng)調(diào)用,應(yīng)用程序不直接調(diào)用它,而是通過PostMessage()和SendMessage()函數(shù)傳遞消息來間接調(diào)用窗口函數(shù)。消息分為進(jìn)隊(duì)消息和不進(jìn)隊(duì)消息。 (1) 進(jìn)隊(duì)消息是由windows放入應(yīng)用程序消息隊(duì)列、由應(yīng)

35、用程序消息循環(huán)從消息隊(duì)列中取出并派送到窗口函數(shù)的消息。進(jìn)隊(duì)消息一般由用戶操作產(chǎn)生,如鼠標(biāo)移動(dòng)、點(diǎn)擊產(chǎn)生的消息,鍵盤按鍵消息,重畫窗口消息等。調(diào)用API函數(shù)PostMessage()可以郵送(post)一條消息到指定窗口的消息隊(duì)列,其原型如下: BOOL WINAPI PostMessage(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) ; 其中Msg參數(shù)指定了要發(fā)送的消息值(名)。PostQuitMessage()調(diào)用本函數(shù)郵送消息。,進(jìn)隊(duì)和不進(jìn)隊(duì)消息,(2) 不進(jìn)隊(duì)消息,直接發(fā)送(send)給指定窗口的窗口函數(shù)進(jìn)行處理。程序中調(diào)用某些特

36、定的API函數(shù)會(huì)產(chǎn)生不進(jìn)隊(duì)消息。如調(diào)用CreateWindow()創(chuàng)建窗口時(shí)發(fā)送的WM_CREATE消息,調(diào)用UpdateWindow()更新窗口時(shí)發(fā)送的WM_PAINT消息及調(diào)用DestroyWindow()時(shí)發(fā)送的WM_DESTROY消息都是不進(jìn)隊(duì)消息。 可以通過調(diào)用SendMessage()函數(shù)直接發(fā)送消息給窗口: LRESULT WINAPI SendMessage(HWND hWnd,UINT Msg, WPARAM wParam,LPARAM lParam); 有的不進(jìn)隊(duì)消息來自進(jìn)隊(duì)消息,如退出應(yīng)用程序時(shí)會(huì)產(chǎn)生一條進(jìn)隊(duì)消息WM_CLOSE,消息循環(huán)將其派送到窗口函數(shù),處理這一消息一

37、般是調(diào)用DestroyWindow()函數(shù)撤銷并關(guān)閉窗口,并發(fā)送不進(jìn)隊(duì)消息WM_DESTROY到窗口函數(shù)。有的用戶操作可能既產(chǎn)生進(jìn)隊(duì)消息,又產(chǎn)生不進(jìn)隊(duì)消息。消息是否進(jìn)入隊(duì)列由Windows自行操作,程序設(shè)計(jì)人員只要關(guān)心窗口函數(shù)的編寫。,設(shè)備描述表,繪圖信息數(shù)據(jù)結(jié)構(gòu)定義: typedef struct tagPAINTSTRUCT HDC hdc;/ 設(shè)備描述表句柄 BOOL fErase; / 布爾值,若背景要重畫,則為非0,否則為0 RECT rcPaint;/ 指定窗口客戶區(qū)無效區(qū)域 BOOL fRestore;/ 保留 BOOL fIncUpdate;/ 保留 BYTE rgbReser

38、ved32;/ 保留 PAINTSTRUCT,* PPAINTSTRUCT,* NPPAINTSTRUCT, *lPPAINTSTRUCT;,設(shè)備描述表,WM_PAINT是重畫窗口客戶區(qū)消息,當(dāng)窗口內(nèi)容被改變、移動(dòng)或窗口被覆蓋后,需要對窗口進(jìn)行重畫,一般應(yīng)用程序都需要處理這個(gè)消息,處理這一消息需要獲取設(shè)備描述表句柄。 Windows的圖形設(shè)備接口GDI是一組API函數(shù),它提供與設(shè)備無關(guān)的圖形功能,使應(yīng)用程序在不同圖形設(shè)備(如打印機(jī),顯示器、繪圖儀等)上進(jìn)行相同的操作(調(diào)用GDI函數(shù)),而無需考慮設(shè)備的硬件差異,設(shè)備無關(guān)性是通過設(shè)備描述表實(shí)現(xiàn)的。,設(shè)備描述表,設(shè)備描述表 (Device Cont

39、ext,DC)也稱為設(shè)備上下文,是GDI內(nèi)部定義的一個(gè)有圖形對象、圖形方式及其屬性的一個(gè)數(shù)據(jù)結(jié)構(gòu),與特定設(shè)備相關(guān),描述了硬件設(shè)備的具體特征信息。如需要執(zhí)行顯示任務(wù),就構(gòu)造一個(gè)顯示設(shè)備的DC,獲得其句柄;例如,需要執(zhí)行打印任務(wù),則構(gòu)造一個(gè)打印設(shè)備的DC,獲得其句柄,GDI函數(shù)以該句柄為參數(shù)完成相應(yīng)任務(wù)。與具體設(shè)備相關(guān)的操作交給DC,將應(yīng)用程序的設(shè)備無關(guān)圖形功能調(diào)用轉(zhuǎn)換為在設(shè)備驅(qū)動(dòng)程序下執(zhí)行的設(shè)備相關(guān)操作。 應(yīng)用程序不能直接訪問設(shè)備描述表,為了進(jìn)行圖形輸出,必須先獲取設(shè)備描述表句柄,然后以設(shè)備描述表句柄為參數(shù)調(diào)用GDI函數(shù),實(shí)現(xiàn)圖形功能。,2.2 Windows對象句柄,句柄的概念: 早期的句柄H

40、andle是一個(gè)16位的代號(hào)。在DOS操作系統(tǒng)中,必須用帶路徑的文件名,句柄是文件的代號(hào),文件讀/寫時(shí)只用這個(gè)代號(hào)就行了,而不必用很長的路徑名。 文件句柄只是一個(gè)代號(hào),它不是文件的地址。地址信息放在文件句柄指向的內(nèi)存中特定的文件管理區(qū)域的一個(gè)單元中,那里存放了入口地址和有關(guān)文件的其它信息。 句柄的數(shù)據(jù)類型在winnt.h中說明如下: typedef void * HANDLE; 所以從物理上看句柄是一個(gè)泛型(無類型)指針。但它不是指向一個(gè)Windows對象的存儲(chǔ)首地址,而是指向包含了使用該對象有關(guān)信息的一塊內(nèi)存單元。所以從邏輯上說它是一個(gè)代號(hào),一個(gè)對象的代號(hào)。,2.2 Windows對象句柄,

41、句柄的使用: 句柄所指向的內(nèi)容是不能由句柄操作來改變的,只能由系統(tǒng)來改變。句柄允許做的唯一操作是檢查它是否是一個(gè)有效句柄。不等于零是一個(gè)有效句柄,等于零是無效句柄。 Windows操作系統(tǒng)中所謂“句柄”(handle)是唯一標(biāo)識(shí)某個(gè)Windows對象(如程序?qū)嵗?、窗口、圖標(biāo)、光標(biāo)、畫刷、菜單等)的一個(gè)32位無符號(hào)整數(shù),句柄是Windows對象的代號(hào)。 Windows程序通常通過調(diào)用win32 API函數(shù)來獲得某個(gè)Windows對象的句柄,只有有了句柄,程序才能使用與其對應(yīng)的Windows對象。形象地講,對象是學(xué)生,句柄是學(xué)號(hào)。 建立一個(gè)Windows對象,自然就建立起一個(gè)實(shí)例句柄。要使一個(gè)句柄

42、無效只須撤消對該對象的引用,不要銷毀句柄。,2.2 Windows對象句柄,表2.1 常用Windows句柄類型,2.3 MFC基礎(chǔ)類及其層次結(jié)構(gòu),AFX小組的MFC開發(fā)設(shè)計(jì)的原則:,1. 使用C+進(jìn)行Windows應(yīng)用程序設(shè)計(jì)的過程應(yīng)簡單和直觀。 2. 用類封裝Windows API和Windows對象,并按照API的方式進(jìn)行工作。 3. 使用標(biāo)準(zhǔn)的Windows命令的約定和編碼風(fēng)格。 4. 類庫應(yīng)有足夠的可擴(kuò)展性,以便跟隨Windows的更新發(fā)展。 5. 能更方便地使用API函數(shù),采用Windows API的概念,函數(shù)和編程風(fēng)格。 從這里可以看出MFC和Windows很好地連接起來,使Wi

43、ndows下的C語言程序設(shè)計(jì),成為面向?qū)ο蟮腗FC。這里沒有追求純粹,而是包容和實(shí)用!,MFC是采用單一繼承,從根類Cobject層層派生出絕大多數(shù)MFC中的類,其層次結(jié)構(gòu)是最典型。參見圖2.8,圖2.6 根類CObject分類派生圖,2.3 MFC基礎(chǔ)類及其層次結(jié)構(gòu),Cobject根類,CCmdTarget 命令相關(guān)類,CDC設(shè)備環(huán)境類,CClientDC、CWindowDC、CPaintDC、,CGdiObject 繪畫工具類,CPen、CBrush、CFont、CBitmap、CPalette、,CMenu菜單,CArray、CList、CMap、 群(集合)類,CDatabase、CR

44、ecordset、 ODBC數(shù)據(jù)庫支持,CDatabase、CDataRecordset、 DAO數(shù)據(jù)庫支持,CFile 文件類,CMemFile、COleStreamFile、CSocketFile、,CException 異常類,CSyncObject 同步對象類,CInternetSession 因特網(wǎng)會(huì)話類,CInternetConnection 因特網(wǎng)連接類,CFtpConnection、CGopherConnection、CHelpConnection,圖2.7 Cobject派生類層次示意圖,CObject根類,CCmdTarget 命令處理類,CWinThread 線程類,CD

45、ocument 文檔類,CDocTemplate 文檔模板類,CWnd 窗口類,CWinApp Windows應(yīng)用程序類,CSingleDocTemplate 單文檔模板類,CMultiDocTemplate 多文檔模板類,圖2.8 應(yīng)用程序結(jié)構(gòu),Cobject根類派生的最重要的類組成一個(gè)應(yīng)用程序結(jié)構(gòu)(Application Architecture)的集合,它是由CCmdTarget為基類派生出來的,其中主要部分參見圖2.10。,CFrameWnd 框架窗口類,CControlBar 控制條類,CSplitterWnd 窗口分割類,CPropertSheet 屬性表類,CMDIFrameWn

46、d、CMDIChildWnd、CMiniFrameWnd,CDialogBar、CToolBar、CStatusBar,CWnd 窗口類,CDialog 對話框類,CCommonDialog 公用對話框類,CProperty 屬性頁表,CFileDialog、CColorDialog、,圖2.8 應(yīng)用程序結(jié)構(gòu),CView 視圖類,控制類 CButton、CEdit、CListBox、CScrollBar、CStatic、CComboBox,CCtrlView,CFormView,CEditView、CListView、CTreeView、CRichEditView,CRecordView,圖2

47、.8 應(yīng)用程序結(jié)構(gòu),基類Cobject的最基本功能: 1. 支持序列化(serialization)。序列化指如何讓一個(gè)對象保持持久不變,即把對象成員數(shù)據(jù)內(nèi)容存入一個(gè)文件或從一個(gè)文件中讀取內(nèi)容重構(gòu)對象的過程。 2. 運(yùn)行時(shí)(Run-time)類的信息獲取。 3. 提供特定的new,delete和=操作符,完成對象的建立與刪除。,2.4 MFC 編程,標(biāo)準(zhǔn)Windows程序設(shè)計(jì): VC+的微軟基礎(chǔ)類庫(Microsoft Foundation Class Library,MFC)封裝了大部分API函數(shù),并提供了一個(gè)應(yīng)用程序框架,簡化了和標(biāo)準(zhǔn)了Windows程序設(shè)計(jì),所以用MFC編寫Windows

48、應(yīng)用程序也稱為標(biāo)準(zhǔn)Windows程序設(shè)計(jì)。 標(biāo)準(zhǔn)Windows程序設(shè)計(jì)把傳統(tǒng)的Windows程序設(shè)計(jì)轉(zhuǎn)向C+面向?qū)ο蟮腤indows程序設(shè)計(jì),2.4 MFC 編程,MFC簡介: MFC約有200個(gè)類,提供了Windows應(yīng)用程序框架和創(chuàng)建應(yīng)用程序的組件。其中只有5個(gè)核心類對應(yīng)用程序框架有影響: Cwinapp,Cdocument,Cview,CFrameWnd和CDocTemplate。 五個(gè)之中只有Cwinapp是必不可少的類,Cwinapp的對象在應(yīng)用程序中必須有一個(gè),也只有一個(gè),并是一個(gè)全局對象,它建立了應(yīng)用程序執(zhí)行的主線程(線程的概念參見本節(jié)后的附錄)。全局對象是在MFC初始化之前,也

49、即當(dāng)Windows操作系統(tǒng)調(diào)用WinMain( )時(shí),這個(gè)對象就先已建立,即主線程已建立。形象地說,執(zhí)行程序的通路已經(jīng)開通。,2.4 MFC 編程,入口函數(shù): 在MFC編程中,入口函數(shù)WinMain( )被封裝在MFC的應(yīng)用程序框架內(nèi),已經(jīng)不用也不可以再定義另一個(gè)WinMain()函數(shù)。 應(yīng)用程序向?qū)В?MFC編程使用MFC的應(yīng)用程序向?qū)Чぞ撸?AppWizard AppWizard為程序員提供了一種快捷方便的工具來定制基于MFC的應(yīng)用程序框架,程序員只需以此為基礎(chǔ),添加與修改程序代碼來實(shí)現(xiàn)所需功能。MFC編程包含三種類型的應(yīng)用程序:單文檔界面(SDI)應(yīng)用程序、多文檔界面(MDI)應(yīng)用程序和

50、基于對話框(Dialog Based)的應(yīng)用程序,它們都可以由AppWizard引導(dǎo)建立起來。,2.4 MFC 編程,接口與封裝: 在類中必須有一部分成員函數(shù)置為公有,專供類外程序語句訪問,這些函數(shù)亦稱接口函數(shù)。 其余成員函數(shù)是故意對外隱蔽起來的操作,它們是最復(fù)雜最關(guān)鍵的部分,越是復(fù)雜越是關(guān)鍵就越能體現(xiàn)出使用類封裝的必要和優(yōu)越。 類中故意的隱藏也為以后的升級(jí)擴(kuò)展留下了余地,只要接口不變,內(nèi)部再變,也不必修改原來的程序,就象MFC(微軟基礎(chǔ)類)升級(jí)后,由MFC底層類所編的程序完全不必修改,自動(dòng)升級(jí)。,2.4 MFC 編程,封裝有助于編程人員在處理好簡單接口后,集中精力處理高層次開發(fā)的工作,MFC

51、能被廣泛使用也正是有此優(yōu)點(diǎn)。用戶界面等的編程是底層的十分復(fù)雜和困難的事,MFC給解決了。程序員只管自己特定的任務(wù),編程的效率和可靠性大大提高。,使用接口的優(yōu)點(diǎn):,2.4 MFC 編程進(jìn)程和線程,進(jìn)程(process) : 運(yùn)行中的程序稱為進(jìn)程,程序是一個(gè)靜態(tài)的概念,進(jìn)程是一個(gè)動(dòng)態(tài)的概念。 進(jìn)程的組成: (1)一段可執(zhí)行程序(代碼) (2)程序所需的相關(guān)數(shù)據(jù)(變量、工作空間、緩沖區(qū)等) (3)程序執(zhí)行的上下文環(huán)境 其中執(zhí)行上下文環(huán)境(Execution Context)亦稱進(jìn)程狀態(tài)(Process State),是最為重要的。它包括操作系統(tǒng)管理進(jìn)程以及處理器執(zhí)行進(jìn)程所需要的所有信息,包括處理器的

52、各寄存器的內(nèi)容,還包括操作系統(tǒng)使用的信息,如進(jìn)程優(yōu)先級(jí)以及進(jìn)程是否在等待特定的輸入輸出事件完成。,2.4 MFC 編程進(jìn)程和線程,進(jìn)程的屬性與線程(thread) : (1)資源所有權(quán):一個(gè)進(jìn)程包括一個(gè)保存進(jìn)程映像的虛擬地址空間,并隨時(shí)分配對資源的控制或所有權(quán),包括內(nèi)存、I/O通道、I/O設(shè)備和文件。 (2)調(diào)度/執(zhí)行:進(jìn)程沿著通過一個(gè)或多個(gè)程序間的執(zhí)行路徑運(yùn)行,它與其他進(jìn)程的執(zhí)行路徑相互交錯(cuò)。 把兩者分開,執(zhí)行部分(它實(shí)際是被操作系統(tǒng)調(diào)度并分配的實(shí)體)稱為線程(thread)。而資源所有權(quán)的部分仍稱作進(jìn)程。一個(gè)進(jìn)程可以擁有多個(gè)線程。,2.4 MFC 編程進(jìn)程和線程,線程的優(yōu)點(diǎn): 與無線程的進(jìn)

53、程相比速度大為提高,原因是: (1)在已有進(jìn)程中創(chuàng)建一個(gè)新線程速度比創(chuàng)建一個(gè)全新的進(jìn)程快得多(可達(dá)10倍)。 (2)終止一個(gè)線程比終止一個(gè)進(jìn)程花費(fèi)時(shí)間少。 (3)線程間切換比進(jìn)程間切換花費(fèi)時(shí)間少。 (4)同一進(jìn)程的線程共享存儲(chǔ)空間和文件,無需調(diào)用操作系統(tǒng)內(nèi)核就可進(jìn)行通信,效率大大提高。 所以現(xiàn)代的操作系統(tǒng)多為多進(jìn)程多線程的操作系統(tǒng)。,2.4 MFC 編程進(jìn)程和線程,進(jìn)程-線程-窗口: 32位Windows管理運(yùn)行的程序的模式。當(dāng)創(chuàng)建一個(gè)進(jìn)程的同時(shí)也創(chuàng)建了第一個(gè)線程,稱為“主線程”。主線程的入口函數(shù)是WinMain (相當(dāng)于控制臺(tái)應(yīng)用程序的main函數(shù))。之后,主線程可以在進(jìn)程中再創(chuàng)建一個(gè)或多個(gè)

54、線程,即“多線程”,多個(gè)線程共享進(jìn)程的靜態(tài)部分(資源,地址等)。,圖2.9 進(jìn)程、線程與窗口,2.5 MFC對象和Windows對象,MFC對象:特指封裝了Window對象的C+對象。 本節(jié)討論MFC對象與Window對象的聯(lián)系,以最典型的的窗口類(CWnd)為例,討論CWnd類對象與Windows窗口對象的關(guān)系。,圖2.10 MFC窗口對象與Windows窗口對象的關(guān)系,MFC的窗口對象wnd是C+類的實(shí)例,即CWnd類或其派生類的實(shí)例。 hwnd是HWND句柄類型的實(shí)例,為它建立了一個(gè)Windows操作系統(tǒng)的對象。然后把這個(gè)句柄放入CWnd類對象wnd的成員數(shù)據(jù)m_hwnd中。這樣wnd就

55、包含了一個(gè)Windows操作系統(tǒng)的窗口對象。,參考程序段如下: CWnd wnd; /定義窗口類(CWnd)的對象wnd HWND hwnd; /定義窗口句柄hwnd hwnd=CreateWindows(.); /調(diào)用API函數(shù)CreateWindows(.)建立一個(gè)Windows窗口類實(shí)例 wnd.Attach(hwd); /把Windows窗口實(shí)例的句柄鏈到CWnd對象hwnd上 . Destrory Window(hwnd); /調(diào)用API函數(shù)撤消Windows窗口,2.5 MFC對象和Windows對象,MFC對象和對應(yīng)Windows對象: MFC封裝了幾乎所有Windows的API

56、函數(shù),所以上面的API函數(shù),可以用CWnd的成員函數(shù)代替。成員函數(shù)Create()可以代替API函數(shù)CreateWindows()并加上另一個(gè)成員函數(shù)Attach()的全部功能,建立一個(gè)Windows操作系統(tǒng)的窗口對象,并把句柄自動(dòng)保存在MFC窗口對象wnd的m_hwnd成員數(shù)據(jù)中。通常MFC程序員直接使用CWnd的成員函數(shù)就可以了。 其它的MFC對象和對應(yīng)Windows對象也有類似的關(guān)系。見表2.1,2.5 MFC對象和Windows對象,表2.2 常用MFC類與Windows對象句柄對應(yīng)關(guān)系,2.5 MFC對象和Windows對象,Windows窗口句柄通常是全局量,動(dòng)態(tài)建立的Window

57、s窗口對象也是全局性的。所以一個(gè)進(jìn)程或線程可以取得另一個(gè)進(jìn)程或線程的窗口句柄,并給它發(fā)送消息。 注意: 一個(gè)線程只能使用本線程創(chuàng)建的MFC窗口對象,不能使用其它線程創(chuàng)建的MFC窗口對象。,2.5 MFC對象和Windows對象,小結(jié): Windows對象是Windows操作系統(tǒng)的一個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu)的實(shí)例,由一個(gè)Windows系統(tǒng)全局的窗口句柄來唯一標(biāo)志,由API函數(shù)CreatWindow()創(chuàng)建,而由DestroyWindow()撤消。 在MFC編程中,Windows對象通常在MFC對象建立以后,調(diào)用Create() 建立Windows對象,并鏈接在MFC對象上。,建立應(yīng)用程序的主框架窗口的程序

58、段: CFrameWnd *pFrame=new CFrameWnd; /動(dòng)態(tài)建立框架窗口對象 pFrame-Create(NULL,”Ex2_xx”, ws_OVERLAPPENDWINDOW,rect,NULL, MAKEINTRESOURCE(IDR_MENUI),0,NULL); /建立與動(dòng)態(tài)框架窗口對象相連的Windows框架窗口,2.6 MFC的消息映射,消息映射的概念: MFC由CWinApp類檢索和派送消息給相應(yīng)的窗口函數(shù),但是所有的MFC窗口函數(shù)都使用同一個(gè)窗口函數(shù)。 MFC把設(shè)計(jì)窗口的任務(wù)細(xì)化為設(shè)計(jì)若干消息處理函數(shù),程序員要做的是為每一個(gè)要處理的消息提供一個(gè)消息處理(Handling Messages)函數(shù),然后系統(tǒng)通過MFC提供的一套消息映射系統(tǒng)(messages mapping system)來調(diào)用相應(yīng)的消

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論