Visual_C++精品教程(2).ppt_第1頁(yè)
Visual_C++精品教程(2).ppt_第2頁(yè)
Visual_C++精品教程(2).ppt_第3頁(yè)
Visual_C++精品教程(2).ppt_第4頁(yè)
Visual_C++精品教程(2).ppt_第5頁(yè)
已閱讀5頁(yè),還剩62頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、VC+精品簡(jiǎn)介(下),包括vc+6.0界面.功能鍵介紹. 包括 標(biāo)準(zhǔn)編程和MFC 可視化編程等等! 物美價(jià)廉??!,Visual C+6.0簡(jiǎn)介 Windows編程機(jī)理 基于API編程 MFC編程基礎(chǔ) 消息映射機(jī)制分析,Visual C+編程,7.4 MFC編程基礎(chǔ),使用Visual C+開(kāi)發(fā)應(yīng)用程序最常用的模式是MFC。 MFC是Microsoft Foundation Class(微軟基礎(chǔ)類)的縮寫。 簡(jiǎn)單來(lái)說(shuō),MFC就是利用面向?qū)ο蟮乃枷耄瑢indows大部分API函數(shù)封裝起來(lái)的一個(gè)浩瀚的類庫(kù)。 利用MFC編寫程序本質(zhì)上就是選擇該類庫(kù)中合適的類,并調(diào)用其下相應(yīng)成員函數(shù)來(lái)完成某個(gè)功能。 從

2、物理角度看,MFC是一個(gè)類庫(kù)、對(duì)應(yīng)于Windows系統(tǒng)目錄下的一系列mfc*.dll文件; 從邏輯角度看,MFC是一個(gè)應(yīng)用程序框架,稱為文檔/視圖架構(gòu)。 程序員可以使用這一框架創(chuàng)建Windows應(yīng)用程序。 下面就從這兩個(gè)方面分別加以介紹。,一、概述,二、MFC類庫(kù),7.4 MFC編程基礎(chǔ),根類CObject是抽象基類,提供公共操作和基本服務(wù)。 包括: 對(duì)象的動(dòng)態(tài)建立與刪除; 序列化(即串行化)的支持; 對(duì)象診斷輸出; 運(yùn)行時(shí)信息以及集合類的兼容等。,1. 根類,7.4 MFC編程基礎(chǔ),(1) 消息映射類 消息映射類CCmdTarget是所有具有消息映射屬性的基類,消息映射規(guī)定了當(dāng)對(duì)象接到命令消

3、息時(shí),應(yīng)調(diào)用哪一個(gè)函數(shù)對(duì)該消息進(jìn)行處理。 由CCmdTarget派生出的主框架類包括: CView、CWinApp、CDocument、CWnd、CframeWnd,2. 應(yīng)用程序體系結(jié)構(gòu)類,7.4 MFC編程基礎(chǔ),(2) 窗口應(yīng)用程序類CWinApp 每一個(gè)應(yīng)用程序只能包含一個(gè)從CWndApp派生的應(yīng)用程序?qū)ο蟆?從CWinApp實(shí)例化的應(yīng)用程序?qū)ο笫且粋€(gè)全局變量,在程序運(yùn)行中該對(duì)象可以與其它對(duì)象相互協(xié)調(diào)。 通過(guò)AfxGetApp()函數(shù)獲得一指向CWinApp對(duì)象的指針。,7.4 MFC編程基礎(chǔ),7.4 MFC編程基礎(chǔ),該類為線程的基類,該對(duì)象描述程序線程的執(zhí)行,主線程的執(zhí)行通常由一個(gè)CW

4、inApp的派生對(duì)象提供。 CWinThread的公共數(shù)據(jù)成員 m_hThread:當(dāng)前線程的句柄。 m_nThreadID:當(dāng)前線程的ID值。 m_pMainWnd:指向程序主窗口指針。 CWinThread的公共成員函數(shù) GetMainWnd:獲取一個(gè)指向此線程的的主窗口指針。 GetThreadPriority:獲取當(dāng)前線程的優(yōu)先權(quán)。 ResumeThread:減小一個(gè)線程的掛起計(jì)數(shù)。,(3) 應(yīng)用程序線程類CWinThread,(4) 文檔/視圖類 文檔對(duì)象由文檔模板對(duì)象創(chuàng)建,管理應(yīng)用程序的數(shù)據(jù);視圖對(duì)象表示一個(gè)窗口的客戶區(qū),顯示文檔數(shù)據(jù),并允許用戶與之交互。 CDocTemplate

5、類:文檔模板的基類。它負(fù)責(zé)協(xié)調(diào)文檔、視窗和框架窗口的創(chuàng)建。 CMultiDocTemplate類:多文檔界面(MDI)的文檔模板。 CSingleDocTemplate類:?jiǎn)挝臋n界面(SDI)的文檔模板。 CDocument:應(yīng)用程序所用文檔的基類。 CView:顯示文檔數(shù)據(jù)的應(yīng)用程序?qū)S靡晥D的基類。,7.4 MFC編程基礎(chǔ),(1) 窗口類CWnd CWnd類提供了MFC中所有窗口類的基類。CWnd與Windows窗口有所不同,但他們又是緊密相連的。CWnd對(duì)象是由CWnd的構(gòu)造函數(shù)和析構(gòu)函數(shù)建立和取消的,而Windows窗口與此不同,它是Windows的一個(gè)結(jié)構(gòu),是由create成員函數(shù)建立

6、的,DestroyWindow函數(shù)破壞Windows窗口而不是破壞對(duì)象。,3. 可視對(duì)象類,7.4 MFC編程基礎(chǔ),(2)CFrameWnd類 CFrameWnd:SDI應(yīng)用程序的主框架窗口的基類,它是其它框架窗口類的基類。 CMDIFrameWnd:MDI應(yīng)用程序的主框架窗口的基類。 CMDIChildWnd:MDI應(yīng)用程序的文檔框架窗口的基類。,7.4 MFC編程基礎(chǔ),7.4 MFC編程基礎(chǔ),(3) 視圖類 CView:查看文檔數(shù)據(jù)的應(yīng)用程序視圖的基類。 CScrollView:具有滾動(dòng)功能的視圖的基類。從其派生的視圖類可以自動(dòng)實(shí)現(xiàn)滾動(dòng)。 CFormView:從其派生的類用于實(shí)現(xiàn)基于對(duì)話模

7、板資源的用戶界面。 CRecordView:提供直接鏈接到ODBC記錄集的表單視圖。 CEditView:包含Windows標(biāo)準(zhǔn)編輯控件的視圖。,7.4 MFC編程基礎(chǔ),(4) 對(duì)話框類 由于對(duì)話框是一個(gè)特殊窗口,所以該類是從CWnd類中派生出來(lái)的。 公共對(duì)話框子類。 CDialog:所有對(duì)話框(模態(tài)或者非模態(tài))的基類。 CCommonDialog:所有通用對(duì)話框類的基類。 CFileDialog:打開(kāi)或保存文件的標(biāo)準(zhǔn)對(duì)話框。 CColorDialog:用于選擇顏色的的標(biāo)準(zhǔn)對(duì)話框。 CFontDialog:選擇字體的標(biāo)準(zhǔn)對(duì)話框。 CPrintDialog:用于打印文件的標(biāo)準(zhǔn)對(duì)話框。,(5) 常

8、用控件類 CStatic:靜態(tài)文本控件。 CButton:按鈕控件窗口。 CEdit:編輯控件窗口。 CScrollBar:滾動(dòng)條控件窗口。 CSliderCtrl:滑動(dòng)條控件窗口。 CListBox:列表框控件窗口。 CComboBoxl:組合框控件窗口。 CBitmapButton:以位圖而非文字作為標(biāo)題的按鈕。 CAnimateCtrl:動(dòng)畫顯示控件。 CTreeCtrl:樹(shù)形查看控件,顯示項(xiàng)的層次列表結(jié)構(gòu)。 CListCtrl:管理由圖標(biāo)和標(biāo)簽組成的列表項(xiàng),可以4種方式(圖標(biāo)、小圖標(biāo)、列表和詳細(xì)資料)顯示列表項(xiàng)內(nèi)容。,7.4 MFC編程基礎(chǔ),(6) 控件欄類 控件欄類為工具條、狀態(tài)條、

9、對(duì)話條和分割窗口建立模型,負(fù)責(zé)管理工具條、狀態(tài)條、對(duì)話條的一些成員函數(shù)。 CControlBox:MFC控件欄的基類。 CToolBar:包含位圖按鈕的工具欄控件窗口。 CStatusBar:狀態(tài)欄控件窗口的基類。 CDialogBar:基于對(duì)話框模板資源的控件欄。 CStatusBarCtrl:分成多個(gè)面板的水平窗口,用于顯示應(yīng)用程序和狀態(tài)信息。 CToolBarCtrl:Windows工具欄控件,包含按鈕和可選空間的窗口。,7.4 MFC編程基礎(chǔ),Windows庫(kù)包含了大量支持CObject類及其子類的宏。 (1) 消息映射宏 Windows是一個(gè)消息驅(qū)動(dòng)的操作系統(tǒng),VC提供了與消息有關(guān)的

10、宏,它們是: DECLARE_MESSAGE_MAP(初始化消息映射表); BEGIN_MESSAGE_MAP(開(kāi)始用戶消息映射); END_MESSAGE_MAP(結(jié)束用戶消息映射)。,5. 預(yù)定義的宏,7.4 MFC編程基礎(chǔ),7.4 MFC編程基礎(chǔ),(2) 確定對(duì)象所屬類的信息的宏 每一個(gè)從CObject派生的類都和一個(gè)對(duì)應(yīng)的CRuntimeClass結(jié)構(gòu)相聯(lián)系,在程序運(yùn)行時(shí),用戶可以根據(jù)該結(jié)構(gòu)掌握對(duì)象的信息以及該類的基類的信息。 另外,通過(guò)CObject中的成員函數(shù)IsKindOf可確定某對(duì)象是否屬于一個(gè)指定的類或由指定的類派生。 為了使從CObject派生的類的對(duì)象能夠在程序運(yùn)行時(shí)動(dòng)態(tài)

11、創(chuàng)建,VC匯總提供了動(dòng)態(tài)創(chuàng)建對(duì)象的宏,它們是: DECLARE_DYNCREATE (放在類的聲明文件中,聲明動(dòng)態(tài)創(chuàng)建對(duì)象); IMPLEMENT_DYNCREATE(放在類的實(shí)現(xiàn)文件中,表明實(shí)現(xiàn)對(duì)象的動(dòng)態(tài)創(chuàng)建)。,(3)實(shí)時(shí)運(yùn)行類結(jié)構(gòu)信息宏 該宏的結(jié)構(gòu)是RUNTIME_CLASS( ) 在應(yīng)用程序中使用該宏,可以在運(yùn)行時(shí)由類“名稱”獲得有關(guān)類結(jié)構(gòu)的信息。 方法: 通過(guò)CObject的成員函數(shù)IsKindOf( )來(lái)確定。,7.4 MFC編程基礎(chǔ),7.4 MFC編程基礎(chǔ),(4)串行化宏 從一個(gè)文件中讀出或向某一文件中寫入某對(duì)象的過(guò)程叫串行化。 若想使從CObject派生的類可串行化,應(yīng)該按下列

12、步驟使用宏: 在從CObject派生的類的定義中使用DECLARE_SERIAL宏; 在從CObject派生的類的實(shí)現(xiàn)文件中使用IMPLEMENT_SERIAL 宏; 在從CObject派生類中重載Serialize成員函數(shù)。 MFC 中還包含了許多完成其它功能的宏,如:可用于診斷服務(wù)、異常處理、應(yīng)用信息與管理等,感興趣的讀者可參閱MSDN的說(shuō)明。 具體內(nèi)容在第9單元學(xué)習(xí)。,從應(yīng)用方面講,架構(gòu)就是整個(gè)或部分系統(tǒng)的可復(fù)用設(shè)計(jì),表現(xiàn)為一組抽象組件及其實(shí)例間交互的方法; 從目的方面講,架構(gòu)就是可被應(yīng)用程序開(kāi)發(fā)者定制的應(yīng)用骨架。 可以說(shuō),一個(gè)應(yīng)用程序架構(gòu)就是一個(gè)可復(fù)用的設(shè)計(jì)組件,規(guī)定了應(yīng)用程序的體系結(jié)

13、構(gòu),闡明了整個(gè)設(shè)計(jì)、協(xié)作組件之間的依賴關(guān)系、責(zé)任分配和控制流程。 應(yīng)用程序架構(gòu)包括:應(yīng)用程序的總體組織和全局控制、通訊協(xié)議、同步、數(shù)據(jù)存取,給設(shè)計(jì)元素分配特定功能,設(shè)計(jì)元素的組織,規(guī)模和性能,以及在各個(gè)設(shè)計(jì)方案間進(jìn)行選擇。,1. 應(yīng)用程序架構(gòu)的概念,三、MFC應(yīng)用程序架構(gòu),7.4 MFC編程基礎(chǔ),所謂軟件復(fù)用,是指在兩次或多次不同的軟件開(kāi)發(fā)過(guò)程中重復(fù)使用相同或相近軟件元素的過(guò)程。 軟件元素: 包括程序代碼、測(cè)試用例、設(shè)計(jì)文檔、設(shè)計(jì)過(guò)程、需求分析文檔等,甚至領(lǐng)域知識(shí)。 通常,把這種可復(fù)用的元素稱作軟構(gòu)件。,7.4 MFC編程基礎(chǔ),2. 什么是軟件復(fù)用,根據(jù)復(fù)用的程度,可以將軟件復(fù)用分為以下幾類:

14、 (1)源代碼復(fù)用 這是應(yīng)用最為廣泛的復(fù)用方式,不僅表現(xiàn)在復(fù)用現(xiàn)有的代碼,例如已經(jīng)開(kāi)發(fā)完的類、源文件、LIB庫(kù),還表現(xiàn)在每一代碼的實(shí)現(xiàn)過(guò)程中。 (2)模塊復(fù)用 典型的例子是Windows下的動(dòng)態(tài)鏈接庫(kù)程序DLL。 當(dāng)前模塊復(fù)用比較活躍的技術(shù)有COM組件技術(shù),每個(gè)COM組件有自己的屬性和操作,是一個(gè)相對(duì)獨(dú)立運(yùn)行的實(shí)體,使用該技術(shù)構(gòu)造應(yīng)用程序就像是搭積木一樣,搞清楚每個(gè)程序這個(gè)“建筑”有哪些積木塊組成。,7.4 MFC編程基礎(chǔ),(3)接口復(fù)用 在一個(gè)程序定義好一套接口,而另一個(gè)應(yīng)用程序可以依據(jù)這套接口來(lái)詳細(xì)設(shè)計(jì)。接口復(fù)用在VC下表現(xiàn)為一些類的虛函數(shù)。微軟的Visual Studio的IDE編程、I

15、E擴(kuò)展編程、屏幕保護(hù)程序等都是接口復(fù)用的例子。接口的定義使得軟件的開(kāi)發(fā)可以擴(kuò)展到用戶一級(jí),由用戶進(jìn)行軟件功能的深化或定制。 (4)應(yīng)用程序復(fù)用 在一個(gè)應(yīng)用程序中調(diào)用另一個(gè)程序,創(chuàng)建一個(gè)新的進(jìn)程就是應(yīng)用程序復(fù)用的典型例子。在Win32平臺(tái)下,一般通過(guò)CreateProcess這個(gè)API函數(shù)和SHELL方面的API函數(shù)ShellExecute來(lái)創(chuàng)建新的進(jìn)程。 (5)應(yīng)用程序架構(gòu)復(fù)用 如MFC,就是實(shí)現(xiàn)了一種應(yīng)用程序架構(gòu)復(fù)用的類庫(kù)。,7.4 MFC編程基礎(chǔ),應(yīng)用程序架構(gòu)本質(zhì)上是一種軟件高層次復(fù)用,它可以在具有相似需求的多個(gè)系統(tǒng)中得到復(fù)用,這比代碼級(jí)的復(fù)用具有更大的意義。 通過(guò)對(duì)應(yīng)用程序架構(gòu)抽象,可以

16、使設(shè)計(jì)者能夠?qū)σ恍┙?jīng)過(guò)時(shí)間證明是非常有效的體系結(jié)構(gòu)進(jìn)行復(fù)用,從而保證新的軟件開(kāi)發(fā)能夠成功,提高軟件開(kāi)發(fā)的效率。 在軟件設(shè)計(jì)過(guò)程中,常常會(huì)發(fā)現(xiàn),對(duì)一個(gè)體系結(jié)構(gòu)部件進(jìn)行抽象就可以將它應(yīng)用到其它的設(shè)計(jì)中,從而降低設(shè)計(jì)的復(fù)雜度。 應(yīng)用程序架構(gòu)有利于形成完整的軟件生產(chǎn)線和軟件工廠,并共享公共的架構(gòu),應(yīng)用程序架構(gòu)的可復(fù)用性使得我們可以使用第三方應(yīng)用程序架構(gòu)。,7.4 MFC編程基礎(chǔ),3. 為什么使用應(yīng)用程序架構(gòu),打開(kāi)VC集成環(huán)境,選擇“File|New.”菜單,并在“Projects”選項(xiàng)卡中選擇“Win32 Application”。 在項(xiàng)目名稱“Project Name”編輯框中輸入“MfcHello

17、”,路徑Location編輯框中輸入一個(gè)工程所存放的路徑,如:e:vcpp。 單擊“OK”按鈕,出現(xiàn)“Win32 Application-Step 1 of 1”對(duì)話框,選擇An Empty project,并按下“Finish”按鈕。,7.4 MFC編程基礎(chǔ),四、一個(gè)基于框架的MFC應(yīng)用程序?qū)嵗?1. 生成程序框架,在“Files”中選擇“C/C+ Header File”, 輸入“Hello”,按“OK”按鈕,在當(dāng)前的工程中添加了一個(gè)頭文件hello.h。內(nèi)容如下: class CMyApp : public CWinApp public: virtual BOOL InitInstanc

18、e (); ; class CMainWindow : public CFrameWnd public: CMainWindow (); protected: afx_msg void OnPaint (); /WM_PAINT的消息響應(yīng)函數(shù) DECLARE_MESSAGE_MAP () /聲明消息映射 ;,7.4 MFC編程基礎(chǔ),2. 添加hello.h頭文件,選擇“C+ Source File”, 輸入“Hello”,添加實(shí)現(xiàn)文件hello.cpp。 內(nèi)容如下: #include #include Hello.h CMyApp TheApp; /由應(yīng)用程序類實(shí)例化一個(gè)對(duì)象 BOOL CMy

19、App:InitInstance () m_pMainWnd = new CMainWindow; /m_pMainWnd是CMyApp的公有數(shù)據(jù)成員, /它從類CWinApp繼承而來(lái),存放主窗口的指針 m_pMainWnd-ShowWindow (m_nCmdShow); m_pMainWnd-UpdateWindow (); return TRUE; ,7.4 MFC編程基礎(chǔ),3. 添加頭文件的實(shí)現(xiàn)文件hello.cpp,BEGIN_MESSAGE_MAP (CMainWindow, CFrameWnd) /開(kāi)始消息映射 ON_WM_PAINT () END_MESSAGE_MAP ()

20、/結(jié)束消息映射 CMainWindow:CMainWindow () /框架窗口的構(gòu)造函數(shù) Create(NULL, The First MFC Application); /創(chuàng)建窗口 void CMainWindow:OnPaint () CPaintDC dc (this); CRect rect; GetClientRect ( ,7.4 MFC編程基礎(chǔ),在VC集成開(kāi)發(fā)環(huán)境下選擇“Project|Settings.”,彈出“Project Setting” 對(duì)話框。 在該對(duì)話框左方的“General”選項(xiàng)卡中,通過(guò)組合框“Microsoft Foundation Class”選擇使用MF

21、C類庫(kù)的方法為“Use MFC in a Shared DLL(以動(dòng)態(tài)鏈接庫(kù)方式使用MFC)”。 該種方式依賴于Windows操作系統(tǒng)目錄下存放的mfc*.dll庫(kù)文件。如果選“Not Using MFC”,代表程序中不使用MFC,“Use MFC in a Static DLL”代表以靜態(tài)方式鏈接到MFC,該方式的優(yōu)點(diǎn)是程序的運(yùn)行不依賴mfc*.dll文件,但它的代價(jià)是可執(zhí)行文件的長(zhǎng)度大,而且對(duì)內(nèi)存的利用不夠充分。,7.4 MFC編程基礎(chǔ),4. 設(shè)置動(dòng)態(tài)鏈接到MFC類庫(kù),7.4 MFC編程基礎(chǔ),編譯、鏈接,并運(yùn)行該程序,在屏幕上出現(xiàn)了一個(gè)顯示信息的具有Windows界面的窗口。它具有可以移動(dòng)

22、、最大化、最小化等常見(jiàn)的窗口功能。,5. 運(yùn)行程序,7.5 消息映射機(jī)制,上次課已經(jīng)學(xué)過(guò),Windows應(yīng)用程序都是基于事件驅(qū)動(dòng)的,即消息映射機(jī)制。 所謂消息映射,就是一種把消息映射到相應(yīng)的消息響應(yīng)函數(shù)上的機(jī)制。 常見(jiàn)的消息有: 窗口消息 命令消息 控件通知消息 自定義消息,一、概述,7.5 消息映射機(jī)制,Windows靠消息的流動(dòng)而轉(zhuǎn)動(dòng)。 Windows各種消息沿著MFC應(yīng)用程序架構(gòu)規(guī)定的路線,找到消息映射函數(shù)。如果找不到,最終交給窗口對(duì)象的DefWindowProc成員函數(shù)去進(jìn)行默認(rèn)的處理。 消息機(jī)制是Win32程序設(shè)計(jì)的靈魂,Win應(yīng)用程序利用格式化的Windows消息與其它Window

23、s應(yīng)用程序及Windows系統(tǒng)進(jìn)行通訊??梢允褂肎etMessage()函數(shù)來(lái)獲取消息,然后利用DispatchMessage()函數(shù)發(fā)送消息,最后由窗口函數(shù)來(lái)進(jìn)行消息的處理。 MFC將面向?qū)ο蟮腃+編程思想與消息驅(qū)動(dòng)機(jī)制結(jié)合在一起。,7.5 消息映射機(jī)制,在利用Win32 API開(kāi)發(fā)圖形界面的應(yīng)用程序時(shí),在核心的窗口函數(shù)(進(jìn)行消息處理的函數(shù))中使用了一個(gè)大的switch/case結(jié)構(gòu)進(jìn)行流程的控制,對(duì)消息進(jìn)行分門別類地控制。 隨著對(duì)響應(yīng)消息的增加,switch/case結(jié)構(gòu)會(huì)出現(xiàn)多層嵌套,程序理解會(huì)出現(xiàn)很大的困難。 為了解決這個(gè)問(wèn)題,在MFC中引入了消息映射的概念。,7.5 消息映射機(jī)制,大

24、部分消息的發(fā)送是由用戶與應(yīng)用程序之間的交互進(jìn)行的。 MFC中的CWinApp類的Run()成員函數(shù)負(fù)責(zé)把消息從應(yīng)用程序的消息隊(duì)列中取出,發(fā)送到應(yīng)用程序的窗口函數(shù)WinProc()中,由該函數(shù)根據(jù)消息的類別,傳送到相應(yīng)的對(duì)象中。 每一個(gè)能接收消息的對(duì)象(從CCmdTarget派生)都有一個(gè)消息映射表,它用來(lái)連接消息與對(duì)應(yīng)的消息響應(yīng)函數(shù)。,二、MFC中消息的發(fā)送與接收,1. 消息的發(fā)送與接收,7.5 消息映射機(jī)制,MFC程序中,大多數(shù)要處理的消息都針對(duì)一種類型的對(duì)象窗口,這符合Windows API的模式。 任何由CCmdTarget派生的類對(duì)象都能接收命令消息(點(diǎn)擊菜單后發(fā)出的WM_COMMAN

25、D消息),這些類對(duì)象組成一個(gè)有序鏈表,鏈表中的每一個(gè)對(duì)象都可以同時(shí)接收到命令消息。 命令消息是按照一定的路徑傳送的,鏈表中的各個(gè)對(duì)象處理命令消息的優(yōu)先級(jí)的順序并不相同。 下表列出了不同應(yīng)用類型中命令消息的處理路徑。,2. 命令消息的路由,7.5 消息映射機(jī)制,7.5 消息映射機(jī)制,使用PostMessage()投遞消息 在線程消息隊(duì)列中的隊(duì)尾放置消息并立返回; 不等待線程處理這條消息。 使用SendMessage()立即發(fā)送消息 直接向一窗口函數(shù)發(fā)送消息,它調(diào)用一個(gè)窗口函數(shù); 等待窗口函數(shù)對(duì)消息的處理和返回結(jié)果。 使用SendDlgItemMessage()向?qū)υ捒蛑锌丶l(fā)送消息; 要指定控件

26、的標(biāo)識(shí)和含有該控件的對(duì)話框窗口句柄。,3. 利用函數(shù)發(fā)送消息,7.5 消息映射機(jī)制,一般情況下,使用GetMessage()函數(shù)來(lái)讀取這些消息,由DispatchMessage()將它們傳送給相應(yīng)的窗口函數(shù)進(jìn)行處理。 另外,Windows還可以直接將某些消息發(fā)送給應(yīng)用程序的窗口函數(shù),而不將它們放入應(yīng)用程序的隊(duì)列中,可以使用SendMessage()函數(shù)達(dá)到此目的。 MFC應(yīng)用程序中,消息的接收和處理靠消息映射機(jī)制來(lái)完成。 當(dāng)接收到一個(gè)消息時(shí),Windows從消息映射表中找出該消息所對(duì)應(yīng)的消息映射函數(shù),然后調(diào)用該映射函數(shù)完成相應(yīng)的功能。,4. 消息的接收與處理,7.5 消息映射機(jī)制,消息映射中的

27、映射都是一些定義好的宏,如 ON_WM_MOUSEACTIVATE ON_COMMAND ON_UPDATE_COMMAND_COMMAND_UI ON_BN_CLICKED ON_MESSAGE ON_REGISTER_MESAAGE 這些宏根據(jù)消息類別的不同而不同,有的有參數(shù),有的無(wú)參數(shù)。 下表所示是常見(jiàn)的宏。,三、消息映射中的幾種宏定義,7.5 消息映射機(jī)制,7.5 消息映射機(jī)制,啟動(dòng)Visual C+ 6.0,選擇“File”菜單的“New”命令,在彈出的“New”對(duì)話框中選擇“Project”選項(xiàng)卡。 在“Project”選項(xiàng)卡的列表中選擇“MFC AppWizard(exe)”項(xiàng),

28、在“Project Name”編輯框中輸入要?jiǎng)?chuàng)建的工程名稱MsgMap,在“Location”編輯框中設(shè)置工程的存放位置,單擊“OK”按鈕。 在彈出的“MFC AppWizard-Step1” 對(duì)話框中選擇“single document”,然后單擊“Finish”按鈕。 在彈出的“New Project information” 對(duì)話框中單擊“OK”按鈕,完成應(yīng)用程序框架的創(chuàng)建。,四、一個(gè)消息映射實(shí)例分析,1. 生成程序框架,7.5 消息映射機(jī)制,MFC的應(yīng)用程序中,消息映射可以被MFC的CCmdTarget類或從其派生而來(lái)的任何一個(gè)類來(lái)使用。 在上述生成的MsgMap單文檔應(yīng)用程序中,共有

29、應(yīng)用程序類、框架類、文檔類、視圖類和對(duì)話框類。 這五個(gè)類都是從CCmdTarget類派生而來(lái),所以Windows操作系統(tǒng)可以向所有這些類發(fā)送消息。,2. 消息映射,7.5 消息映射機(jī)制,編譯、運(yùn)行程序。在程序的主界面中,單擊工具欄中的“?”按鈕,則彈出“關(guān)于MsgMap”對(duì)話框:,3. 應(yīng)用程序框架中的消息映射,7.5 消息映射機(jī)制,我們以顯示“關(guān)于對(duì)話框”實(shí)現(xiàn)為例,說(shuō)明Windows中的命令消息的映射。 (1)修改、創(chuàng)建“?”工具欄按鈕的資源ID(現(xiàn)場(chǎng)演示),4. 消息映射機(jī)制分析,7.5 消息映射機(jī)制,從CCmdTarget派生的類將消息與消息響應(yīng)函數(shù)通過(guò)一些預(yù)定義的宏聯(lián)系起來(lái),實(shí)現(xiàn)了一一

30、對(duì)應(yīng)。 這些預(yù)定義的宏是: DECLARE_MESSAGE_MAP:初始化消息映射表 BEGIN_MESSAGE_MAP:開(kāi)始用戶消息映射 END_MESSAGE_MAP:結(jié)束用戶消息映射 ON_,(2) “?”工具欄按鈕的消息映射,7.5 消息映射機(jī)制, 消息映射的聲明 (打開(kāi)文件,觀察) class CMsgMapApp : public CWinApp public: CMsgMapApp(); / Overrides 以下為可重載的虛擬函數(shù) / ClassWizard generated virtual function overrides /AFX_VIRTUAL(CMsgMapAp

31、p) public: virtual BOOL InitInstance(); /AFX_VIRTUAL,7.5 消息映射機(jī)制,/ Implementation /AFX_MSG(CMsgMapApp) afx_msg void OnAppAbout(); /工具欄按鈕“?”的消息映射函數(shù) /AFX_MSG mapping macros here. / DO NOT EDIT what you see in these blocks of generated code!,7.5 消息映射機(jī)制, 消息映射的定義 DECLARE_MESSAGE_MAP()/消息映射宏的聲明 ; BEGIN_MES

32、SAGE_MAP(CMsgMapApp, CWinApp) /AFX_MSG_MAP(CMsgMapApp) ON_COMMAND(ID_APP_ABOUT, OnAppAbout) /工具欄?按鈕ID_APP_ABOUT對(duì)單擊的消息映射為OnAppAbout / NOTE - the ClassWizard will add and remove /AFX_MSG_MAP / Standard file based document commands ON_COMMAND(ID_FILE_NEW, CWinApp:OnFileNew) ON_COMMAND(ID_FILE_OPEN, CWi

33、nApp:OnFileOpen) / Standard print setup command ON_COMMAND(ID_FILE_PRINT_SETUP, CWinApp:OnFilePrintSetup) END_MESSAGE_MAP(),7.5 消息映射機(jī)制,當(dāng)Windows接收到一個(gè)消息時(shí),Windows通過(guò)查找消息映射表就能找到一個(gè)專門的處理函數(shù)來(lái)對(duì)其進(jìn)行響應(yīng),該函數(shù)就是消息映射函數(shù),是相應(yīng)類的成員函數(shù)。 本例消息映射函數(shù)的實(shí)現(xiàn)代碼為: void CMsgMapApp:OnAppAbout() /命令消息的消息映射函數(shù)的實(shí)現(xiàn) CAboutDlg aboutDlg; /聲明一個(gè)“關(guān)

34、于”對(duì)話框?qū)ο骯boutDlg aboutDlg.DoModal(); /調(diào)用對(duì)話框的成員函數(shù)DoModal顯示對(duì)話框 ,(3) 消息映射函數(shù),7.5 消息映射機(jī)制,五、常用的窗口消息(現(xiàn)場(chǎng)演示),1. 鍵盤消息,7.5 消息映射機(jī)制,(1)掃描碼與虛擬碼 按下一個(gè)鍵或者釋放一個(gè)鍵,鍵盤設(shè)備就產(chǎn)生一個(gè)掃描碼,這些掃描碼是鍵盤的物理碼,每一個(gè)掃描碼可以唯一地確定一個(gè)按鍵。 為了實(shí)現(xiàn)與設(shè)備無(wú)關(guān)的鍵盤操作,系統(tǒng)中定義了一個(gè)虛擬鍵盤, Windows的鍵盤驅(qū)動(dòng)程序?qū)崿F(xiàn)將各種不同的物理鍵盤映射到同一個(gè)虛擬鍵盤,程序員處理的是這唯一的虛擬鍵。 下表是常用的虛擬鍵代碼 。,7.5 消息映射機(jī)制,7.5 消息映射機(jī)制,7.5 消息映射機(jī)制,7.5 消息映射機(jī)制,(2)擊鍵消息 對(duì)于鍵盤上的所有鍵,每次按下或釋放時(shí),都

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論