版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
網(wǎng)絡(luò)編程實用教程第4章MFC編程編輯ppt補充知識Windows操作系統(tǒng)的API接口SDK(軟件開發(fā)包)微軟提供的操作系統(tǒng)開發(fā)接口也叫API由一些函數(shù)組成編輯ppt補充知識SDK與MFC的區(qū)別:利用API接口函數(shù)編程也叫WIN32接口編程利用VC++編程叫做MFC編程Win32應(yīng)用程序接口直接調(diào)用API函數(shù),非面向?qū)ο?;—類似于C語言程序設(shè)計MFC是對API的封裝,形成MFC的C++類,是面向?qū)ο蟮木幊棠J?;—類似于C++程序設(shè)計編輯ppt4.1MFC概述編輯ppt4.1.1MFC是一個編程框架MFC應(yīng)用程序框架,簡稱MFC框架,是由MFC(MicrosoftFoundationClassLibrary)中的各種類結(jié)合起來構(gòu)成的。從總體上定義了應(yīng)用程序的輪廓提供了用戶接口的標(biāo)準實現(xiàn)方法程序員只須通過預(yù)定義的接口把具體應(yīng)用程序特有的東西填入這個輪廓,就能建立Windows下的應(yīng)用程序編輯ppt4.1.1MFC是一個編程框架VC++提供了相應(yīng)的工具來完成這個工作:用應(yīng)用程序向?qū)Э梢陨蓱?yīng)用程序的骨架;用資源編輯器可以直觀地設(shè)計用戶接口;用類向?qū)Э梢詫⒋a添加到骨架文件;編輯ppt4.1.1MFC是一個編程框架1.MFC類庫封裝的內(nèi)容
對Win32應(yīng)用程序編程接口的封裝
MFC將每一個Windows對象封裝成一個相應(yīng)的C++對象。對應(yīng)用程序概念的封裝使用SDK編寫Windows應(yīng)用程序時,總要定義窗口過程,注冊WindowsClass,創(chuàng)建窗口等等,要做許多處理工作。MFC封裝了這些處理,替程序員完成這些工作。編輯ppt4.1.1MFC是一個編程框架對COM/OLE特性的封裝
OLE(對象的鏈接與嵌入)建立在COM(組件對象模型)之上,由于支持OLE的應(yīng)用程序必須實現(xiàn)一系列的接口,因而相當(dāng)繁瑣。MFC的OLE類封裝了OLEAPI大量的復(fù)雜工作,提供了實現(xiàn)OLE的更高級接口。對ODBC功能的封裝
MFC封裝了ODBCAPI的大量的復(fù)雜的工作,形成了與ODBC之間接口的高級C++類,提供了一種方便的訪問數(shù)據(jù)庫的編程模式。
編輯ppt4.1.1MFC是一個編程框架2.MFC類的繼承關(guān)系
MFC將眾多類的共同特性抽象出來,設(shè)計出一些基類,作為實現(xiàn)其他類的基礎(chǔ)。有兩個類十分重要:CObject:是MFC的根類,絕大多數(shù)MFC類是從它派生的。實現(xiàn)了一些重要的特性:動態(tài)類信息(運行時類信息)--運行時檢索類或?qū)ο蟮男畔討B(tài)創(chuàng)建對象序列化—Serialize(CArchive&ar)對程序調(diào)試—Dump、AssertValid從CObject派生的類都可以具備CObject所擁有的特性。編輯ppt4.1.1MFC是一個編程框架序列化的概念----實現(xiàn)對象的持久性為實現(xiàn)對象的持久性,通常多以字節(jié)流的形式將記錄對象狀態(tài)的數(shù)據(jù)存放到磁盤上,這種將狀態(tài)數(shù)據(jù)保存到磁盤和從磁盤恢復(fù)到內(nèi)存的過程稱為序列化。編輯ppt4.1.1MFC是一個編程框架CCmdTarget類:從CObject派生。通過進一步封裝一些屬性和方法,提供了消息處理的架構(gòu)。在MFC中,任何可以處理消息的類都是從此類派生的。CWndCButtonCComboBoxCEditCDialog
編輯ppt4.1.1MFC是一個編程框架針對每種不同的對象,MFC都設(shè)計了一組類對這些對象進行封裝,每一組類都有一個基類,從基類派生出眾多更具體的類。這些對象包括以下種類:窗口對象:基類是CWnd;應(yīng)用程序?qū)ο螅夯愂荂winThread;文檔對象:基類是Cdocument??梢越Y(jié)合自己的實際,從適當(dāng)?shù)腗FC類中派生出自己的類,實現(xiàn)特定的功能,達到自己的編程目的。
編輯ppt4.1.1MFC是一個編程框架3.虛擬函數(shù)和動態(tài)約束(多態(tài)性)
MFC建立了消息映射機制,以一種富有效率、便于使用的手段解決消息處理函數(shù)的動態(tài)約束問題。程序員在繼承基類的同時,可把自己實現(xiàn)的虛擬函數(shù)和消息處理函數(shù)嵌入MFC的編程框架。MFC框架將在適當(dāng)?shù)臅r候、適當(dāng)?shù)牡胤絹碚{(diào)用程序的代碼。多態(tài)性—根據(jù)不同的情況執(zhí)行不同的操作。編輯ppt4.1.1MFC是一個編程框架4.MFC的開發(fā)模板
MFC實現(xiàn)了對應(yīng)用程序概念的封裝,實現(xiàn)了類、類的繼承、動態(tài)約束、類的關(guān)系和相互作用的封裝。這樣封裝的結(jié)果是為程序員提供了一套開發(fā)模板,羅列在應(yīng)用程序向?qū)е?。針對不同的?yīng)用和目的,程序員可以采用不同的模板。這些模板都采用以文檔-視圖為中心的思想,每個模板都包含一組特定的類。
編輯ppt4.1.2典型的MDI應(yīng)用程序的構(gòu)成用AppWizard產(chǎn)生一個沒有OLE等支持的MDI工程T,AppWizard會自動創(chuàng)建一系列文件,構(gòu)成一個應(yīng)用程序骨架。這些文件分為四類:頭文件(.h)實現(xiàn)文件(.cpp)資源文件(.rc)模塊定義文件(.def)編輯ppt這里顯示的是文檔編輯ppt1、構(gòu)成應(yīng)用程序的對象圖4.1一個MDI應(yīng)用程序的構(gòu)成
編輯ppt1、構(gòu)成應(yīng)用程序的對象(1)應(yīng)用程序類CTApp(2)主邊框窗口類CMainFrame(3)文檔邊框窗口類CChildFrame(4)文檔CTDoc(5)視圖CTView(6)文檔模板編輯ppt2.構(gòu)成應(yīng)用程序的對象之間的關(guān)系圖4.2各對象之間的派生關(guān)系
編輯ppt3.構(gòu)成應(yīng)用程序的文件頭文件用途stdafx.h標(biāo)準AFX頭文件resource.h定義了各種資源IDt.h#include"resource.h"定義了從CWinApp派生的應(yīng)用程序?qū)ο驝TAppchildfrm.h定義了從CMDIChildWnd派生的文檔框架窗口對象CTChildFramemainfrm.h定義了從CMDIFrameWnd派生的框架窗口對象CMainFrametdoc.h定義了從CDocument派生的文檔對象CTDoctview.h定義了從CView派生的視圖對象CTView4.1AppWizard所生成的頭文件編輯ppt3.構(gòu)成應(yīng)用程序的文件實現(xiàn)文件所包含的頭文件實現(xiàn)的內(nèi)容和功能stdafx.cppstdafx.h全局函數(shù)、結(jié)構(gòu)和宏的標(biāo)識符t.cppstdafx.h
MainFrm.hchildfrm.htdoc.htview.ht.h定義CTApp的實現(xiàn),并定義CTApp類型的全局變量theAppchildfrm.cppstdafx.h
t.hchildfrm.h實現(xiàn)了類CChildFramechildfrm.cppstdafx.ht.h
childfrm.h實現(xiàn)了類CMainFrametdoc.cppstdafx.ht.h
tdoc.h實現(xiàn)了類CTDoctview.cppstdafx.h
t.htdoc.htview.h實現(xiàn)了類CTview表4.2實現(xiàn)文件與頭文件的包含關(guān)系編輯ppt4.2MFC和Win32編輯ppt4.2.1MFC對象和Windows對象的關(guān)系MFC中最重要的封裝是對Win32API的封裝,因此,理解Windows對象和MFC對象之間的關(guān)系是理解MFC的一個關(guān)鍵:Windows對象是Win32下用句柄表示的Windows操作系統(tǒng)對象;MFC對象是C++對象,是一個C++類的實例。兩者有很大的區(qū)別,但聯(lián)系緊密
編輯ppt4.2.1MFC對象和Windows對象的關(guān)系以窗口對象為例:MFC窗口對象是CWnd類的實例,程序直接利用構(gòu)造函數(shù)創(chuàng)建;Windows窗口則是操作系統(tǒng)的一個內(nèi)部數(shù)據(jù)結(jié)構(gòu)的實例,有一個“窗口句柄”標(biāo)識,操作系統(tǒng)創(chuàng)建它并給它分配系統(tǒng)資源;MFC窗口對象的“窗口句柄”保存在對象的m_hWnd成員變量中;Windows窗口可以被一個程序銷毀,也可以被用戶的動作銷毀;MFC窗口由析構(gòu)函數(shù)銷毀。編輯ppt4.2.1MFC對象和Windows對象的關(guān)系以窗口對象為例:
圖4.3
MFC的CWnd類窗口對象和Windows的窗口對象的關(guān)系
編輯ppt4.2.1MFC對象和Windows對象的關(guān)系其他的Windows對象和對應(yīng)的MFC對象也有類似的關(guān)系。
編輯ppt多方面對MFC對象和Windows對象比較1、對應(yīng)的數(shù)據(jù)結(jié)構(gòu)不同MFC對象是相應(yīng)C++類的實例,這些類是MFC或者程序員定義的;Windows對象是Windows系統(tǒng)的內(nèi)部結(jié)構(gòu),通過一個句柄來引用;MFC的類定義了一個成員變量m_hWnd來保存MFC對象對應(yīng)的Windows對象的句柄。編輯ppt補充什么叫句柄(Handle)?--游戲手柄32位的整數(shù),是WINDOWS在內(nèi)存中維護的一個對象內(nèi)存物理地址列表的整數(shù)索引。WINDOWS的內(nèi)存管理經(jīng)常會將當(dāng)前空閑對象的內(nèi)存釋放掉,當(dāng)需要時訪問再重新提交到物理內(nèi)存。所以對象的物理地址是變化的,不允許程序直接通過物理地址來訪問對象。程序?qū)⑾朐L問的對象的句柄傳遞給系統(tǒng),系統(tǒng)根據(jù)句柄檢索自己維護的對象列表就能知道程序想訪問的對象及其物理地址了。編輯ppt2、所處的層次不同MFC對象是高層的,Windows對象是低層的;MFC對象封裝了Windows對象的大部分或全部功能,同時封裝了Windows對象的句柄;3、創(chuàng)建的機制MFC對象通過構(gòu)造函數(shù)由程序直接創(chuàng)建;Windows對象由相應(yīng)的SDK函數(shù)創(chuàng)建。多方面對MFC對象和Windows對象比較編輯ppt多方面對MFC對象和Windows對象比較4、轉(zhuǎn)換的方式不同
可以從一個MFC對象得到對應(yīng)的Windows對象的句柄;使用MFC對象的GetSafeHandle成員函數(shù)得到對應(yīng)的句柄??梢詮囊粋€已存在的Windows對象創(chuàng)建一個對應(yīng)的MFC對象;一般使用MFC對象的成員函數(shù)Attach或者FromHandle來創(chuàng)建,前者得到一個永久性對象,后者得到的可能是一個臨時對象。(m_hWnd)編輯ppt多方面對MFC對象和Windows對象比較5、使用范圍不同MFC對象服務(wù)于創(chuàng)建它的進程;Windows對象創(chuàng)建后,其句柄是整個Windows系統(tǒng)全局的。一些句柄可以被其他進程使用。對同一個進程的線程來說,只可以使用本線程創(chuàng)建的MFC對象,不能使用其他線程的MFC對象。編輯ppt多方面對MFC對象和Windows對象比較6、銷毀方法不同MFC對象隨著析構(gòu)函數(shù)的調(diào)用而消失;但Windows對象必須由相應(yīng)的Windows系統(tǒng)函數(shù)銷毀。特例:設(shè)備描述表CDC類的對象有所不同,它對應(yīng)的HDC句柄對象可能不是被銷毀,而是被釋放。編輯pptWindows對象對應(yīng)的MFC對象描述Windows句柄MFC對象窗口HWNDCWnd及其派生類設(shè)備上下文HDCCDC及其派生類菜單HMENUCMenu筆HPENCGdiObject,CPen及其派生類刷子HBRUSHCGdiObject,CBrush及其派生類字體HFONTCGdiObject,CFont及其派生類位圖HBITMAPCGdiObject,CBitmap及其派生類調(diào)色板HPALETTECGdiObject,CPalette及其派生類區(qū)域HRGNCGdiObject,CRgn及其派生類圖像列表HimageLISTCImageList及其派生類套接字SOCHETCSocket,CAsynSocket及其派生類編輯ppt4.2.2幾個主要的類1、Win32API的窗口對象用Win32API編寫的應(yīng)用程序的基本結(jié)構(gòu):編寫WinMain函數(shù)(程序的入口)編寫消息和事件的處理過程WndProc()在WinMain中注冊窗口創(chuàng)建窗口,然后開始應(yīng)用程序的消息循環(huán)編輯ppt注冊窗口
API通過調(diào)用RegisterClass注冊窗口類型;“窗口”是Windows系統(tǒng)的數(shù)據(jù)結(jié)構(gòu)。其定義如下:編輯ppttypedefstruct_WNDCLASSEX{UINTcbSize;//該結(jié)構(gòu)的字節(jié)數(shù)UINTstyle;//窗口類的風(fēng)格
WNDPROClpfnWndProc;//窗口過程intcbClsExtra;//額外數(shù)據(jù)intcbWndExtra;//額外數(shù)據(jù)HANDLEhInstance;//窗口類的窗口過程所屬的應(yīng)用實例HICONhIcon;//該窗口類所用的像標(biāo)HCURSORhCursor;//該窗口類所用的光標(biāo)HBRUSHhbrBackground;//該窗口類所用的背景刷LPCTSTRlpszMenuName;//該窗口類所用的菜單資源LPCTSTRlpszClassName;//該窗口類的名稱HICONhIconSm;//該窗口類所用的小像標(biāo)}WNDCLASSEX;
編輯ppt補充--Win32程序的基本結(jié)構(gòu)WinMain函數(shù)的原型聲明:intWINAPIWinMain(
HINSTANCEhInstance,
//當(dāng)前實例句柄
HINSTANCEhPrevInstance,//前一個實例句柄
LPSTRlpCmdLine,
//命令行
int
nCmdShow//顯示狀態(tài));
編輯ppt補充--Win32程序的基本結(jié)構(gòu)調(diào)用RegisterClass注冊RegisterClass是全局函數(shù),函數(shù)原型:RegisterClass(
WNDCLASS*lpWndClass);編輯ppt補充--Win32程序的基本結(jié)構(gòu)intWINAPIWinMain(HINSTANCEhInstance,
HINSTANCEhPrevInstance,LPSTRlpCmdLine,
intnCmdShow){
//設(shè)計窗口結(jié)構(gòu)
WNDCLASSwndcls;
wndcls.style
=CS_DBLCLKS|CS_VREDRAW|CS_HREDRAW;
wndcls.lpszMenuName
=NULL;
wndcls.lpszClassName="CustomWnd";
wndcls.lpfnWndProc
=WndProc;
wndcls.hInstance
=GetModuleHandle(NULL);
wndcls.hIcon
=NULL;
wndcls.hCursor
=NULL;
wndcls.hbrBackground=(HBRUSH)GetStockObject(GRAY_BRUSH);
wndcls.cbClsExtra
=0;
wndcls.cbWndExtra
=0;編輯ppt補充--Win32程序的基本結(jié)構(gòu)
//注冊窗口結(jié)構(gòu)
RegisterClass(&wndcls);
//創(chuàng)建窗口
HWNDhwnd;
hwnd=CreateWindow("CustomWnd","Win32App",WS_CAPTION|WS_OVERLAPPEDWINDOW|
WS_SYSMENU,50,50,500,500,NULL,NULL,wndcls.hInstance,NULL);
//顯示窗口
ShowWindow(hwnd,SW_SHOW);
UpdateWindow(hwnd);編輯ppt補充--Win32程序的基本結(jié)構(gòu)
//進入消息循環(huán)
MSGmsg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
returnmsg.wParam;}編輯ppt補充--Win32程序的基本結(jié)構(gòu)//窗口消息處理函數(shù)LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam){switch(message){caseWM_CREATE:break;caseWM_DESTROY:PostQuitMessage(0);default:returnDefWindowProc(hwnd,message,wParam,lParam);}return(0);}編輯ppt4.2.2幾個主要的類2、MFC的窗口類CWndCWnd類封裝了窗口的所有屬性和窗口處理的事件。同時還可以通過消息映射機制實現(xiàn)窗口的某些操作。主要函數(shù)有:窗口創(chuàng)建函數(shù)Create
封裝了CreateWindowEX,創(chuàng)建時發(fā)送WM_Create消息窗口銷毀函數(shù)DestroyWindowPostNcDestroy編輯ppt4.2.2幾個主要的類設(shè)定、獲取和改變窗口屬性的函數(shù)SetWindowText:設(shè)置窗口的標(biāo)題文字GetWindowText:獲取窗口標(biāo)題SetIcon:設(shè)置窗口的圖標(biāo)GetIcon:獲取窗口圖標(biāo)GetDlgItem:得到窗口類指定ID的控制子窗口GetDC:得到窗口的設(shè)備上下文SetMenu:設(shè)置窗口的菜單GetMenu:得到窗口的菜單編輯ppt補充:什么是設(shè)備上下文?設(shè)備上下文(DeviceContext,DC)是一個表現(xiàn)一組圖形對象和屬性的結(jié)構(gòu)使用設(shè)備上下文允許你直接操縱圖形,不用考慮低級細節(jié)。WindowsGDI是一個圖形翻譯系統(tǒng),是介于應(yīng)用程序和圖形硬件之間的一層。GDI可以輸出到任意的兼容設(shè)備,不過最常使用的設(shè)備是視頻監(jiān)視器、打印機或繪圖儀,或者是內(nèi)存中的圖元文本。GDI函數(shù)能夠繪制各種圖形和文本。所有訪問GDI的Windows函數(shù)都需要一個設(shè)備上下文句柄作為參數(shù)。編輯ppt4.2.2幾個主要的類用于完成窗口動作的函數(shù)發(fā)送消息SendMessage:發(fā)送窗口消息,立即調(diào)用PostMessage:發(fā)送窗口消息,放進消息隊列改變窗口狀態(tài)MoveWindow:移動窗口ShowWindow:控制窗口的顯示實現(xiàn)消息處理機制的函數(shù)WindowProc:虛函數(shù)OnCommand:處理命令消息消息處理函數(shù):OnCreate和OnClose編輯ppt4.2.2幾個主要的類3、在MFC下創(chuàng)建一個窗口對象分兩步:創(chuàng)建MFC窗口對象(定義)創(chuàng)建對應(yīng)的Windows窗口對象窗口創(chuàng)建過程中將發(fā)送兩個消息:WM_NCCREATE:創(chuàng)建非客戶區(qū)后發(fā)送該消息WM_CREATE:創(chuàng)建客戶區(qū)后發(fā)送該消息編輯ppt4.2.2幾個主要的類4、MFC窗口的使用MFC窗口類包括:框架類CframeWnd和CMidFrameWnd文檔框架CMidChildWnd視圖Cview,繼承有ClistView、CEditView、CTreeView、CRichEditView對話框CDialog工具條CToolBar狀態(tài)條CStatusBar控制窗口CList、CEdit、CComboBox、CButton等編輯ppt4.2.2幾個主要的類5、MFC下窗口的銷毀Hwnd窗口的銷毀和MFC窗口對象的銷毀一般的窗口類:點擊關(guān)閉按鈕時將調(diào)用DestroyWindow完成銷毀過程控制窗口:利用DestroyWindow完成銷毀過程編輯ppt4.3CObject類CObject是大多數(shù)MFC類的根類或基類。CObject類有很多有用的特性:對運行時類信息的支持對動態(tài)創(chuàng)建的支持對串行化的支持對象診斷輸出MFC從CObject派生出許多類,具備其中的一個或者多個特性。程序員也可以從CObject類派生出自己的類,利用CObject類的這些特性。編輯ppt4.3.1CObject的定義CObject提供了:一個靜態(tài)函數(shù):_GetBaseClass;五個虛擬函數(shù):析構(gòu)函數(shù)、GetRuntimeClass、Serialize、AssertValid、Dump這些虛擬函數(shù),在CObject的派生類中應(yīng)該有更具體的實現(xiàn)。必要的話,派生類實現(xiàn)它們時可能要求先調(diào)用基類的實現(xiàn),例如Serialize和Dump就要求這樣。編輯ppt4.3.2CObject的特性1、對運行時類信息的支持即用于在運行時,判定一個對象是否屬于一個特定的類,或者從一個特定類派生的,通過IsKindOf函數(shù)實現(xiàn)此功能。派生時,需要按如下操作:類說明文件中使用DECLARE_DYNAMIC宏類實現(xiàn)文件中使用IMPLEMENT_DYNAMIC宏編輯pptclassCPerson:publicCObject{public:
DECLARE_DYNAMIC(CPerson) CPerson(){};//缺省構(gòu)造函數(shù) CString m_name; WORD m_number; void Serialize(CArchive&archive);};IMPLEMENT_DYNAMIC(CPerson,
CObject)
編輯ppt4.3.2CObject的特性2、對動態(tài)創(chuàng)建的支持及運行時創(chuàng)建該類的實例,要使得派生的類具有動態(tài)創(chuàng)建的功能,必須在定義該類時:類說明文件中使用DECLARE_DYNCRETE宏定義一個不帶參數(shù)的構(gòu)造函數(shù)類實現(xiàn)文件中使用IMPLEMENT_DYNCRETE宏編輯pptclassCPerson:publicCObject{public:
DECLARE_DYNCREATE(CPerson) CPerson(){};//缺省構(gòu)造函數(shù) CString m_name; WORD m_number; void Serialize(CArchive&archive);};
IMPLEMENT_DYNCREATE(CPerson,
CObject)
編輯ppt4.3.2CObject的特性使用時先通過宏RUNTIME_CLASS得到RunTime信息,然后用CRuntimeClass的成員函數(shù)CreateObject創(chuàng)建該類的實例例如:CRuntimeClass*pRuntimeClass=RUNTIME_CLASS(CNname)//CName必須有一個缺省構(gòu)造函數(shù)CObject*pObject=pRuntimeClass->CreateObject();//用IsKindOf檢測是否是CName類的實例Assert(pObject->IsKindOf(RUNTIME_CLASS(CName));編輯ppt4.3.2CObject的特性3、對序列化的支持序列化指的是把對象內(nèi)容存入一個文件或從一個文件中讀取對象內(nèi)容的過程。類說明文件中使用DECLARE_SERIAL宏定義一個不帶參數(shù)的構(gòu)造函數(shù)類實現(xiàn)文件中使用IMPLEMENT_SERIAL宏覆蓋Serialize成員函數(shù)編輯ppt4.3.2CObject的特性一個類要支持實現(xiàn)序列化,使得它的對象可以保存到文檔中或者可以從文檔中讀入到內(nèi)存中并生成對象。需要覆蓋基類的Serialize虛擬函數(shù)來完成其對象的序列化。僅僅有類的支持是不夠的,MFC還提供了一個歸檔類CArchive來支持簡單類型的數(shù)據(jù)和復(fù)雜對象的讀寫。編輯ppt4.3.2CObject的特性一個CArchive對象在要序列化的對象和存儲媒體之間起中介作用。它提供了系列方法來完成序列化,可以序列化的數(shù)據(jù)包括:簡單類型數(shù)據(jù):如int、float復(fù)雜的數(shù)據(jù):如string等進行序列化復(fù)雜的對象:包括復(fù)合對象完成序列化的這些方法:重載的操作符>>和<<。
創(chuàng)建CArchive對象時,必須有一個CFile對象,它代表了存儲媒介。
編輯pptclassCPerson:publicCObject{public: DECLARE_SERIAL(CPerson) CPerson(){};//缺省構(gòu)造函數(shù) CString m_name; WORD m_number; void Serialize(CArchive&archive);};IMPLEMENT_SERIAL(CPerson,CObject,wSchema)
該宏的第三個參數(shù)是架構(gòu)編號,即類對象的版本號。是大于或等于零的整數(shù)。編輯ppt4.3.2CObject的特性4、綜合實例(定義一個支持串行化的類Cperson)classCPerson:publicCObject{public: DECLARE_SERIAL(CPerson) CPerson(){};//缺省構(gòu)造函數(shù) CString m_name; WORD m_number; void Serialize(CArchive&archive);};編輯ppt4.3.2CObject的特性實現(xiàn)該類的成員函數(shù)Serialize,覆蓋CObject的該函數(shù):voidCPerson::Serialize(CArchive&archive){ //先調(diào)用基類函數(shù)的實現(xiàn)
CObject::Serialize(archive); if(archive.IsStoring()) archive<<m_name<<m_number; else archive>>m_name>>m_number;}編輯ppt4.3.2CObject的特性CPersona;//使用運行時類信息,ASSERT為宏(斷言)ASSERT(a.IsKindOf(RUNTIME_CLASS(CPerson)));ASSERT(a.IsKindOf(RUNTIME_CLASS(CObject)));//動態(tài)創(chuàng)建:CRuntimeClass*pRuntimeClass=RUNTIME_CLASS(CPerson)//Cperson有一個缺省構(gòu)造函數(shù)CObject*pObject=pRuntimeClass->CreateObject();Assert(pObject->IsKindOf(RUNTIME_CLASS(CPerson));
編輯ppt4.4消息映射的實現(xiàn)編輯ppt4.4.1消息的分類1、隊列消息和非隊列消息(發(fā)送方式)隊列消息:送到系統(tǒng)消息隊列,然后送到線程消息隊列非隊列消息:后者直接送給目的窗口過程
隊列消息包括:鼠標(biāo)及鍵盤事件,WM_PAINT、WM_TIMER、WM_QUIT2、系統(tǒng)消息隊列和線程消息隊列系統(tǒng)消息隊列:Windows操作系統(tǒng)維護的消息隊列線程消息隊列:每個線程還有一個消息隊列編輯ppt4.4.1消息的分類3、系統(tǒng)消息和應(yīng)用程序消息(應(yīng)用范圍)系統(tǒng)消息的ID范圍為0---WM_USER-1,應(yīng)用程序消息ID范圍為WM_USER到0X7FFF。消息的ID是唯一的。設(shè)計程序時,必須保證消息的唯一性。編輯ppt4.4.2MSG消息結(jié)構(gòu)和消息處理1、MSG消息結(jié)構(gòu)操作系統(tǒng)將每個事件都包裝成一個稱為消息的結(jié)構(gòu)體MSG來傳遞給應(yīng)用程序。MSG結(jié)構(gòu)定義如下:
typedefstructtagMSG{
HWNDhwnd;
//窗口句柄(索引內(nèi)存當(dāng)中的資源)
UINT
message;
//消息標(biāo)識(ID)
WPARAMwParam;//消息的附加參數(shù),如按下是哪個按鍵
LPARAMLParam;//關(guān)于消息的附加參數(shù)
DWORDtime;//消息被傳遞時候的時間
POINTpt;//消息產(chǎn)生時鼠標(biāo)的的位置
}MSG;編輯ppt4.4.2MSG消息結(jié)構(gòu)和消息處理消息的處理:非隊列消息由Windows直接送給目的窗口的窗口過程隊列消息由::DispatchMessage等派發(fā)給目的窗口的窗口過程。窗口過程被調(diào)用時,接受四個參數(shù):窗口句柄Hwnd消息標(biāo)識ID兩個32位的消息參數(shù)wParam,lParam;編輯ppt4.4.2MSG消息結(jié)構(gòu)和消息處理2、應(yīng)用程序通過窗口過程來處理消息每個窗口類都有一個窗口過程LRESULTCALLBACKWndProc(HWNDhWnd,UINTMessage,WPARAMwParam,LPARAMlParam){switch(Message){caseWM_CREATE:……;caseWM_DESTROY:PostQuitMessage(0);break;default:……;}return0;}編輯ppt4.4.2MSG消息結(jié)構(gòu)和消息處理幾個常見的消息處理函數(shù):GetMessage//從消息隊列得到消息TranslateMessage(&msg);//將虛擬鍵消息轉(zhuǎn)換為字符消息。DispatchMessage(&msg);//發(fā)送消息GetMessageTime//獲取消息產(chǎn)生的時GetMessagePos//獲取消息產(chǎn)生時鼠標(biāo)光標(biāo)所在的位置。編輯ppt4.4.2MSG消息結(jié)構(gòu)和消息處理3、應(yīng)用程序通過消息循環(huán)獲得對消息的處理Win32GUI程序的基本消息處理方式:消息循環(huán)結(jié)構(gòu)如下:MSGmsg;while(GetMessage(&msg,NULL,0,0)){
TranslateMessage(&msg);
DispatchMessage(&msg); }編輯ppt4.4.3MFC消息處理MFC的消息發(fā)送和處理本質(zhì)上和上面介紹的Win32API處理方式一樣,但MFC是通過提供消息映射機制來處理消息的;消息映射:讓編程者指定用來處理某個消息的某個MFC類。在類中實現(xiàn)處理消息的函數(shù)和消息之間的關(guān)聯(lián)。編輯ppt4.4.4MFC消息映射的定義和實現(xiàn)1、MFC處理的三類消息Windows消息:“WM_”開頭的消息,WM_COMMAND除外控制通知消息:控制子窗口送給父窗口的通知消息命令消息:菜單、工具欄等對象的通知消息能處理消息映射的類必須從CCmdTarget派生;編輯ppt4.4.4MFC消息映射的定義和實現(xiàn)2、MFC消息映射的實現(xiàn)方法通過類向?qū)崿F(xiàn)消息映射,在頭文件中使用映射宏聲明消息處理函數(shù);//{{AFX_MSG(CTttApp)
afx_msgvoidOnAppAbout();//}}AFX_MSGDECLARE_MESSAGE_MAP()編輯ppt4.4.4MFC消息映射的定義和實現(xiàn)在對應(yīng)的實現(xiàn)文件中使用映射宏實現(xiàn)消息和處理函數(shù)的關(guān)聯(lián)。BEGIN_MESSAGE_MAP(CTApp,CWinApp)//{{AFX_MSG_MAP(CTttApp) ON_COMMAND(ID_APP_ABOUT,OnAppAbout)//}}AFX_MSG_MAPEND_MESSAGE_MAP()編輯ppt消息映射宏的種類1、映射Windows消息的宏,前綴為ON_WM_特點:不帶參數(shù),因為它對應(yīng)的消息和消息處理函數(shù)的函數(shù)名稱、函數(shù)原型是確定的。例如:宏ON_WM_CREATE()把消息WM_CREATE映射到OnCreate函數(shù)。編輯ppt消息映射宏的種類2、映射命令消息的宏ON_COMMAND特點:帶有參數(shù),需要通過參數(shù)指定命令I(lǐng)D和消息處理函數(shù),映射單條命令消息。ON_COMMAND(ID_APP_ABOUT,OnAppAbout)ON_COMMAND_RANGE:特點:把一定范圍的命令消息映射到一個消息處理函數(shù)的映射宏。帶有3個參數(shù),需要指定命令I(lǐng)D的范圍和消息處理函數(shù)。ON_COMMAND_RANGE(1000,1003,OnAppAbout)編輯ppt消息映射宏的種類3、用于控制窗口通知消息的宏特點:(1)可能帶有三個參數(shù),如ON_CONTROL,就需要指定通知碼、控制窗口ID和消息處理函數(shù);ON_CONTROL(CBN_SELCHANGE,ID_CB,
OnSelChangeCB)(2)也可能帶有兩個參數(shù),需要指定控制窗口ID和消息處理函數(shù)。
ON_EN_CHANGE(IDC_NAME,OnChangeE_Name)編輯ppt消息映射宏的種類3、用于控制窗口通知消息的宏(3)ON_CONTROL_RANGE(包含四個參數(shù))參數(shù)1:nCode是特定的通知碼參數(shù)2、3:nID和nLastID指定控制窗口ID的范圍參數(shù)4:響應(yīng)的函數(shù)例如:10編輯框,任意一個編輯框的值改變時,全局變量i都改變ON_CONTROL_RANGE(wNotifyCode,id1,id10,memberFxn)編輯ppt消息映射宏的種類4、用戶界面狀態(tài)更新的宏ON_UPDATE_COMMAND_UI
這類宏被映射到消息WM_COMMND上,帶有兩個參數(shù),需要指定用戶接口對象ID和消息處理函數(shù)。例如按鈕變灰:ON_UPDATE_COMMAND_UI(IDC_BTN1,OnUpdateBtn1)
有更新一定ID范圍的用戶接口對象的宏:ON_UPDATE_COMMAND_UI_RANGE例如更新菜單ON_UPDATE_COMMAND_UI_RANGE(
id1,
id2,
OnUpdateMenu)編輯ppt消息映射宏的種類5、其它消息的宏ON_MESSAGE6、擴展消息映射宏編輯ppt上節(jié)課重點1、WinAPI與MFC的區(qū)別聯(lián)系2、WIN32API編程的基本框架3、VC的消息處理機制通過映射的方式實現(xiàn)消息的處理。消息映射時要在頭文件中申明映射函數(shù),實現(xiàn)文件中申明映射方式。編輯ppt4.5MFC對象的創(chuàng)建MFC是基于“文檔—視圖”為核心的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 購物廣場項目風(fēng)險分析
- 安置房工程規(guī)劃與實施可行性研究
- 數(shù)學(xué)課教學(xué)計劃
- PPP項目合作社會效益協(xié)議(2024年版)
- 家長簽合同范本
- 奶茶合伙合同范本
- 餐飲設(shè)計合同范本
- 搭竹架合同范本
- 加盟羅森便利店合同范本
- 年度原水處理設(shè)備:電滲析設(shè)備競爭策略分析報告
- 大學(xué)生發(fā)展生涯展示
- 社會主義現(xiàn)代化建設(shè)教育科技人才戰(zhàn)略
- 物業(yè)保安、保潔項目投標(biāo)書
- 眼視光學(xué):專業(yè)職業(yè)生涯規(guī)劃
- 預(yù)防母嬰傳播培訓(xùn)
- 房屋改造方案可行性分析報告
- 2024年電子維修培訓(xùn)資料
- 水利工程測量的內(nèi)容和任務(wù)
- 小學(xué)班長培訓(xùn)課件
- 項目風(fēng)險識別與控制-年度總結(jié)
- 《決策心理學(xué)》課件
評論
0/150
提交評論