




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
主要內(nèi)容2.1用MFC向?qū)蓱?yīng)用程序2.2應(yīng)用程序框架分析2.3文檔與視圖2.4工具欄和狀態(tài)欄2.5-2.7MFC新功能2.8應(yīng)用程序框架類對象分析主要內(nèi)容2.1用MFC向?qū)蓱?yīng)用程序12.1用MFC向?qū)蓱?yīng)用程序用AppWizard應(yīng)用程序向?qū)蒑FC應(yīng)用程序。單文檔應(yīng)用程序多文檔應(yīng)用程序?qū)υ捒驊?yīng)用程序用ClassWizard工具生成派生類、定義處理消息、管理對話框、定制MFC成員函數(shù)。2.1用MFC向?qū)蓱?yīng)用程序用AppWizard應(yīng)用程序22.1用MFC向?qū)蓱?yīng)用程序演示MFC向?qū)沙S玫娜N應(yīng)用程序。2.1用MFC向?qū)蓱?yīng)用程序演示MFC向?qū)沙S玫娜N32.1.2生成的應(yīng)用程序類型基于對話框的應(yīng)用程序CWinApp、CDialog類2.1.2生成的應(yīng)用程序類型基于對話框的應(yīng)用程序42.1.2生成的應(yīng)用程序類型單文檔應(yīng)用程序CWinApp、CFrameWnd、CView、CDocument2.1.2生成的應(yīng)用程序類型單文檔應(yīng)用程序52.1.2生成的應(yīng)用程序類型多文檔應(yīng)用程序CWinApp、CMDIFrameWnd、CMDIChildWnd、CView、CDocument2.1.2生成的應(yīng)用程序類型多文檔應(yīng)用程序62.1.3向?qū)晒こ涛募喗轭^文件與實現(xiàn)文件各個類的*.h和*.cppResource.h:定義工程中所有資源標(biāo)識符,給資源ID分配一個整數(shù)值。StdAfx.h和StdAfx.cpp:用于建立一個預(yù)編譯的頭文件。資源文件*.rc和*.rc2:是程序所使用的所有Windows資源的列表。*.ico:應(yīng)用程序的圖標(biāo)所使用的圖標(biāo)文件。*Doc.ico:應(yīng)用程序的文檔圖標(biāo)文件。文檔圖標(biāo)一般顯示在多文檔程序界面上。Toolbar.bmp:工具欄按鈕的位圖文件。2.1.3向?qū)晒こ涛募喗轭^文件與實現(xiàn)文件72.1.3向?qū)晒こ涛募喗榻鉀Q方案文件和工程文件*.sln:保存當(dāng)前解決方案所包含的工程的信息。*.vcxproj:包含當(dāng)前工程的設(shè)置、工程中的文件等信息。2.1.3向?qū)晒こ涛募喗榻鉀Q方案文件和工程文件8MFC應(yīng)用程序框架結(jié)構(gòu)類的繼承關(guān)系:2.2應(yīng)用程序框架分析MFC應(yīng)用程序框架結(jié)構(gòu)類的繼承關(guān)系:2.2應(yīng)用程序框架分92.2.1框架簡介1.CObject類CObject是MFC類庫的根類,它幾乎描述了所有MFC類的一些公共特性,并且給所有由它派生出的類提供了3種重要特性,即:串行化支持、運(yùn)行時類信息支持以及診斷和調(diào)試支持。2.CCmdTarget類命令類CCmdTarget是CObject的子類,它是MFC庫中所有具有消息映射屬性的類的公共基類。從CCmdTarget派生的類能在程序運(yùn)行時動態(tài)創(chuàng)建對象和處理命令消息。
2.2.1框架簡介1.CObject類103.CWinApp類CObjectCCmdTargetCWinThreadCWinApp應(yīng)用程序類在類族中的位置WinMain函數(shù)的函數(shù)體的封裝支持線程管理2.2.1框架簡介
應(yīng)用程序類CWinApp是CWinThread的子類,封裝了初始化、運(yùn)行、終止應(yīng)用程序的代碼??梢杂纱伺缮约旱膽?yīng)用類。3.CWinApp類CObjectCCmdTargetCW11指向框架窗口的指針m_pMainWnd2.2.1框架簡介指向框架窗口的指針m_pMainWnd2.2.1框架簡介12CWinApp類中定義了三個可以重寫的虛函數(shù):InitInstance()--程序創(chuàng)建和顯示窗口。程序設(shè)計時,必須以CWinApp類為基類派生自己的應(yīng)用程序類,并根據(jù)情況重寫InitInstance()。Run(),處理消息循環(huán)。ExitInstance()程序結(jié)束時做收尾工作。2.2.1框架簡介CWinApp類中定義了三個可以重寫的虛函數(shù):2.2.1134.文檔模板類CDocTemplateCObjectCCmdTargetCDocTemplateCSingleDocTemplateCMultiDocTemplate單一的文檔指針2.2.1框架簡介4.文檔模板類CDocTemplateCObjectCCm14文檔類鏈表查閱CPtrList類2.2.1框架簡介文檔類鏈表查閱CPtrList類2.2.1框架簡介15RUNTIME_CLASS分別創(chuàng)建了doc、view和窗口框架類的對象2.2.1框架簡介RUNTIME_CLASS分別創(chuàng)建了doc、view和窗口框165.CFrameWnd類
CFrameWnd類是CWnd類的派生類。它是所有其他框架窗口類的基類,主要用來管理一個窗口。
CFrameWnd類的對象是一個框架窗口,包括邊框、標(biāo)題欄、菜單、最大化按鈕、最小化按鈕和一個激活的視圖。CFrameWnd類支持單文檔界面,對于多文檔界面,使用它的兩個派生類CMDIFrameWnd和CMDIChildWnd。CMDIFrameWnd類用于MDI的主窗口,CMDIChildWnd類用于MDI的子窗口。2.2.1框架簡介5.CFrameWnd類2.2.1框架簡介176.CView類視圖類CView是CWnd類的子類。視圖類及其派生類用于管理框架窗口的客戶區(qū)。
7.CDocument類文檔類CDocument負(fù)責(zé)裝載和維護(hù)文檔。文檔包括應(yīng)用程序的工作成果或環(huán)境設(shè)置數(shù)據(jù)等,可以是程序需要保存的任何內(nèi)容。2.2.1框架簡介6.CView類2.2.1框架簡介18為應(yīng)用程序框架提供客戶區(qū),承擔(dān)用戶數(shù)據(jù)的顯示(同時替代窗口框架接收外界的輸入。因此,該類是程序員編碼最多的地方。派生關(guān)系與文檔類的聯(lián)系紐帶用戶區(qū)的繪制,注意:誰來觸發(fā)1)自動重繪;2)手動視圖更新2.2.1框架簡介為應(yīng)用程序框架提供客戶區(qū),承擔(dān)用戶數(shù)據(jù)的顯示(同時替代窗口框19應(yīng)用程序的文檔類由CDocument派生Serialize()函數(shù):文件操作時響應(yīng)
ReaddatafromfileWritedatatofile序列化/串行化Serialization2.2.1框架簡介應(yīng)用程序的文檔類由CDocument派生Serialize(20各對象之間的關(guān)系2.2.1框架簡介各對象之間的關(guān)系2.2.1框架簡介21CWinApptheApp;theApp.InitInstance系統(tǒng)應(yīng)用程序?qū)ο笪臋n模板文檔對象窗口框架對象視圖對象1.應(yīng)用程序各對象的創(chuàng)建順序2.2.2MFC應(yīng)用程序運(yùn)行流程CWinApptheApp;theApp.InitInst222.2.2MFC應(yīng)用程序運(yùn)行流程2.應(yīng)用程序的執(zhí)行過程啟動:創(chuàng)建應(yīng)用程序?qū)ο髏heApp、調(diào)用應(yīng)用程序類的構(gòu)造函數(shù)初始化對象theApp。應(yīng)用程序框架調(diào)用MFC提供的AfxWinMain()主函數(shù)。AfxWinMain()主函數(shù),首先通過調(diào)用全局函數(shù)AfxGetApp()來獲取theApp的指針pApp;然后通過該指針調(diào)用theApp的成員函數(shù)InitInstance()來初始化應(yīng)用程序。2.2.2MFC應(yīng)用程序運(yùn)行流程2.應(yīng)用程序的執(zhí)行過程23
在應(yīng)用程序的初始化過程InitInstance中,同時還構(gòu)造了文檔模板,產(chǎn)生最初的文檔、視圖和主框架窗口,并生成工具欄和狀態(tài)欄。2.2.2MFC應(yīng)用程序運(yùn)行流程當(dāng)InitInstance()函數(shù)執(zhí)行完畢后,AfxWinMain()函數(shù)將調(diào)用成員函數(shù)
Run(),進(jìn)入消息處理循環(huán);函數(shù)Run()收到WM_QUIT消息。MFC首先調(diào)用CWinApp類的成員函數(shù)ExitInstance();然后調(diào)用靜態(tài)對象的析構(gòu)函數(shù);退出應(yīng)用程序,將控制權(quán)交給操作系統(tǒng)。在應(yīng)用程序的初始化過程InitInstance中,同24WinMain->AfxWinMain應(yīng)用程序初始化消息循環(huán)C:\ProgramFiles\MicrosoftVisualStudio10.0\vc\atlmfc\src\winmain.cpp2.2.2MFC應(yīng)用程序運(yùn)行流程WinMain->AfxWinMain應(yīng)用程序初始化消息252.2.3應(yīng)用程序窗口重疊窗口彈出窗口子窗口2.2.3應(yīng)用程序窗口重疊窗口26
Windows消息主要有3種類型:標(biāo)準(zhǔn)Windows消息、控件消息和命令消息。1).標(biāo)準(zhǔn)Windows消息除WM_COMMAND以外,所有以“WM_”為前綴的消息都是標(biāo)準(zhǔn)Windows消息;由窗口類或視圖類處理;都有默認(rèn)的處理函數(shù),它們在CWnd類中進(jìn)行了預(yù)定義。1.消息的類別及其描述2.2.4消息機(jī)制與消息循環(huán)Windows消息主要有3種類型:標(biāo)準(zhǔn)Windows消27標(biāo)準(zhǔn)的Windows消息又分為3類:鍵盤消息、鼠標(biāo)消息和窗口消息。(1)鍵盤消息鍵盤消息與鍵盤某個鍵的動作相關(guān)聯(lián)。常見的鍵盤消息有以下幾種。WM_KEYDOWN、WM_KEYUP:按下、釋放鍵產(chǎn)生的消息。WM_CHAR:輸入字符時產(chǎn)生的消息。2.2.4消息機(jī)制與消息循環(huán)標(biāo)準(zhǔn)的Windows消息又分為3類:2.2.4消息機(jī)制與消28(2)鼠標(biāo)消息鼠標(biāo)消息涉及到鼠標(biāo)的單擊、雙擊、拖動等。常用的鼠標(biāo)消息有以下幾種。
WM_MOUSEMOVE:鼠標(biāo)移動時產(chǎn)生的消息。
WM_RBUTTONDOWN:鼠標(biāo)右鍵按下時產(chǎn)生的消息。
WM_LBUTTONDOWN:鼠標(biāo)左鍵按下時產(chǎn)生的消息。
WM_LBUTTONDBLCLICK:鼠標(biāo)雙擊時產(chǎn)生的消息。2.2.4消息機(jī)制與消息循環(huán)(2)鼠標(biāo)消息2.2.4消息機(jī)制與消息循環(huán)29(3)窗口消息窗口消息一般與創(chuàng)建窗口、繪制窗口、移動窗口和銷毀窗口等動作有關(guān)。在MFC應(yīng)用程序中,窗口消息是由視圖類、窗口類及它們的派生類處理的。2.2.4消息機(jī)制與消息循環(huán)(3)窗口消息2.2.4消息機(jī)制與消息循環(huán)302).控件消息控件消息是指控件或其他子窗口向父窗口發(fā)送的消息。與其他標(biāo)準(zhǔn)的Windows消息一樣,控件消息也應(yīng)該在視圖類、窗口類中進(jìn)行處理。但是,如果用戶單擊按鈕控件時,發(fā)出的控件通知消息BN_CLICKED將作為命令消息來處理。2.2.4消息機(jī)制與消息循環(huán)2).控件消息2.2.4消息機(jī)制與消息循環(huán)313).命令消息命令消息是由菜單項、工具欄按鈕、快捷鍵等用戶界面對象發(fā)出的WM_COMMAND消息。命令消息與其他消息不同,它可被更廣泛的對象如文檔、文檔模板、應(yīng)用程序?qū)ο?、窗口和視圖等處理。3).命令消息322.MFC消息映射機(jī)制MFC采用消息映射來處理消息;消息映射機(jī)制包括一組消息映射宏,用于把一個Windows消息和其消息處理函數(shù)聯(lián)系起來。所有從CCmdTarget類派生出來的類都能夠擁有自己的消息映射。與MFC消息映射機(jī)制有關(guān)的宏有以下3個:DECLARE_MESSAGE_MAP()BEGIN_MESSAGE_MAP(MyClass,MybaseClass)END_MESSAGE_MAP()2.2.4消息機(jī)制與消息循環(huán)2.MFC消息映射機(jī)制MFC采用消息映射來處理消息;33為了使用消息映射宏:首先在類定義的結(jié)尾用DECLARE_MESSAGE_MAP()宏來聲明使用消息映射,該宏表示在為各個處理函數(shù)所寫的類聲明之后存在消息映射條目,這些函數(shù)是該類的成員函數(shù)。然后在類的實現(xiàn)源文件中用BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()宏來定義消息映射。MFC應(yīng)用程序MESSAG_MAP消息映射的形式如下:2.2.4消息機(jī)制與消息循環(huán)為了使用消息映射宏:2.2.4消息機(jī)制與消息循環(huán)34BEGIN_MESSAGE_MAP(MyClass,MybaseClass)//{{AFX_MSG_MAP(MyClass)//ClassWizard維護(hù)消息映射宏的標(biāo)記
ON_... //MFC預(yù)定義消息映射宏
ON_MESSAGE(message,memberFun)//用戶自定義消息映射宏
//}}AFX_MSG_MAPEND_MESSAGE_MAP()其中,MyClass是擁有消息映射的派生類名,MybaseClass是其基類名。2.2.4消息機(jī)制與消息循環(huán)BEGIN_MESSAGE_MAP(MyClass,Myb352.2.4消息機(jī)制與消息循環(huán)2.2.4消息機(jī)制與消息循環(huán)363自定義消息處理自定義消息處理:定義消息名、分配ID值及完成消息映射。Windows將所有的消息值分為4段:0x0000~0x03FF段:用于Windows系統(tǒng)消息0x0400~0x7FFF段:用于用戶自定義的窗口消息0x8000~0xBFFF段:為Windows保留值0xC000~0xFFFF段:用于應(yīng)用程序的字符串消息。2.2.4消息機(jī)制與消息循環(huán)3自定義消息處理自定義消息處理:定義消息名、分配ID值37
常量WM_USER(為0x0400)與第一個自定義消息值相對應(yīng),用戶必須為自己的消息定義相對于WM_USER的偏移值,利用#define語句直接定義自己的消息,如下所示:
#defineWM_HIDEWM_USER+3//自定義消息WM_USER
也可以調(diào)用窗口消息注冊函數(shù)RegisterWindowMessage()來定義一個Windows消息,由系統(tǒng)分配消息一個整數(shù)值。該函數(shù)原型為:
UINTRegisterWindowMessage(LPCTSTRlpString);
其中參數(shù)lpString是要定義的消息名,調(diào)用成功后將返回該消息的ID值。2.2.4消息機(jī)制與消息循環(huán)常量WM_USER(為0x0400)與第382.2.4消息機(jī)制與消息循環(huán)自定義消息方法的步驟:1、:定義消息
#defineWM_HIDEWM_USER+101
2、在類頭文件的AFX_MSG塊中聲明消息處理函數(shù):
classCMainFrame:publicCFrameWnd{
protected:
//{{AFX_MSG(CMainFrame)
afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct);
afx_msgvoidOnTimer(UINTnIDEvent);
afx_msgLRESULTOnHide(WPARAMwParam,LPARAMlParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
2.2.4消息機(jī)制與消息循環(huán)自定義消息方法的步驟:392.2.4消息機(jī)制與消息循環(huán)3、在類的實現(xiàn)文件中,使用ON_MESSAGE宏指令將消息映射到消息處理表中。
BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_TIMER()
ON_MESSAGE(WM_HIDE,OnProgress)//注意這條語句的后面沒有分號
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
2.2.4消息機(jī)制與消息循環(huán)3、在類的實現(xiàn)文件中,使用ON402.2.4消息機(jī)制與消息循環(huán)4、實現(xiàn)消息處理函數(shù)。該函數(shù)使用WPRAM和LPARAM參數(shù)并返回LRESULT。
LRESULTCMainFrame::OnHide(WPARAMwParam,LPARAMlParam){
MessageBox(_T("我的消息"));return0;
}
2.2.4消息機(jī)制與消息循環(huán)4、實現(xiàn)消息處理函數(shù)。該函數(shù)使412.2.4消息機(jī)制與消息循環(huán)5、在適當(dāng)?shù)臅r候發(fā)送自定義消息,進(jìn)行消息處理。需要注意使用SendMessage還是PostMessage進(jìn)行處理:SendMessage是消息處理完畢后再返回;而PostMessage則是把消息放到消息隊列后立即返回。
SendMessage(theApp.GetMainWnd()->GetSafeHwnd(),WM_PROGRESS,0L,0L);如果用戶需要整個系統(tǒng)唯一的消息,可以調(diào)用SDK函數(shù)RegisterWindowMessage并使用ON_REGISTER_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步驟同上。2.2.4消息機(jī)制與消息循環(huán)5、在適當(dāng)?shù)臅r候發(fā)送自定義消息422.2.4消息機(jī)制與消息循環(huán)SendMessage函數(shù)原型LRESULTSendMessage(HWNDhWnd,UINTMsg,WPARAMwParam,LPARAMlParam)hWnd:其窗口程序?qū)⒔邮障⒌拇翱诘木浔?。Msg:指定被發(fā)送的消息號。wParam:指定附加的消息特定信息。lParam:指定附加的消息特定信息。返回值:返回值指定消息處理的結(jié)果,依賴于所發(fā)送的消息。2.2.4消息機(jī)制與消息循環(huán)SendMessage函數(shù)原432.2.4消息機(jī)制與消息循環(huán)演示并編寫一個自定義消息應(yīng)用程序,添加WM_PROGRESS消息。當(dāng)程序運(yùn)行時,則調(diào)用自定義消息處理函數(shù),輸出文本“自定義消息處理函數(shù)被調(diào)用!”。2.2.4消息機(jī)制與消息循環(huán)演示并編寫一個自定義消息應(yīng)用程44消息傳遞標(biāo)準(zhǔn)Windows消息傳遞直線上溯命令消息傳遞迂回上溯消息傳遞標(biāo)準(zhǔn)Windows消息傳遞45第2章MFC應(yīng)用程序課件46消息傳遞對于WM_COMMAND消息。框架窗口實際上是大多數(shù)WM_COMMAND消息的接受者,但WM_COMMAND消息還可以在視圖、文檔,甚至應(yīng)用程序類中被處理。消息傳遞對于WM_COMMAND消息??蚣艽翱趯嶋H上是大多數(shù)47
文檔/視圖體系結(jié)構(gòu)是MFC應(yīng)用程序框架結(jié)構(gòu)的基石,它定義了一種程序結(jié)構(gòu),這種結(jié)構(gòu)利用文檔對象保存應(yīng)用程序的數(shù)據(jù),依靠視圖對象控制視圖顯示數(shù)據(jù),文檔與視圖的關(guān)系是一對多的關(guān)系,也就是說,文檔中的數(shù)據(jù)可以以不同的方式顯示。2.3文檔與視圖文檔/視圖體系結(jié)構(gòu)是MFC應(yīng)用程序框架結(jié)構(gòu)的基石,它482.3文檔與視圖文檔負(fù)責(zé)數(shù)據(jù)讀取、存取以及其它的操作。CDocument類本身只是一個空殼,我們需要從它派生一個數(shù)據(jù)自已的類,并在類中聲明我們需要的變量,用以承載數(shù)據(jù)。CDocument類已經(jīng)為我們做好了一些重要的函數(shù),其中包括與View類的”溝通”函數(shù)、文檔存取等函數(shù)。2.3文檔與視圖文檔負(fù)責(zé)數(shù)據(jù)讀取、存取以及其它的操作。49表主要的CDocument操作2.3文檔與視圖表主要的CDocument操作2.3文檔與視圖50表主要的CDocument可覆蓋函數(shù)2.3文檔與視圖表主要的CDocument可覆蓋函數(shù)2.3文檔與視圖51
用戶可通過函數(shù)GetFirstViewPosition()和GetNextView()得到和文檔關(guān)聯(lián)的視圖的指針,代碼如下:POSITIONpos=GetFirstViewPosition();//得到視圖列表頭的位置While(pos!=NULL){CView*pView=GetNextView(pos); //獲得視圖列表中的視圖指針
…}
2.3文檔與視圖用戶可通過函數(shù)GetFirstViewPos522.3文檔與視圖視圖類有兩個用途:提供文檔的可視化表示將用戶輸入(特別是鼠標(biāo)和鍵盤消息)轉(zhuǎn)換為操作文檔數(shù)據(jù)的命令。MFC還包含了一組CView類的派生類,用來完成不同功能的視圖。2.3文檔與視圖視圖類有兩個用途:53CEditView:簡單的文本編輯器,類似NotepadCListView:基于列表的視圖,類似文件夾瀏覽CTreeView:基于樹狀控件的視圖,類似文件瀏覽左側(cè)的樹狀結(jié)構(gòu)CRichEditView:支持多種字體、OLE和RTF格式的高級編輯器CScrollView:支持滾動條的視圖CFormView:窗體視圖,支持在上邊使用對話框控件CRecordView:連接到ODBC數(shù)據(jù)庫的視圖CDaoRecordView:連接到DAO數(shù)據(jù)庫的視圖CView的子類2.3文檔與視圖CEditView:簡單的文本編輯器,類似NotepadCV542.3文檔與視圖一個文檔可以具有與其聯(lián)系的多個視圖,而一個視圖只能屬于一個文檔。CView類保存了m_pDocument數(shù)據(jù)成員,并將該指針提供給視圖的GetDocument成員函數(shù)使用,用以標(biāo)識出視圖類所屬的文檔。AppWizard為視圖類生成源代碼時,它覆蓋了基類的GetDocument函數(shù)。其強(qiáng)制轉(zhuǎn)換了m_pDocument為派生類指針。2.3文檔與視圖一個文檔可以具有與其聯(lián)系的多個視圖,而一個552.3文檔與視圖表主要的CView可覆蓋函數(shù)2.3文檔與視圖表主要的CView可覆蓋函數(shù)562.3文檔與視圖
OnInitialUpdate與OnUpdate在SDI中,視圖與文檔一樣,只構(gòu)造一次,重復(fù)使用。在SDI中,每當(dāng)文檔被打開或創(chuàng)建時,都要調(diào)用視圖的OnInitialUpdate()OnInitialUpdate()默認(rèn)要調(diào)用OnUpdate()OnUpdate()的默認(rèn)操作是使視圖客戶區(qū)無效并執(zhí)行重繪。在CView類的派生類中,如果重寫了OnInitialUpdate(),需要要調(diào)用CView::OnInitialUpdate(),否則新文檔被打開或創(chuàng)建時不會被更新。2.3文檔與視圖OnInitialUpdate與OnUp572.3文檔與視圖CView::OnDraw何時調(diào)用:在WM_PAINT到來時(當(dāng)視窗顯示區(qū)域的一部分顯示內(nèi)容或者全部變?yōu)椤笩o效」,以致于必須「更新畫面」時,將由這個訊息通知程式。)在文檔被打印時什么是CDCDC:DeviceContext,設(shè)備描述表。在WM_PAINT到來時,DC指向屏幕設(shè)備在文檔被打印時,DC指向打印機(jī)設(shè)備2.3文檔與視圖CView::OnDraw何時調(diào)用:582.3文檔與視圖OnPaint()與OnDrawWM_PAINT到來時會調(diào)用OnPaint()函數(shù),此函數(shù)在CView中被定義。WM_PRINT到來時會調(diào)用OnPrint()函數(shù),此函數(shù)在CView中被定義。兩個函數(shù)都調(diào)用了OnDraw(),并傳送不同的DC,分別代表屏幕設(shè)備與打印設(shè)備。2.3文檔與視圖OnPaint()與OnDraw592.4工具欄與狀態(tài)欄2.4工具欄與狀態(tài)欄602.4工具欄與狀態(tài)欄工具欄簡介工具欄對象是一種窗口,工具欄中的所有按鈕的圖形被存儲在一個位圖中,而該位圖被定義在應(yīng)用程序的資源文件中。工具欄按鈕與菜單選項是類似的。單擊工具欄按鈕將產(chǎn)生相應(yīng)的命令,應(yīng)用程序通過提供消息處理函數(shù)來處理產(chǎn)生的命令。如果工具欄的某個按鈕沒有COMMAND或UPDATE_COMMAND_UI處理函數(shù),那么框架自動使該按鈕無效。工具欄和狀態(tài)欄一般作為框架窗口類的成員變量聲明,在創(chuàng)建框架窗口時自動創(chuàng)建它們,在銷毀框架窗口時自動銷毀所創(chuàng)建的控件欄對象。使用AppWizard創(chuàng)建應(yīng)用程序基本框架時,可以得到初始的工具欄和狀態(tài)欄。2.4工具欄與狀態(tài)欄工具欄簡介612.4.1工具欄系統(tǒng)默認(rèn)生成的工具欄資源為IDR_MAINFRAME,可以在此基礎(chǔ)上設(shè)計自己的工具欄,刪除或添加一些按鈕。需要為工具欄按鈕提供ID號,一般取某個菜單項的ID。2.4.1工具欄系統(tǒng)默認(rèn)生成的工具欄資源為IDR_MAIN622.4.1工具欄工具欄的創(chuàng)建:(1)創(chuàng)建工具欄資源(2)構(gòu)造CToolBar對象,即在邊框窗口類的聲明中添加類似以下的聲明:CToolBarm_wndToolBar;(3)調(diào)用Create或CreateEx創(chuàng)建工具欄,然后調(diào)用LoadToolBar裝載工具欄資源。2.4.1工具欄工具欄的創(chuàng)建:63工具欄的創(chuàng)建intCMainFrame::OnCreate( LPCREATESTRUCTlpCreateStruct){ …… if(!m_wndToolBar.CreateEx(this,TBSTYLE_FLAT, WS_CHILD|WS_VISIBLE|CBRS_TOP |CBRS_GRIPPER|CBRS_TOOLTIPS |CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||
!m_wndToolBar.LoadToolBar( IDR_MAINFRAME)) { TRACE0("Failedtocreatetoolbar\n"); return-1;//failtocreate }CToolBarm_wndToolBar;工具欄的創(chuàng)建intCMainFrame::OnCreate64工具欄的??縤ntCMainFrame::OnCreate( LPCREATESTRUCTlpCreateStruct){ ……
m_wndToolBar.EnableDocking( CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar);}工具欄的??縤ntCMainFrame::OnCreate65調(diào)用Create時還可以指定工具欄的風(fēng)格,默認(rèn)風(fēng)格是WS_CHILD|WS_VISIBLE|CBRS_TOP。①CBRS_TOP工具欄在邊框窗口頂部②CBRS_BOTTOM工具欄在邊框窗口底部③CBRS_NOALIGN邊框窗口改變大小時,工具欄不重定位④CBRS_TOOLTIPS使工具提示有效。⑤CBRS_SIZE_DYNAMIC工具欄尺寸可變。⑥CBRS_SIZE_FIXED工具欄尺寸固定。⑦CBRS_FLOATLNG工具欄是浮動的。⑧CBRS_FLYBY在狀態(tài)欄中顯示按鈕的有關(guān)信息。⑨CBRS_HIDE_INPLANE不顯示工具欄。工具欄的創(chuàng)建調(diào)用Create時還可以指定工具欄的風(fēng)格,默認(rèn)風(fēng)格是WS_C66??糠绞紺ToolBar的EnableDocking:設(shè)置工具欄能停靠在何處?CBRS_ALIGN_ANYCBRS_ALIGN_TOP、CBRS_ALIGN_LEFTCBRS_ALIGN_RIGHT、CBRS_ALIGN_BOTTOMCMainFrame類的EnableDocking:設(shè)置能讓工具欄??吭诤翁帲空{(diào)用DockControlBar,完成工具欄停靠,具體效果由上面的兩個EnableDocking共同決定。??糠绞紺ToolBar的EnableDocking:設(shè)置工672.4.1工具欄演示在系統(tǒng)提供的工具欄上添加并編輯新的工具欄按鈕,產(chǎn)生消息響應(yīng)。2.4.1工具欄演示在系統(tǒng)提供的工具欄上添加并編輯新的工具682.4.1工具欄創(chuàng)建新工具欄資源定義工具欄對象MainFrm.h中protected:
CStatusBarm_wndStatusBar;
CToolBarm_wndToolBar;
CToolBarm_wndTool1;系統(tǒng)的工具欄第二個工具欄2.4.1工具欄創(chuàng)建新工具欄資源系統(tǒng)的工具欄第二個工具欄69多工具欄實現(xiàn)-創(chuàng)建intCMainFrame::OnCreate(……){ ……
if(!m_wndToolBar.CreateEx(……)|| !m_wndToolBar.LoadToolBar(IDR_MAINFRAME)) { TRACE0("Failedtocreatetoolbar\n"); return-1; } if(!m_wndTool1.CreateEx(……)|| !m_wndTool1.LoadToolBar(IDR_TOOL)) { TRACE0("Failedtocreatetoolbar\n"); return-1;//failtocreate }……多工具欄實現(xiàn)-創(chuàng)建intCMainFrame::OnCre70多工具欄實現(xiàn)-??縤ntCMainFrame::OnCreate(……){ ……
m_wndToolBar.EnableDocking( CBRS_ALIGN_ANY);
m_wndTool1.EnableDocking( CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar); DockControlBar(&m_wndTool1); return0;}只需調(diào)用一次多工具欄實現(xiàn)-??縤ntCMainFrame::OnCre71隱藏和顯示工具欄ShowControlBar(&m_wndTool1,
true,false);ShowControlBar(&m_wndToolBar, false,false);true顯示false隱藏是否立即顯示,false立即顯示隱藏和顯示工具欄ShowControlBar(&m_wndT722.4.2狀態(tài)欄狀態(tài)欄可以顯示與上下文有關(guān)的工具欄按鈕和菜單項的幫助信息。在Windows中已經(jīng)變的非常普遍。2.4.2狀態(tài)欄狀態(tài)欄可以顯示與上下文有關(guān)的工具欄按鈕和732.4.2狀態(tài)欄
狀態(tài)欄的定義用AppWizard創(chuàng)建的SDI或MDI應(yīng)用程序框架中,有一個靜態(tài)的indicator數(shù)組,它是在MainFrm.cpp文件中定義的,被MFC用作狀態(tài)欄的定義。StaticUINTindicators[]={ID_SEPARATOR,ID_INDICATOR_CAPS,ID_INDICATOR_NUM,ID_INDICATOR_SCRL,}indicators數(shù)組的定義2.4.2狀態(tài)欄狀態(tài)欄的定義StaticUINT742.4.2狀態(tài)欄提示符從左到右水平排列在狀態(tài)欄中,往數(shù)組中添加更多的標(biāo)識符就可以在狀態(tài)欄增加更多的提示符,可以根據(jù)需要動態(tài)改變提示符的大小,通過增加ID_SEPARATOR元素還可增加分隔符。最左邊的提示符(位置0)通常用作消息區(qū),可以在其中顯示命令提示之類的文本字符串。創(chuàng)建狀態(tài)欄創(chuàng)建狀態(tài)欄的步驟:(1)構(gòu)造CStatusBar對象。(2)調(diào)用Create創(chuàng)建狀態(tài)欄并將其與CStatusBar對象聯(lián)結(jié)。(3)調(diào)用成員函數(shù)SetIndicators,設(shè)置指示符的標(biāo)識符為數(shù)組中相應(yīng)元素指定的值,裝載每個標(biāo)識符指定的字符串資源并將字符串設(shè)為提示符文本。2.4.2狀態(tài)欄提示符從左到右水平排列在狀態(tài)欄中,往數(shù)組75狀態(tài)欄的創(chuàng)建intCMainFrame::OnCreate( LPCREATESTRUCTlpCreateStruct){ …… if(!m_wndStatusBar.Create(this)|| !m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT))) { TRACE0("Failedtocreatestatusbar\n"); return-1;//failtocreate }CStatusBarm_wndStatusBar;狀態(tài)欄的創(chuàng)建intCMainFrame::OnCreate763、自定義狀態(tài)欄窗格每個窗格指定一個ID號,同時還要創(chuàng)建一個相同ID號的字符串資源。窗格的初始大小等于關(guān)聯(lián)字符串的長度。3、自定義狀態(tài)欄窗格每個窗格指定一個ID號,同時還要創(chuàng)建一個77顯示鼠標(biāo)位置-----插入窗格staticUINTindicators[]={ ID_SEPARATOR,
IDS_MOUSEXY, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL,};插入窗格的ID顯示鼠標(biāo)位置-----插入窗格staticUINTind78顯示鼠標(biāo)位置-----輸出內(nèi)容映射WM_MOUSEMOVE到視圖類 CStringstr;
CMainFrame*pFrame=(CMainFrame*) AfxGetApp()->m_pMainWnd;
CMFCStatusBar*pStatus= &pFrame->m_wndStatusBar;
if(pStatus) { str.Format("X=%d,Y=%d", point.x,point.y);
pStatus->SetPaneText(1,str);
}
將該成員修改為public修飾顯示鼠標(biāo)位置-----輸出內(nèi)容映射WM_MOUSEMOVE到79CStatusBar::Create()函數(shù)用于創(chuàng)建一個Windows狀態(tài)欄(子窗口),并將其連接到CStatusBar對象上,同時設(shè)置初始字體和狀態(tài)欄的高度。該函數(shù)原型為:
BOOLCreate(CWnd*pParentWnd,DWORDdwStyle=WS_CHILD|WS_VISIBLE|CBRS_BOTTOM,UINTnID=AFX_IDW_STATUS_BAR);其中參數(shù)pParentWnd為指向父窗口CWnd對象的指針;dwStyle指定狀態(tài)欄的風(fēng)格,除了標(biāo)準(zhǔn)的Windows風(fēng)格外,還可以是CBRS_TOP(狀態(tài)欄位于框架窗口的頂部)、CBRS_BOTTOM(狀態(tài)欄位于框架窗口的底部)、CBRS_NOALIGN(當(dāng)父窗口改變時,狀態(tài)欄不被重新定位);參數(shù)nID表示該狀態(tài)欄的子窗口ID。如果函數(shù)調(diào)用成功,則返回一個非0值,否則返回0。CStatusBar常用成員CStatusBar::Create()函數(shù)CStatus80SetIndIcators()函數(shù)函數(shù)SetIndIcators()用于設(shè)置指示器的ID,并裝入由每個ID指定的字符串資源,然后將指示器的文字設(shè)置為該字符串,該函數(shù)的原型為:BOOLSetIndIcators(constUINT*lpIDArray,intnIDCount);參數(shù)lpIDArray為指向ID數(shù)組的指針,nIDCount為lpIDArray所指向的數(shù)組元素的個數(shù)。該函數(shù)按照數(shù)組lpIDArray中的對應(yīng)元素的值設(shè)定標(biāo)識符ID的值,加載由每個ID所指定的字符串資源,并把字符串設(shè)置為標(biāo)識符的文字。如果該函數(shù)操作成功,在返回一個非0值,否則返回0。CStatusBar常用成員SetIndIcators()函數(shù)CStatusBar常用成81SetPaneInfo()函數(shù)函數(shù)SetPaneInfo()用于設(shè)置給定索引值的指示器ID、風(fēng)格和寬度。它的原型為:voidSetPaneInfo(intnIndex,UINTnID,UINTnStyle,intcxWidth);該函數(shù)給標(biāo)識符欄設(shè)置一個新的ID、風(fēng)格和寬度。可供選擇的標(biāo)識符風(fēng)格有:
CStatusBar常用成員SetPaneInfo()函數(shù)CStatusBar常用成員82SetPaneText()函數(shù)函數(shù)SetPaneText()用于設(shè)置給定索引值的指示器的文本。它的原型為:BOOLSetPaneText(intnIndex,LPCTSTRlpszNewText,BOOLbUpdate=TRUE);該函數(shù)用lpszNewText所指向的字符串來設(shè)置狀態(tài)欄的文字。CStatusBar常用成員SetPaneText()函數(shù)CStatusBar常用成員832.5-2.7MFC新功能邊演示邊講解2.5-2.7MFC新功能邊演示邊講解84當(dāng)前位置 被訪問的位置 訪問方法文檔 視圖 GetFirstViewPosition GetNextView文檔 模板 GetDocTemplate視圖 文檔 GetDocument視圖 框架 GetParentFrame框架 視圖 GetActiveView框架 文檔 GetActiveDocumentMDI主框架 MDI子框架 MDIGetActiveMDI子框架 MDI主框架 GetParentFrame任何位置 應(yīng)用程序 AfxGetApp任何位置 主框架 AfxGetMainWndDoc/View結(jié)構(gòu)的五個基本成員經(jīng)常需要互相訪問,假設(shè)某個視圖想要獲得文檔,或某個框架需要獲得活動視圖,可以通過此表提供的方法進(jìn)行解決
2.8應(yīng)用程序框架類對象分析當(dāng)前位置 被訪問的位置 訪問方法Doc/View結(jié)構(gòu)的五個基85第2章MFC應(yīng)用程序課件86謝謝!87謝謝!878888主要內(nèi)容2.1用MFC向?qū)蓱?yīng)用程序2.2應(yīng)用程序框架分析2.3文檔與視圖2.4工具欄和狀態(tài)欄2.5-2.7MFC新功能2.8應(yīng)用程序框架類對象分析主要內(nèi)容2.1用MFC向?qū)蓱?yīng)用程序892.1用MFC向?qū)蓱?yīng)用程序用AppWizard應(yīng)用程序向?qū)蒑FC應(yīng)用程序。單文檔應(yīng)用程序多文檔應(yīng)用程序?qū)υ捒驊?yīng)用程序用ClassWizard工具生成派生類、定義處理消息、管理對話框、定制MFC成員函數(shù)。2.1用MFC向?qū)蓱?yīng)用程序用AppWizard應(yīng)用程序902.1用MFC向?qū)蓱?yīng)用程序演示MFC向?qū)沙S玫娜N應(yīng)用程序。2.1用MFC向?qū)蓱?yīng)用程序演示MFC向?qū)沙S玫娜N912.1.2生成的應(yīng)用程序類型基于對話框的應(yīng)用程序CWinApp、CDialog類2.1.2生成的應(yīng)用程序類型基于對話框的應(yīng)用程序922.1.2生成的應(yīng)用程序類型單文檔應(yīng)用程序CWinApp、CFrameWnd、CView、CDocument2.1.2生成的應(yīng)用程序類型單文檔應(yīng)用程序932.1.2生成的應(yīng)用程序類型多文檔應(yīng)用程序CWinApp、CMDIFrameWnd、CMDIChildWnd、CView、CDocument2.1.2生成的應(yīng)用程序類型多文檔應(yīng)用程序942.1.3向?qū)晒こ涛募喗轭^文件與實現(xiàn)文件各個類的*.h和*.cppResource.h:定義工程中所有資源標(biāo)識符,給資源ID分配一個整數(shù)值。StdAfx.h和StdAfx.cpp:用于建立一個預(yù)編譯的頭文件。資源文件*.rc和*.rc2:是程序所使用的所有Windows資源的列表。*.ico:應(yīng)用程序的圖標(biāo)所使用的圖標(biāo)文件。*Doc.ico:應(yīng)用程序的文檔圖標(biāo)文件。文檔圖標(biāo)一般顯示在多文檔程序界面上。Toolbar.bmp:工具欄按鈕的位圖文件。2.1.3向?qū)晒こ涛募喗轭^文件與實現(xiàn)文件952.1.3向?qū)晒こ涛募喗榻鉀Q方案文件和工程文件*.sln:保存當(dāng)前解決方案所包含的工程的信息。*.vcxproj:包含當(dāng)前工程的設(shè)置、工程中的文件等信息。2.1.3向?qū)晒こ涛募喗榻鉀Q方案文件和工程文件96MFC應(yīng)用程序框架結(jié)構(gòu)類的繼承關(guān)系:2.2應(yīng)用程序框架分析MFC應(yīng)用程序框架結(jié)構(gòu)類的繼承關(guān)系:2.2應(yīng)用程序框架分972.2.1框架簡介1.CObject類CObject是MFC類庫的根類,它幾乎描述了所有MFC類的一些公共特性,并且給所有由它派生出的類提供了3種重要特性,即:串行化支持、運(yùn)行時類信息支持以及診斷和調(diào)試支持。2.CCmdTarget類命令類CCmdTarget是CObject的子類,它是MFC庫中所有具有消息映射屬性的類的公共基類。從CCmdTarget派生的類能在程序運(yùn)行時動態(tài)創(chuàng)建對象和處理命令消息。
2.2.1框架簡介1.CObject類983.CWinApp類CObjectCCmdTargetCWinThreadCWinApp應(yīng)用程序類在類族中的位置WinMain函數(shù)的函數(shù)體的封裝支持線程管理2.2.1框架簡介
應(yīng)用程序類CWinApp是CWinThread的子類,封裝了初始化、運(yùn)行、終止應(yīng)用程序的代碼。可以由此派生自己的應(yīng)用類。3.CWinApp類CObjectCCmdTargetCW99指向框架窗口的指針m_pMainWnd2.2.1框架簡介指向框架窗口的指針m_pMainWnd2.2.1框架簡介100CWinApp類中定義了三個可以重寫的虛函數(shù):InitInstance()--程序創(chuàng)建和顯示窗口。程序設(shè)計時,必須以CWinApp類為基類派生自己的應(yīng)用程序類,并根據(jù)情況重寫InitInstance()。Run(),處理消息循環(huán)。ExitInstance()程序結(jié)束時做收尾工作。2.2.1框架簡介CWinApp類中定義了三個可以重寫的虛函數(shù):2.2.11014.文檔模板類CDocTemplateCObjectCCmdTargetCDocTemplateCSingleDocTemplateCMultiDocTemplate單一的文檔指針2.2.1框架簡介4.文檔模板類CDocTemplateCObjectCCm102文檔類鏈表查閱CPtrList類2.2.1框架簡介文檔類鏈表查閱CPtrList類2.2.1框架簡介103RUNTIME_CLASS分別創(chuàng)建了doc、view和窗口框架類的對象2.2.1框架簡介RUNTIME_CLASS分別創(chuàng)建了doc、view和窗口框1045.CFrameWnd類
CFrameWnd類是CWnd類的派生類。它是所有其他框架窗口類的基類,主要用來管理一個窗口。
CFrameWnd類的對象是一個框架窗口,包括邊框、標(biāo)題欄、菜單、最大化按鈕、最小化按鈕和一個激活的視圖。CFrameWnd類支持單文檔界面,對于多文檔界面,使用它的兩個派生類CMDIFrameWnd和CMDIChildWnd。CMDIFrameWnd類用于MDI的主窗口,CMDIChildWnd類用于MDI的子窗口。2.2.1框架簡介5.CFrameWnd類2.2.1框架簡介1056.CView類視圖類CView是CWnd類的子類。視圖類及其派生類用于管理框架窗口的客戶區(qū)。
7.CDocument類文檔類CDocument負(fù)責(zé)裝載和維護(hù)文檔。文檔包括應(yīng)用程序的工作成果或環(huán)境設(shè)置數(shù)據(jù)等,可以是程序需要保存的任何內(nèi)容。2.2.1框架簡介6.CView類2.2.1框架簡介106為應(yīng)用程序框架提供客戶區(qū),承擔(dān)用戶數(shù)據(jù)的顯示(同時替代窗口框架接收外界的輸入。因此,該類是程序員編碼最多的地方。派生關(guān)系與文檔類的聯(lián)系紐帶用戶區(qū)的繪制,注意:誰來觸發(fā)1)自動重繪;2)手動視圖更新2.2.1框架簡介為應(yīng)用程序框架提供客戶區(qū),承擔(dān)用戶數(shù)據(jù)的顯示(同時替代窗口框107應(yīng)用程序的文檔類由CDocument派生Serialize()函數(shù):文件操作時響應(yīng)
ReaddatafromfileWritedatatofile序列化/串行化Serialization2.2.1框架簡介應(yīng)用程序的文檔類由CDocument派生Serialize(108各對象之間的關(guān)系2.2.1框架簡介各對象之間的關(guān)系2.2.1框架簡介109CWinApptheApp;theApp.InitInstance系統(tǒng)應(yīng)用程序?qū)ο笪臋n模板文檔對象窗口框架對象視圖對象1.應(yīng)用程序各對象的創(chuàng)建順序2.2.2MFC應(yīng)用程序運(yùn)行流程CWinApptheApp;theApp.InitInst1102.2.2MFC應(yīng)用程序運(yùn)行流程2.應(yīng)用程序的執(zhí)行過程啟動:創(chuàng)建應(yīng)用程序?qū)ο髏heApp、調(diào)用應(yīng)用程序類的構(gòu)造函數(shù)初始化對象theApp。應(yīng)用程序框架調(diào)用MFC提供的AfxWinMain()主函數(shù)。AfxWinMain()主函數(shù),首先通過調(diào)用全局函數(shù)AfxGetApp()來獲取theApp的指針pApp;然后通過該指針調(diào)用theApp的成員函數(shù)InitInstance()來初始化應(yīng)用程序。2.2.2MFC應(yīng)用程序運(yùn)行流程2.應(yīng)用程序的執(zhí)行過程111
在應(yīng)用程序的初始化過程InitInstance中,同時還構(gòu)造了文檔模板,產(chǎn)生最初的文檔、視圖和主框架窗口,并生成工具欄和狀態(tài)欄。2.2.2MFC應(yīng)用程序運(yùn)行流程當(dāng)InitInstance()函數(shù)執(zhí)行完畢后,AfxWinMain()函數(shù)將調(diào)用成員函數(shù)
Run(),進(jìn)入消息處理循環(huán);函數(shù)Run()收到WM_QUIT消息。MFC首先調(diào)用CWinApp類的成員函數(shù)ExitInstance();然后調(diào)用靜態(tài)對象的析構(gòu)函數(shù);退出應(yīng)用程序,將控制權(quán)交給操作系統(tǒng)。在應(yīng)用程序的初始化過程InitInstance中,同112WinMain->AfxWinMain應(yīng)用程序初始化消息循環(huán)C:\ProgramFiles\MicrosoftVisualStudio10.0\vc\atlmfc\src\winmain.cpp2.2.2MFC應(yīng)用程序運(yùn)行流程WinMain->AfxWinMain應(yīng)用程序初始化消息1132.2.3應(yīng)用程序窗口重疊窗口彈出窗口子窗口2.2.3應(yīng)用程序窗口重疊窗口114
Windows消息主要有3種類型:標(biāo)準(zhǔn)Windows消息、控件消息和命令消息。1).標(biāo)準(zhǔn)Windows消息除WM_COMMAND以外,所有以“WM_”為前綴的消息都是標(biāo)準(zhǔn)Windows消息;由窗口類或視圖類處理;都有默認(rèn)的處理函數(shù),它們在CWnd類中進(jìn)行了預(yù)定義。1.消息的類別及其描述2.2.4消息機(jī)制與消息循環(huán)Windows消息主要有3種類型:標(biāo)準(zhǔn)Windows消115標(biāo)準(zhǔn)的Windows消息又分為3類:鍵盤消息、鼠標(biāo)消息和窗口消息。(1)鍵盤消息鍵盤消息與鍵盤某個鍵的動作相關(guān)聯(lián)。常見的鍵盤消息有以下幾種。WM_KEYDOWN、WM_KEYUP:按下、釋放鍵產(chǎn)生的消息。WM_CHAR:輸入字符時產(chǎn)生的消息。2.2.4消息機(jī)制與消息循環(huán)標(biāo)準(zhǔn)的Windows消息又分為3類:2.2.4消息機(jī)制與消116(2)鼠標(biāo)消息鼠標(biāo)消息涉及到鼠標(biāo)的單擊、雙擊、拖動等。常用的鼠標(biāo)消息有以下幾種。
WM_MOUSEMOVE:鼠標(biāo)移動時產(chǎn)生的消息。
WM_RBUTTONDOWN:鼠標(biāo)右鍵按下時產(chǎn)生的消息。
WM_LBUTTONDOWN:鼠標(biāo)左鍵按下時產(chǎn)生的消息。
WM_LBUTTONDBLCLICK:鼠標(biāo)雙擊時產(chǎn)生的消息。2.2.4消息機(jī)制與消息循環(huán)(2)鼠標(biāo)消息2.2.4消息機(jī)制與消息循環(huán)117(3)窗口消息窗口消息一般與創(chuàng)建窗口、繪制窗口、移動窗口和銷毀窗口等動作有關(guān)。在MFC應(yīng)用程序中,窗口消息是由視圖類、窗口類及它們的派生類處理的。2.2.4消息機(jī)制與消息循環(huán)(3)窗口消息2.2.4消息機(jī)制與消息循環(huán)1182).控件消息控件消息是指控件或其他子窗口向父窗口發(fā)送的消息。與其他標(biāo)準(zhǔn)的Windows消息一樣,控件消息也應(yīng)該在視圖類、窗口類中進(jìn)行處理。但是,如果用戶單擊按鈕控件時,發(fā)出的控件通知消息BN_CLICKED將作為命令消息來處理。2.2.4消息機(jī)制與消息循環(huán)2).控件消息2.2.4消息機(jī)制與消息循環(huán)1193).命令消息命令消息是由菜單項、工具欄按鈕、快捷鍵等用戶界面對象發(fā)出的WM_COMMAND消息。命令消息與其他消息不同,它可被更廣泛的對象如文檔、文檔模板、應(yīng)用程序?qū)ο蟆⒋翱诤鸵晥D等處理。3).命令消息1202.MFC消息映射機(jī)制MFC采用消息映射來處理消息;消息映射機(jī)制包括一組消息映射宏,用于把一個Windows消息和其消息處理函數(shù)聯(lián)系起來。所有從CCmdTarget類派生出來的類都能夠擁有自己的消息映射。與MFC消息映射機(jī)制有關(guān)的宏有以下3個:DECLARE_MESSAGE_MAP()BEGIN_MESSAGE_MAP(MyClass,MybaseClass)END_MESSAGE_MAP()2.2.4消息機(jī)制與消息循環(huán)2.MFC消息映射機(jī)制MFC采用消息映射來處理消息;121為了使用消息映射宏:首先在類定義的結(jié)尾用DECLARE_MESSAGE_MAP()宏來聲明使用消息映射,該宏表示在為各個處理函數(shù)所寫的類聲明之后存在消息映射條目,這些函數(shù)是該類的成員函數(shù)。然后在類的實現(xiàn)源文件中用BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()宏來定義消息映射。MFC應(yīng)用程序MESSAG_MAP消息映射的形式如下:2.2.4消息機(jī)制與消息循環(huán)為了使用消息映射宏:2.2.4消息機(jī)制與消息循環(huán)122BEGIN_MESSAGE_MAP(MyClass,MybaseClass)//{{AFX_MSG_MAP(MyClass)//ClassWizard維護(hù)消息映射宏的標(biāo)記
ON_... //MFC預(yù)定義消息映射宏
ON_MESSAGE(message,memberFun)//用戶自定義消息映射宏
//}}AFX_MSG_MAPEND_MESSAGE_MAP()其中,MyClass是擁有消息映射的派生類名,MybaseClass是其基類名。2.2.4消息機(jī)制與消息循環(huán)BEGIN_MESSAGE_MAP(MyClass,Myb1232.2.4消息機(jī)制與消息循環(huán)2.2.4消息機(jī)制與消息循環(huán)1243自定義消息處理自定義消息處理:定義消息名、分配ID值及完成消息映射。Windows將所有的消息值分為4段:0x0000~0x03FF段:用于Windows系統(tǒng)消息0x0400~0x7FFF段:用于用戶自定義的窗口消息0x8000~0xBFFF段:為Windows保留值0xC000~0xFFFF段:用于應(yīng)用程序的字符串消息。2.2.4消息機(jī)制與消息循環(huán)3自定義消息處理自定義消息處理:定義消息名、分配ID值125
常量WM_USER(為0x0400)與第一個自定義消息值相對應(yīng),用戶必須為自己的消息定義相對于WM_USER的偏移值,利用#define語句直接定義自己的消息,如下所示:
#defineWM_HIDEWM_USER+3//自定義消息WM_USER
也可以調(diào)用窗口消息注冊函數(shù)RegisterWindowMessage()來定義一個Windows消息,由系統(tǒng)分配消息一個整數(shù)值。該函數(shù)原型為:
UINTRegisterWindowMessage(LPCTSTRlpString);
其中參數(shù)lpString是要定義的消息名,調(diào)用成功后將返回該消息的ID值。2.2.4消息機(jī)制與消息循環(huán)常量WM_USER(為0x0400)與第1262.2.4消息機(jī)制與消息循環(huán)自定義消息方法的步驟:1、:定義消息
#defineWM_HIDEWM_USER+101
2、在類頭文件的AFX_MSG塊中聲明消息處理函數(shù):
classCMainFrame:publicCFrameWnd{
protected:
//{{AFX_MSG(CMainFrame)
afx_msgintOnCreate(LPCREATESTRUCTlpCreateStruct);
afx_msgvoidOnTimer(UINTnIDEvent);
afx_msgLRESULTOnHide(WPARAMwParam,LPARAMlParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
2.2.4消息機(jī)制與消息循環(huán)自定義消息方法的步驟:1272.2.4消息機(jī)制與消息循環(huán)3、在類的實現(xiàn)文件中,使用ON_MESSAGE宏指令將消息映射到消息處理表中。
BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_TIMER()
ON_MESSAGE(WM_HIDE,OnProgress)//注意這條語句的后面沒有分號
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
2.2.4消息機(jī)制與消息循環(huán)3、在類的實現(xiàn)文件中,使用ON1282.2.4消息機(jī)制與消息循環(huán)4、實現(xiàn)消息處理函數(shù)。該函數(shù)使用WPRAM和LPARAM參數(shù)并返回LRESULT。
LRESULTCMainFrame::OnHide(WPARAMwParam,LPARAMlParam){
MessageBox(_T("我的消息"));return0;
}
2.2.4消息機(jī)制與消息循環(huán)4、實現(xiàn)消息處理函數(shù)。該函數(shù)使1292.2.4消息機(jī)制與消息循環(huán)5、在適當(dāng)?shù)臅r候發(fā)送自定義消息,進(jìn)行消息處理。需要注意使用SendMessage還是PostMessage進(jìn)行處理:SendMessage是消息處理完畢后再返回;而PostMessage則是把消息放到消息隊列后立即返回。
SendMessage(theApp.GetMainWnd()->GetSafeHwnd(),WM_PROGRESS,0L,0L);如果用戶需要整個系統(tǒng)唯一的消息,可以調(diào)用SDK函數(shù)RegisterWindowMessage并使用ON_REGISTER_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步驟同上。2.2.4消息機(jī)制與消息循環(huán)5、在適當(dāng)?shù)臅r候發(fā)送自定義消息1302.2.4消息機(jī)制與消息循環(huán)SendMessage函數(shù)原型LRESULTSendMessage(HWNDhWnd,UINTMsg,WPARAMwParam,LPARAMlParam)hWnd:其窗口程序?qū)⒔邮障⒌拇翱诘木浔sg:指定被發(fā)送的消息號。wParam:指定附加的消息特定信息。lParam:指定附加的消息特定信息。返回值:返回值指定消息處理的結(jié)果,依賴于所發(fā)送的消息。2.2.4消息機(jī)制與消息循環(huán)SendMessage函數(shù)原1312.2.4消息機(jī)制與消息循環(huán)演示并編寫一個自定義消息應(yīng)用程序,添加WM_PROGRESS消息。當(dāng)程序運(yùn)行時,則調(diào)用自定義消息處理函數(shù),輸出文本“自定義消息處理函數(shù)被調(diào)用!”。2.2.4消息機(jī)制與消息循環(huán)演示并編寫一個自定義消息應(yīng)用程132消息傳遞標(biāo)準(zhǔn)Windows消息傳遞直線上溯命令消息傳遞迂回上溯消息傳遞標(biāo)準(zhǔn)Windows消息傳遞133第2章MFC應(yīng)用程序課件134消息傳遞對于WM_COMMAND消息??蚣艽翱趯嶋H上是大多數(shù)WM_COMMAND消息的接受者,但WM_COMMAND消息還可以在視圖、文檔,甚至應(yīng)用程序類中被處理。消息傳遞對于WM_COMMAND消息??蚣艽翱趯嶋H上是大多數(shù)135
文檔/視圖體系結(jié)構(gòu)是MFC應(yīng)用程序框架結(jié)構(gòu)的基石,它定義了一種程序結(jié)構(gòu),這種結(jié)構(gòu)利用文檔對象保存應(yīng)用程序的數(shù)據(jù),依靠視圖對象控制視圖顯示數(shù)據(jù),文檔與視圖的關(guān)系是一對多的關(guān)系,也就是說,文檔中的數(shù)據(jù)可以以不同的方式顯示。2.3文檔與視圖文檔/視圖體系結(jié)構(gòu)是MFC應(yīng)用程序框架結(jié)構(gòu)的基石,它1362.3文檔與視圖文檔負(fù)責(zé)數(shù)據(jù)讀取、存取以及其它的操作。CDocument類本身只是一個空殼,我們需要從它派生一個數(shù)據(jù)自已的類,并在類中聲明我們需要的變量,用以承載數(shù)據(jù)。CDocument類已經(jīng)為我們做好了一些重要的函數(shù),其中包括與View類的”溝通”函數(shù)、文檔存取等函數(shù)。2.3文檔與視圖文檔負(fù)責(zé)數(shù)據(jù)讀取、存取以及其它的操作。137表主要的CDocument操作2.3文檔與視圖表主要的CDocument操作2.3文檔與視圖138表主要的CDocument可覆蓋函數(shù)2.3文檔與視圖表主要的CDocument可覆蓋函數(shù)2.3文檔與視圖139
用戶可通過函數(shù)GetFirstViewPosition()和GetNextView()得到和文檔關(guān)聯(lián)的視圖的指針,代碼如下:POSITIONpos=GetFirstViewPosition();//得到視圖列表頭的位置While(pos!=NULL){CView*pView=GetNextView(pos); //獲得視圖列表中的視圖指針
…}
2.3文檔與視圖用戶可通過函數(shù)GetFirstViewPos1402.3文檔與視圖視圖類有兩個用途:提供文檔的可視化表示將用戶輸入(特別是鼠標(biāo)和鍵盤消息)轉(zhuǎn)換為操作文檔數(shù)據(jù)的命令。MFC還包含了一組CView類的派生類,用來完成不同功能的視圖。2.3文檔與視圖視圖類有兩個用途:141CEditView:簡單的文本編輯器,類似NotepadCListView:基于列表的視圖,類似文件夾瀏覽CTreeView:基于樹狀控件的視圖,類似文件瀏覽左側(cè)的樹狀結(jié)構(gòu)CRichEditView:支持多種字體、OLE和RTF格式的高級編輯器CScrollView:支持滾動條的視圖CFormView:窗體視圖,支持在上邊使用對話框控件CRecordView:連接到ODBC數(shù)據(jù)庫的視圖CDaoRecordView:連接到DAO數(shù)據(jù)庫的視圖CView的子類2.3文檔與視圖CEditView:簡單的文本編輯器,類似NotepadCV1422.3文檔與視圖一個文檔可以具有與其聯(lián)系的多個視圖,而一個視圖只能屬于一個文檔。CView類保存了m_pDocument數(shù)據(jù)成員,并將該指針提供給視圖的GetDocument成員函數(shù)使用,用以標(biāo)識出視圖類所屬的文檔。AppWizard為視圖類生成源代碼時,它覆蓋了基類的GetDocument函數(shù)。其強(qiáng)制轉(zhuǎn)換了m_pDocument為派生類指針。2.3文檔與視圖一個文檔可以具有與其聯(lián)系的多個視圖,而一個1432.3文檔與視圖表主要的CView可覆蓋函數(shù)2.3文檔與視圖表主要的CView可覆蓋函數(shù)1442.3文檔與視圖
OnInitialUpdate與OnUpdate在SDI中,視圖與文檔一樣,只構(gòu)造一次,重復(fù)使用。在SDI中,每當(dāng)文檔被打開或創(chuàng)建時,都要調(diào)用視圖的OnInitialUpdate()OnInitialUpdate()默認(rèn)要調(diào)用OnUpdate()OnUpdate()的默認(rèn)操作是使視圖客戶區(qū)無效并執(zhí)行重繪。在CView類的派生類中,如果重寫了OnInitialUpdate(),需要要調(diào)用CView::OnInitialUpdate(),否則新文檔被打開或創(chuàng)建時不會被更新。2.3文檔與視圖OnInitialUpdate與OnUp1452.3文檔與視圖CView::OnDraw何時調(diào)用:在WM_PAINT到來時(當(dāng)視窗顯示區(qū)域的一部分顯示內(nèi)容或者全部變?yōu)椤笩o效」,以致于必須「更新畫面」時,將由這個訊息通知程式。)在文檔被打印時什么是CDCDC:DeviceContext,設(shè)備描述表。在WM_PAINT到來時,DC指向屏幕設(shè)備在文檔被打印時,DC指向打印機(jī)設(shè)備2.3文檔與視圖CView::OnDraw何時調(diào)用:1462.3文檔與視圖OnPaint()與OnDrawWM_PAINT到來時會調(diào)用OnPaint()函數(shù),此函數(shù)在CView中被定義。WM_PRINT到來時會調(diào)用OnPrint()函數(shù),此函數(shù)在CView中被定義。兩個函數(shù)都調(diào)用了OnDraw(),并傳送不同的DC,分別代表屏幕設(shè)備與打印設(shè)備。2.3文檔與視圖OnPaint()與OnDraw1472.4工具欄與狀態(tài)欄2.4工具欄與狀態(tài)欄1482.4工具欄與狀態(tài)欄工具欄簡介工具欄對象是一種窗口,工具欄中
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 上海各區(qū)初中言議論文考題選
- 合作協(xié)議的定價
- 寵物運(yùn)輸國內(nèi)服務(wù)協(xié)議
- 航運(yùn)貨物延誤答辯狀
- 二零二五年度北京市體育館體育活動組織及推廣合同
- 模具產(chǎn)業(yè)園項目可行性研究報告
- 基建項目可行性研究報告
- 農(nóng)業(yè)觀光項目可行性研究報告
- 新能源行業(yè)市場分析指南
- 商業(yè)項目可行性分析報告
- (一模)東北三省三校2025年高三第一次聯(lián)合模擬考試 生物試卷(含答案)
- 金屬熔融崗位培訓(xùn)課件
- 污水處理廠工程設(shè)備安裝施工方案及技術(shù)措施
- 2025年海南??谑兴畡?wù)局招聘事業(yè)單位人員35人歷年高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 2025年江蘇鹽城市交通投資建設(shè)控股集團(tuán)有限公司招聘筆試參考題庫附帶答案詳解
- 事故隱患內(nèi)部舉報獎勵制度
- 電力排管檢驗批
- 畢業(yè)論文-樓道節(jié)能燈的設(shè)計與實現(xiàn)
- 工藝安全管理培訓(xùn)-設(shè)備變更管理課件
- C型鋼檢驗報告
- 江西省房屋建筑與裝飾工程消耗量定額及統(tǒng)一基價表
評論
0/150
提交評論