




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
主要內容2.1用MFC向導生成應用程序2.2應用程序框架分析2.3文檔與視圖2.4工具欄和狀態(tài)欄2.5-2.7MFC新功能2.8應用程序框架類對象分析主要內容2.1用MFC向導生成應用程序12.1用MFC向導生成應用程序用AppWizard應用程序向導生成MFC應用程序。單文檔應用程序多文檔應用程序對話框應用程序用ClassWizard工具生成派生類、定義處理消息、管理對話框、定制MFC成員函數(shù)。2.1用MFC向導生成應用程序用AppWizard應用程序22.1用MFC向導生成應用程序演示MFC向導生成常用的三種應用程序。2.1用MFC向導生成應用程序演示MFC向導生成常用的三種32.1.2生成的應用程序類型基于對話框的應用程序CWinApp、CDialog類2.1.2生成的應用程序類型基于對話框的應用程序42.1.2生成的應用程序類型單文檔應用程序CWinApp、CFrameWnd、CView、CDocument2.1.2生成的應用程序類型單文檔應用程序52.1.2生成的應用程序類型多文檔應用程序CWinApp、CMDIFrameWnd、CMDIChildWnd、CView、CDocument2.1.2生成的應用程序類型多文檔應用程序62.1.3向導生成工程文件簡介頭文件與實現(xiàn)文件各個類的*.h和*.cppResource.h:定義工程中所有資源標識符,給資源ID分配一個整數(shù)值。StdAfx.h和StdAfx.cpp:用于建立一個預編譯的頭文件。資源文件*.rc和*.rc2:是程序所使用的所有Windows資源的列表。*.ico:應用程序的圖標所使用的圖標文件。*Doc.ico:應用程序的文檔圖標文件。文檔圖標一般顯示在多文檔程序界面上。Toolbar.bmp:工具欄按鈕的位圖文件。2.1.3向導生成工程文件簡介頭文件與實現(xiàn)文件72.1.3向導生成工程文件簡介解決方案文件和工程文件*.sln:保存當前解決方案所包含的工程的信息。*.vcxproj:包含當前工程的設置、工程中的文件等信息。2.1.3向導生成工程文件簡介解決方案文件和工程文件8MFC應用程序框架結構類的繼承關系:2.2應用程序框架分析MFC應用程序框架結構類的繼承關系:2.2應用程序框架分92.2.1框架簡介1.CObject類CObject是MFC類庫的根類,它幾乎描述了所有MFC類的一些公共特性,并且給所有由它派生出的類提供了3種重要特性,即:串行化支持、運行時類信息支持以及診斷和調試支持。2.CCmdTarget類命令類CCmdTarget是CObject的子類,它是MFC庫中所有具有消息映射屬性的類的公共基類。從CCmdTarget派生的類能在程序運行時動態(tài)創(chuàng)建對象和處理命令消息。
2.2.1框架簡介1.CObject類103.CWinApp類CObjectCCmdTargetCWinThreadCWinApp應用程序類在類族中的位置WinMain函數(shù)的函數(shù)體的封裝支持線程管理2.2.1框架簡介
應用程序類CWinApp是CWinThread的子類,封裝了初始化、運行、終止應用程序的代碼。可以由此派生自己的應用類。3.CWinApp類CObjectCCmdTargetCW11指向框架窗口的指針m_pMainWnd2.2.1框架簡介指向框架窗口的指針m_pMainWnd2.2.1框架簡介12CWinApp類中定義了三個可以重寫的虛函數(shù):InitInstance()--程序創(chuàng)建和顯示窗口。程序設計時,必須以CWinApp類為基類派生自己的應用程序類,并根據(jù)情況重寫InitInstance()。Run(),處理消息循環(huán)。ExitInstance()程序結束時做收尾工作。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類的對象是一個框架窗口,包括邊框、標題欄、菜單、最大化按鈕、最小化按鈕和一個激活的視圖。CFrameWnd類支持單文檔界面,對于多文檔界面,使用它的兩個派生類CMDIFrameWnd和CMDIChildWnd。CMDIFrameWnd類用于MDI的主窗口,CMDIChildWnd類用于MDI的子窗口。2.2.1框架簡介5.CFrameWnd類2.2.1框架簡介176.CView類視圖類CView是CWnd類的子類。視圖類及其派生類用于管理框架窗口的客戶區(qū)。
7.CDocument類文檔類CDocument負責裝載和維護文檔。文檔包括應用程序的工作成果或環(huán)境設置數(shù)據(jù)等,可以是程序需要保存的任何內容。2.2.1框架簡介6.CView類2.2.1框架簡介18為應用程序框架提供客戶區(qū),承擔用戶數(shù)據(jù)的顯示(同時替代窗口框架接收外界的輸入。因此,該類是程序員編碼最多的地方。派生關系與文檔類的聯(lián)系紐帶用戶區(qū)的繪制,注意:誰來觸發(fā)1)自動重繪;2)手動視圖更新2.2.1框架簡介為應用程序框架提供客戶區(qū),承擔用戶數(shù)據(jù)的顯示(同時替代窗口框19應用程序的文檔類由CDocument派生Serialize()函數(shù):文件操作時響應
ReaddatafromfileWritedatatofile序列化/串行化Serialization2.2.1框架簡介應用程序的文檔類由CDocument派生Serialize(20各對象之間的關系2.2.1框架簡介各對象之間的關系2.2.1框架簡介21CWinApptheApp;theApp.InitInstance系統(tǒng)應用程序對象文檔模板文檔對象窗口框架對象視圖對象1.應用程序各對象的創(chuàng)建順序2.2.2MFC應用程序運行流程CWinApptheApp;theApp.InitInst222.2.2MFC應用程序運行流程2.應用程序的執(zhí)行過程啟動:創(chuàng)建應用程序對象theApp、調用應用程序類的構造函數(shù)初始化對象theApp。應用程序框架調用MFC提供的AfxWinMain()主函數(shù)。AfxWinMain()主函數(shù),首先通過調用全局函數(shù)AfxGetApp()來獲取theApp的指針pApp;然后通過該指針調用theApp的成員函數(shù)InitInstance()來初始化應用程序。2.2.2MFC應用程序運行流程2.應用程序的執(zhí)行過程23
在應用程序的初始化過程InitInstance中,同時還構造了文檔模板,產(chǎn)生最初的文檔、視圖和主框架窗口,并生成工具欄和狀態(tài)欄。2.2.2MFC應用程序運行流程當InitInstance()函數(shù)執(zhí)行完畢后,AfxWinMain()函數(shù)將調用成員函數(shù)
Run(),進入消息處理循環(huán);函數(shù)Run()收到WM_QUIT消息。MFC首先調用CWinApp類的成員函數(shù)ExitInstance();然后調用靜態(tài)對象的析構函數(shù);退出應用程序,將控制權交給操作系統(tǒng)。在應用程序的初始化過程InitInstance中,同24WinMain->AfxWinMain應用程序初始化消息循環(huán)C:\ProgramFiles\MicrosoftVisualStudio10.0\vc\atlmfc\src\winmain.cpp2.2.2MFC應用程序運行流程WinMain->AfxWinMain應用程序初始化消息252.2.3應用程序窗口重疊窗口彈出窗口子窗口2.2.3應用程序窗口重疊窗口26
Windows消息主要有3種類型:標準Windows消息、控件消息和命令消息。1).標準Windows消息除WM_COMMAND以外,所有以“WM_”為前綴的消息都是標準Windows消息;由窗口類或視圖類處理;都有默認的處理函數(shù),它們在CWnd類中進行了預定義。1.消息的類別及其描述2.2.4消息機制與消息循環(huán)Windows消息主要有3種類型:標準Windows消27標準的Windows消息又分為3類:鍵盤消息、鼠標消息和窗口消息。(1)鍵盤消息鍵盤消息與鍵盤某個鍵的動作相關聯(lián)。常見的鍵盤消息有以下幾種。WM_KEYDOWN、WM_KEYUP:按下、釋放鍵產(chǎn)生的消息。WM_CHAR:輸入字符時產(chǎn)生的消息。2.2.4消息機制與消息循環(huán)標準的Windows消息又分為3類:2.2.4消息機制與消28(2)鼠標消息鼠標消息涉及到鼠標的單擊、雙擊、拖動等。常用的鼠標消息有以下幾種。
WM_MOUSEMOVE:鼠標移動時產(chǎn)生的消息。
WM_RBUTTONDOWN:鼠標右鍵按下時產(chǎn)生的消息。
WM_LBUTTONDOWN:鼠標左鍵按下時產(chǎn)生的消息。
WM_LBUTTONDBLCLICK:鼠標雙擊時產(chǎn)生的消息。2.2.4消息機制與消息循環(huán)(2)鼠標消息2.2.4消息機制與消息循環(huán)29(3)窗口消息窗口消息一般與創(chuàng)建窗口、繪制窗口、移動窗口和銷毀窗口等動作有關。在MFC應用程序中,窗口消息是由視圖類、窗口類及它們的派生類處理的。2.2.4消息機制與消息循環(huán)(3)窗口消息2.2.4消息機制與消息循環(huán)302).控件消息控件消息是指控件或其他子窗口向父窗口發(fā)送的消息。與其他標準的Windows消息一樣,控件消息也應該在視圖類、窗口類中進行處理。但是,如果用戶單擊按鈕控件時,發(fā)出的控件通知消息BN_CLICKED將作為命令消息來處理。2.2.4消息機制與消息循環(huán)2).控件消息2.2.4消息機制與消息循環(huán)313).命令消息命令消息是由菜單項、工具欄按鈕、快捷鍵等用戶界面對象發(fā)出的WM_COMMAND消息。命令消息與其他消息不同,它可被更廣泛的對象如文檔、文檔模板、應用程序對象、窗口和視圖等處理。3).命令消息322.MFC消息映射機制MFC采用消息映射來處理消息;消息映射機制包括一組消息映射宏,用于把一個Windows消息和其消息處理函數(shù)聯(lián)系起來。所有從CCmdTarget類派生出來的類都能夠擁有自己的消息映射。與MFC消息映射機制有關的宏有以下3個:DECLARE_MESSAGE_MAP()BEGIN_MESSAGE_MAP(MyClass,MybaseClass)END_MESSAGE_MAP()2.2.4消息機制與消息循環(huán)2.MFC消息映射機制MFC采用消息映射來處理消息;33為了使用消息映射宏:首先在類定義的結尾用DECLARE_MESSAGE_MAP()宏來聲明使用消息映射,該宏表示在為各個處理函數(shù)所寫的類聲明之后存在消息映射條目,這些函數(shù)是該類的成員函數(shù)。然后在類的實現(xiàn)源文件中用BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()宏來定義消息映射。MFC應用程序MESSAG_MAP消息映射的形式如下:2.2.4消息機制與消息循環(huán)為了使用消息映射宏:2.2.4消息機制與消息循環(huán)34BEGIN_MESSAGE_MAP(MyClass,MybaseClass)//{{AFX_MSG_MAP(MyClass)//ClassWizard維護消息映射宏的標記
ON_... //MFC預定義消息映射宏
ON_MESSAGE(message,memberFun)//用戶自定義消息映射宏
//}}AFX_MSG_MAPEND_MESSAGE_MAP()其中,MyClass是擁有消息映射的派生類名,MybaseClass是其基類名。2.2.4消息機制與消息循環(huán)BEGIN_MESSAGE_MAP(MyClass,Myb352.2.4消息機制與消息循環(huán)2.2.4消息機制與消息循環(huán)363自定義消息處理自定義消息處理:定義消息名、分配ID值及完成消息映射。Windows將所有的消息值分為4段:0x0000~0x03FF段:用于Windows系統(tǒng)消息0x0400~0x7FFF段:用于用戶自定義的窗口消息0x8000~0xBFFF段:為Windows保留值0xC000~0xFFFF段:用于應用程序的字符串消息。2.2.4消息機制與消息循環(huán)3自定義消息處理自定義消息處理:定義消息名、分配ID值37
常量WM_USER(為0x0400)與第一個自定義消息值相對應,用戶必須為自己的消息定義相對于WM_USER的偏移值,利用#define語句直接定義自己的消息,如下所示:
#defineWM_HIDEWM_USER+3//自定義消息WM_USER
也可以調用窗口消息注冊函數(shù)RegisterWindowMessage()來定義一個Windows消息,由系統(tǒng)分配消息一個整數(shù)值。該函數(shù)原型為:
UINTRegisterWindowMessage(LPCTSTRlpString);
其中參數(shù)lpString是要定義的消息名,調用成功后將返回該消息的ID值。2.2.4消息機制與消息循環(huán)常量WM_USER(為0x0400)與第382.2.4消息機制與消息循環(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消息機制與消息循環(huán)自定義消息方法的步驟:392.2.4消息機制與消息循環(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消息機制與消息循環(huán)3、在類的實現(xiàn)文件中,使用ON402.2.4消息機制與消息循環(huán)4、實現(xiàn)消息處理函數(shù)。該函數(shù)使用WPRAM和LPARAM參數(shù)并返回LRESULT。
LRESULTCMainFrame::OnHide(WPARAMwParam,LPARAMlParam){
MessageBox(_T("我的消息"));return0;
}
2.2.4消息機制與消息循環(huán)4、實現(xiàn)消息處理函數(shù)。該函數(shù)使412.2.4消息機制與消息循環(huán)5、在適當?shù)臅r候發(fā)送自定義消息,進行消息處理。需要注意使用SendMessage還是PostMessage進行處理:SendMessage是消息處理完畢后再返回;而PostMessage則是把消息放到消息隊列后立即返回。
SendMessage(theApp.GetMainWnd()->GetSafeHwnd(),WM_PROGRESS,0L,0L);如果用戶需要整個系統(tǒng)唯一的消息,可以調用SDK函數(shù)RegisterWindowMessage并使用ON_REGISTER_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步驟同上。2.2.4消息機制與消息循環(huán)5、在適當?shù)臅r候發(fā)送自定義消息422.2.4消息機制與消息循環(huán)SendMessage函數(shù)原型LRESULTSendMessage(HWNDhWnd,UINTMsg,WPARAMwParam,LPARAMlParam)hWnd:其窗口程序將接收消息的窗口的句柄。Msg:指定被發(fā)送的消息號。wParam:指定附加的消息特定信息。lParam:指定附加的消息特定信息。返回值:返回值指定消息處理的結果,依賴于所發(fā)送的消息。2.2.4消息機制與消息循環(huán)SendMessage函數(shù)原432.2.4消息機制與消息循環(huán)演示并編寫一個自定義消息應用程序,添加WM_PROGRESS消息。當程序運行時,則調用自定義消息處理函數(shù),輸出文本“自定義消息處理函數(shù)被調用!”。2.2.4消息機制與消息循環(huán)演示并編寫一個自定義消息應用程44消息傳遞標準Windows消息傳遞直線上溯命令消息傳遞迂回上溯消息傳遞標準Windows消息傳遞45第2章MFC應用程序課件46消息傳遞對于WM_COMMAND消息。框架窗口實際上是大多數(shù)WM_COMMAND消息的接受者,但WM_COMMAND消息還可以在視圖、文檔,甚至應用程序類中被處理。消息傳遞對于WM_COMMAND消息。框架窗口實際上是大多數(shù)47
文檔/視圖體系結構是MFC應用程序框架結構的基石,它定義了一種程序結構,這種結構利用文檔對象保存應用程序的數(shù)據(jù),依靠視圖對象控制視圖顯示數(shù)據(jù),文檔與視圖的關系是一對多的關系,也就是說,文檔中的數(shù)據(jù)可以以不同的方式顯示。2.3文檔與視圖文檔/視圖體系結構是MFC應用程序框架結構的基石,它482.3文檔與視圖文檔負責數(shù)據(jù)讀取、存取以及其它的操作。CDocument類本身只是一個空殼,我們需要從它派生一個數(shù)據(jù)自已的類,并在類中聲明我們需要的變量,用以承載數(shù)據(jù)。CDocument類已經(jīng)為我們做好了一些重要的函數(shù),其中包括與View類的”溝通”函數(shù)、文檔存取等函數(shù)。2.3文檔與視圖文檔負責數(shù)據(jù)讀取、存取以及其它的操作。49表主要的CDocument操作2.3文檔與視圖表主要的CDocument操作2.3文檔與視圖50表主要的CDocument可覆蓋函數(shù)2.3文檔與視圖表主要的CDocument可覆蓋函數(shù)2.3文檔與視圖51
用戶可通過函數(shù)GetFirstViewPosition()和GetNextView()得到和文檔關聯(lián)的視圖的指針,代碼如下:POSITIONpos=GetFirstViewPosition();//得到視圖列表頭的位置While(pos!=NULL){CView*pView=GetNextView(pos); //獲得視圖列表中的視圖指針
…}
2.3文檔與視圖用戶可通過函數(shù)GetFirstViewPos522.3文檔與視圖視圖類有兩個用途:提供文檔的可視化表示將用戶輸入(特別是鼠標和鍵盤消息)轉換為操作文檔數(shù)據(jù)的命令。MFC還包含了一組CView類的派生類,用來完成不同功能的視圖。2.3文檔與視圖視圖類有兩個用途:53CEditView:簡單的文本編輯器,類似NotepadCListView:基于列表的視圖,類似文件夾瀏覽CTreeView:基于樹狀控件的視圖,類似文件瀏覽左側的樹狀結構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ù)使用,用以標識出視圖類所屬的文檔。AppWizard為視圖類生成源代碼時,它覆蓋了基類的GetDocument函數(shù)。其強制轉換了m_pDocument為派生類指針。2.3文檔與視圖一個文檔可以具有與其聯(lián)系的多個視圖,而一個552.3文檔與視圖表主要的CView可覆蓋函數(shù)2.3文檔與視圖表主要的CView可覆蓋函數(shù)562.3文檔與視圖
OnInitialUpdate與OnUpdate在SDI中,視圖與文檔一樣,只構造一次,重復使用。在SDI中,每當文檔被打開或創(chuàng)建時,都要調用視圖的OnInitialUpdate()OnInitialUpdate()默認要調用OnUpdate()OnUpdate()的默認操作是使視圖客戶區(qū)無效并執(zhí)行重繪。在CView類的派生類中,如果重寫了OnInitialUpdate(),需要要調用CView::OnInitialUpdate(),否則新文檔被打開或創(chuàng)建時不會被更新。2.3文檔與視圖OnInitialUpdate與OnUp572.3文檔與視圖CView::OnDraw何時調用:在WM_PAINT到來時(當視窗顯示區(qū)域的一部分顯示內容或者全部變?yōu)椤笩o效」,以致于必須「更新畫面」時,將由這個訊息通知程式。)在文檔被打印時什么是CDCDC:DeviceContext,設備描述表。在WM_PAINT到來時,DC指向屏幕設備在文檔被打印時,DC指向打印機設備2.3文檔與視圖CView::OnDraw何時調用:582.3文檔與視圖OnPaint()與OnDrawWM_PAINT到來時會調用OnPaint()函數(shù),此函數(shù)在CView中被定義。WM_PRINT到來時會調用OnPrint()函數(shù),此函數(shù)在CView中被定義。兩個函數(shù)都調用了OnDraw(),并傳送不同的DC,分別代表屏幕設備與打印設備。2.3文檔與視圖OnPaint()與OnDraw592.4工具欄與狀態(tài)欄2.4工具欄與狀態(tài)欄602.4工具欄與狀態(tài)欄工具欄簡介工具欄對象是一種窗口,工具欄中的所有按鈕的圖形被存儲在一個位圖中,而該位圖被定義在應用程序的資源文件中。工具欄按鈕與菜單選項是類似的。單擊工具欄按鈕將產(chǎn)生相應的命令,應用程序通過提供消息處理函數(shù)來處理產(chǎn)生的命令。如果工具欄的某個按鈕沒有COMMAND或UPDATE_COMMAND_UI處理函數(shù),那么框架自動使該按鈕無效。工具欄和狀態(tài)欄一般作為框架窗口類的成員變量聲明,在創(chuàng)建框架窗口時自動創(chuàng)建它們,在銷毀框架窗口時自動銷毀所創(chuàng)建的控件欄對象。使用AppWizard創(chuàng)建應用程序基本框架時,可以得到初始的工具欄和狀態(tài)欄。2.4工具欄與狀態(tài)欄工具欄簡介612.4.1工具欄系統(tǒng)默認生成的工具欄資源為IDR_MAINFRAME,可以在此基礎上設計自己的工具欄,刪除或添加一些按鈕。需要為工具欄按鈕提供ID號,一般取某個菜單項的ID。2.4.1工具欄系統(tǒng)默認生成的工具欄資源為IDR_MAIN622.4.1工具欄工具欄的創(chuàng)建:(1)創(chuàng)建工具欄資源(2)構造CToolBar對象,即在邊框窗口類的聲明中添加類似以下的聲明:CToolBarm_wndToolBar;(3)調用Create或CreateEx創(chuàng)建工具欄,然后調用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工具欄的停靠intCMainFrame::OnCreate( LPCREATESTRUCTlpCreateStruct){ ……
m_wndToolBar.EnableDocking( CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY); DockControlBar(&m_wndToolBar);}工具欄的停靠intCMainFrame::OnCreate65調用Create時還可以指定工具欄的風格,默認風格是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)欄中顯示按鈕的有關信息。⑨CBRS_HIDE_INPLANE不顯示工具欄。工具欄的創(chuàng)建調用Create時還可以指定工具欄的風格,默認風格是WS_C66停靠方式CToolBar的EnableDocking:設置工具欄能停靠在何處?CBRS_ALIGN_ANYCBRS_ALIGN_TOP、CBRS_ALIGN_LEFTCBRS_ALIGN_RIGHT、CBRS_ALIGN_BOTTOMCMainFrame類的EnableDocking:設置能讓工具欄停靠在何處?調用DockControlBar,完成工具欄停靠,具體效果由上面的兩個EnableDocking共同決定。停靠方式CToolBar的EnableDocking:設置工672.4.1工具欄演示在系統(tǒng)提供的工具欄上添加并編輯新的工具欄按鈕,產(chǎn)生消息響應。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)-停靠intCMainFrame::OnCreate(……){ ……
m_wndToolBar.EnableDocking( CBRS_ALIGN_ANY);
m_wndTool1.EnableDocking( CBRS_ALIGN_ANY); EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar); DockControlBar(&m_wndTool1); return0;}只需調用一次多工具欄實現(xiàn)-停靠intCMainFrame::OnCre71隱藏和顯示工具欄ShowControlBar(&m_wndTool1,
true,false);ShowControlBar(&m_wndToolBar, false,false);true顯示false隱藏是否立即顯示,false立即顯示隱藏和顯示工具欄ShowControlBar(&m_wndT722.4.2狀態(tài)欄狀態(tài)欄可以顯示與上下文有關的工具欄按鈕和菜單項的幫助信息。在Windows中已經(jīng)變的非常普遍。2.4.2狀態(tài)欄狀態(tài)欄可以顯示與上下文有關的工具欄按鈕和732.4.2狀態(tài)欄
狀態(tài)欄的定義用AppWizard創(chuàng)建的SDI或MDI應用程序框架中,有一個靜態(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ù)組中添加更多的標識符就可以在狀態(tài)欄增加更多的提示符,可以根據(jù)需要動態(tài)改變提示符的大小,通過增加ID_SEPARATOR元素還可增加分隔符。最左邊的提示符(位置0)通常用作消息區(qū),可以在其中顯示命令提示之類的文本字符串。創(chuàng)建狀態(tài)欄創(chuàng)建狀態(tài)欄的步驟:(1)構造CStatusBar對象。(2)調用Create創(chuàng)建狀態(tài)欄并將其與CStatusBar對象聯(lián)結。(3)調用成員函數(shù)SetIndicators,設置指示符的標識符為數(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號的字符串資源。窗格的初始大小等于關聯(lián)字符串的長度。3、自定義狀態(tài)欄窗格每個窗格指定一個ID號,同時還要創(chuàng)建一個77顯示鼠標位置-----插入窗格staticUINTindicators[]={ ID_SEPARATOR,
IDS_MOUSEXY, ID_INDICATOR_CAPS, ID_INDICATOR_NUM, ID_INDICATOR_SCRL,};插入窗格的ID顯示鼠標位置-----插入窗格staticUINTind78顯示鼠標位置-----輸出內容映射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修飾顯示鼠標位置-----輸出內容映射WM_MOUSEMOVE到79CStatusBar::Create()函數(shù)用于創(chuàng)建一個Windows狀態(tài)欄(子窗口),并將其連接到CStatusBar對象上,同時設置初始字體和狀態(tài)欄的高度。該函數(shù)原型為:
BOOLCreate(CWnd*pParentWnd,DWORDdwStyle=WS_CHILD|WS_VISIBLE|CBRS_BOTTOM,UINTnID=AFX_IDW_STATUS_BAR);其中參數(shù)pParentWnd為指向父窗口CWnd對象的指針;dwStyle指定狀態(tài)欄的風格,除了標準的Windows風格外,還可以是CBRS_TOP(狀態(tài)欄位于框架窗口的頂部)、CBRS_BOTTOM(狀態(tài)欄位于框架窗口的底部)、CBRS_NOALIGN(當父窗口改變時,狀態(tài)欄不被重新定位);參數(shù)nID表示該狀態(tài)欄的子窗口ID。如果函數(shù)調用成功,則返回一個非0值,否則返回0。CStatusBar常用成員CStatusBar::Create()函數(shù)CStatus80SetIndIcators()函數(shù)函數(shù)SetIndIcators()用于設置指示器的ID,并裝入由每個ID指定的字符串資源,然后將指示器的文字設置為該字符串,該函數(shù)的原型為:BOOLSetIndIcators(constUINT*lpIDArray,intnIDCount);參數(shù)lpIDArray為指向ID數(shù)組的指針,nIDCount為lpIDArray所指向的數(shù)組元素的個數(shù)。該函數(shù)按照數(shù)組lpIDArray中的對應元素的值設定標識符ID的值,加載由每個ID所指定的字符串資源,并把字符串設置為標識符的文字。如果該函數(shù)操作成功,在返回一個非0值,否則返回0。CStatusBar常用成員SetIndIcators()函數(shù)CStatusBar常用成81SetPaneInfo()函數(shù)函數(shù)SetPaneInfo()用于設置給定索引值的指示器ID、風格和寬度。它的原型為:voidSetPaneInfo(intnIndex,UINTnID,UINTnStyle,intcxWidth);該函數(shù)給標識符欄設置一個新的ID、風格和寬度。可供選擇的標識符風格有:
CStatusBar常用成員SetPaneInfo()函數(shù)CStatusBar常用成員82SetPaneText()函數(shù)函數(shù)SetPaneText()用于設置給定索引值的指示器的文本。它的原型為:BOOLSetPaneText(intnIndex,LPCTSTRlpszNewText,BOOLbUpdate=TRUE);該函數(shù)用lpszNewText所指向的字符串來設置狀態(tài)欄的文字。CStatusBar常用成員SetPaneText()函數(shù)CStatusBar常用成員832.5-2.7MFC新功能邊演示邊講解2.5-2.7MFC新功能邊演示邊講解84當前位置 被訪問的位置 訪問方法文檔 視圖 GetFirstViewPosition GetNextView文檔 模板 GetDocTemplate視圖 文檔 GetDocument視圖 框架 GetParentFrame框架 視圖 GetActiveView框架 文檔 GetActiveDocumentMDI主框架 MDI子框架 MDIGetActiveMDI子框架 MDI主框架 GetParentFrame任何位置 應用程序 AfxGetApp任何位置 主框架 AfxGetMainWndDoc/View結構的五個基本成員經(jīng)常需要互相訪問,假設某個視圖想要獲得文檔,或某個框架需要獲得活動視圖,可以通過此表提供的方法進行解決
2.8應用程序框架類對象分析當前位置 被訪問的位置 訪問方法Doc/View結構的五個基85第2章MFC應用程序課件86謝謝!87謝謝!878888主要內容2.1用MFC向導生成應用程序2.2應用程序框架分析2.3文檔與視圖2.4工具欄和狀態(tài)欄2.5-2.7MFC新功能2.8應用程序框架類對象分析主要內容2.1用MFC向導生成應用程序892.1用MFC向導生成應用程序用AppWizard應用程序向導生成MFC應用程序。單文檔應用程序多文檔應用程序對話框應用程序用ClassWizard工具生成派生類、定義處理消息、管理對話框、定制MFC成員函數(shù)。2.1用MFC向導生成應用程序用AppWizard應用程序902.1用MFC向導生成應用程序演示MFC向導生成常用的三種應用程序。2.1用MFC向導生成應用程序演示MFC向導生成常用的三種912.1.2生成的應用程序類型基于對話框的應用程序CWinApp、CDialog類2.1.2生成的應用程序類型基于對話框的應用程序922.1.2生成的應用程序類型單文檔應用程序CWinApp、CFrameWnd、CView、CDocument2.1.2生成的應用程序類型單文檔應用程序932.1.2生成的應用程序類型多文檔應用程序CWinApp、CMDIFrameWnd、CMDIChildWnd、CView、CDocument2.1.2生成的應用程序類型多文檔應用程序942.1.3向導生成工程文件簡介頭文件與實現(xiàn)文件各個類的*.h和*.cppResource.h:定義工程中所有資源標識符,給資源ID分配一個整數(shù)值。StdAfx.h和StdAfx.cpp:用于建立一個預編譯的頭文件。資源文件*.rc和*.rc2:是程序所使用的所有Windows資源的列表。*.ico:應用程序的圖標所使用的圖標文件。*Doc.ico:應用程序的文檔圖標文件。文檔圖標一般顯示在多文檔程序界面上。Toolbar.bmp:工具欄按鈕的位圖文件。2.1.3向導生成工程文件簡介頭文件與實現(xiàn)文件952.1.3向導生成工程文件簡介解決方案文件和工程文件*.sln:保存當前解決方案所包含的工程的信息。*.vcxproj:包含當前工程的設置、工程中的文件等信息。2.1.3向導生成工程文件簡介解決方案文件和工程文件96MFC應用程序框架結構類的繼承關系:2.2應用程序框架分析MFC應用程序框架結構類的繼承關系:2.2應用程序框架分972.2.1框架簡介1.CObject類CObject是MFC類庫的根類,它幾乎描述了所有MFC類的一些公共特性,并且給所有由它派生出的類提供了3種重要特性,即:串行化支持、運行時類信息支持以及診斷和調試支持。2.CCmdTarget類命令類CCmdTarget是CObject的子類,它是MFC庫中所有具有消息映射屬性的類的公共基類。從CCmdTarget派生的類能在程序運行時動態(tài)創(chuàng)建對象和處理命令消息。
2.2.1框架簡介1.CObject類983.CWinApp類CObjectCCmdTargetCWinThreadCWinApp應用程序類在類族中的位置WinMain函數(shù)的函數(shù)體的封裝支持線程管理2.2.1框架簡介
應用程序類CWinApp是CWinThread的子類,封裝了初始化、運行、終止應用程序的代碼。可以由此派生自己的應用類。3.CWinApp類CObjectCCmdTargetCW99指向框架窗口的指針m_pMainWnd2.2.1框架簡介指向框架窗口的指針m_pMainWnd2.2.1框架簡介100CWinApp類中定義了三個可以重寫的虛函數(shù):InitInstance()--程序創(chuàng)建和顯示窗口。程序設計時,必須以CWinApp類為基類派生自己的應用程序類,并根據(jù)情況重寫InitInstance()。Run(),處理消息循環(huán)。ExitInstance()程序結束時做收尾工作。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類的對象是一個框架窗口,包括邊框、標題欄、菜單、最大化按鈕、最小化按鈕和一個激活的視圖。CFrameWnd類支持單文檔界面,對于多文檔界面,使用它的兩個派生類CMDIFrameWnd和CMDIChildWnd。CMDIFrameWnd類用于MDI的主窗口,CMDIChildWnd類用于MDI的子窗口。2.2.1框架簡介5.CFrameWnd類2.2.1框架簡介1056.CView類視圖類CView是CWnd類的子類。視圖類及其派生類用于管理框架窗口的客戶區(qū)。
7.CDocument類文檔類CDocument負責裝載和維護文檔。文檔包括應用程序的工作成果或環(huán)境設置數(shù)據(jù)等,可以是程序需要保存的任何內容。2.2.1框架簡介6.CView類2.2.1框架簡介106為應用程序框架提供客戶區(qū),承擔用戶數(shù)據(jù)的顯示(同時替代窗口框架接收外界的輸入。因此,該類是程序員編碼最多的地方。派生關系與文檔類的聯(lián)系紐帶用戶區(qū)的繪制,注意:誰來觸發(fā)1)自動重繪;2)手動視圖更新2.2.1框架簡介為應用程序框架提供客戶區(qū),承擔用戶數(shù)據(jù)的顯示(同時替代窗口框107應用程序的文檔類由CDocument派生Serialize()函數(shù):文件操作時響應
ReaddatafromfileWritedatatofile序列化/串行化Serialization2.2.1框架簡介應用程序的文檔類由CDocument派生Serialize(108各對象之間的關系2.2.1框架簡介各對象之間的關系2.2.1框架簡介109CWinApptheApp;theApp.InitInstance系統(tǒng)應用程序對象文檔模板文檔對象窗口框架對象視圖對象1.應用程序各對象的創(chuàng)建順序2.2.2MFC應用程序運行流程CWinApptheApp;theApp.InitInst1102.2.2MFC應用程序運行流程2.應用程序的執(zhí)行過程啟動:創(chuàng)建應用程序對象theApp、調用應用程序類的構造函數(shù)初始化對象theApp。應用程序框架調用MFC提供的AfxWinMain()主函數(shù)。AfxWinMain()主函數(shù),首先通過調用全局函數(shù)AfxGetApp()來獲取theApp的指針pApp;然后通過該指針調用theApp的成員函數(shù)InitInstance()來初始化應用程序。2.2.2MFC應用程序運行流程2.應用程序的執(zhí)行過程111
在應用程序的初始化過程InitInstance中,同時還構造了文檔模板,產(chǎn)生最初的文檔、視圖和主框架窗口,并生成工具欄和狀態(tài)欄。2.2.2MFC應用程序運行流程當InitInstance()函數(shù)執(zhí)行完畢后,AfxWinMain()函數(shù)將調用成員函數(shù)
Run(),進入消息處理循環(huán);函數(shù)Run()收到WM_QUIT消息。MFC首先調用CWinApp類的成員函數(shù)ExitInstance();然后調用靜態(tài)對象的析構函數(shù);退出應用程序,將控制權交給操作系統(tǒng)。在應用程序的初始化過程InitInstance中,同112WinMain->AfxWinMain應用程序初始化消息循環(huán)C:\ProgramFiles\MicrosoftVisualStudio10.0\vc\atlmfc\src\winmain.cpp2.2.2MFC應用程序運行流程WinMain->AfxWinMain應用程序初始化消息1132.2.3應用程序窗口重疊窗口彈出窗口子窗口2.2.3應用程序窗口重疊窗口114
Windows消息主要有3種類型:標準Windows消息、控件消息和命令消息。1).標準Windows消息除WM_COMMAND以外,所有以“WM_”為前綴的消息都是標準Windows消息;由窗口類或視圖類處理;都有默認的處理函數(shù),它們在CWnd類中進行了預定義。1.消息的類別及其描述2.2.4消息機制與消息循環(huán)Windows消息主要有3種類型:標準Windows消115標準的Windows消息又分為3類:鍵盤消息、鼠標消息和窗口消息。(1)鍵盤消息鍵盤消息與鍵盤某個鍵的動作相關聯(lián)。常見的鍵盤消息有以下幾種。WM_KEYDOWN、WM_KEYUP:按下、釋放鍵產(chǎn)生的消息。WM_CHAR:輸入字符時產(chǎn)生的消息。2.2.4消息機制與消息循環(huán)標準的Windows消息又分為3類:2.2.4消息機制與消116(2)鼠標消息鼠標消息涉及到鼠標的單擊、雙擊、拖動等。常用的鼠標消息有以下幾種。
WM_MOUSEMOVE:鼠標移動時產(chǎn)生的消息。
WM_RBUTTONDOWN:鼠標右鍵按下時產(chǎn)生的消息。
WM_LBUTTONDOWN:鼠標左鍵按下時產(chǎn)生的消息。
WM_LBUTTONDBLCLICK:鼠標雙擊時產(chǎn)生的消息。2.2.4消息機制與消息循環(huán)(2)鼠標消息2.2.4消息機制與消息循環(huán)117(3)窗口消息窗口消息一般與創(chuàng)建窗口、繪制窗口、移動窗口和銷毀窗口等動作有關。在MFC應用程序中,窗口消息是由視圖類、窗口類及它們的派生類處理的。2.2.4消息機制與消息循環(huán)(3)窗口消息2.2.4消息機制與消息循環(huán)1182).控件消息控件消息是指控件或其他子窗口向父窗口發(fā)送的消息。與其他標準的Windows消息一樣,控件消息也應該在視圖類、窗口類中進行處理。但是,如果用戶單擊按鈕控件時,發(fā)出的控件通知消息BN_CLICKED將作為命令消息來處理。2.2.4消息機制與消息循環(huán)2).控件消息2.2.4消息機制與消息循環(huán)1193).命令消息命令消息是由菜單項、工具欄按鈕、快捷鍵等用戶界面對象發(fā)出的WM_COMMAND消息。命令消息與其他消息不同,它可被更廣泛的對象如文檔、文檔模板、應用程序對象、窗口和視圖等處理。3).命令消息1202.MFC消息映射機制MFC采用消息映射來處理消息;消息映射機制包括一組消息映射宏,用于把一個Windows消息和其消息處理函數(shù)聯(lián)系起來。所有從CCmdTarget類派生出來的類都能夠擁有自己的消息映射。與MFC消息映射機制有關的宏有以下3個:DECLARE_MESSAGE_MAP()BEGIN_MESSAGE_MAP(MyClass,MybaseClass)END_MESSAGE_MAP()2.2.4消息機制與消息循環(huán)2.MFC消息映射機制MFC采用消息映射來處理消息;121為了使用消息映射宏:首先在類定義的結尾用DECLARE_MESSAGE_MAP()宏來聲明使用消息映射,該宏表示在為各個處理函數(shù)所寫的類聲明之后存在消息映射條目,這些函數(shù)是該類的成員函數(shù)。然后在類的實現(xiàn)源文件中用BEGIN_MESSAGE_MAP()和END_MESSAGE_MAP()宏來定義消息映射。MFC應用程序MESSAG_MAP消息映射的形式如下:2.2.4消息機制與消息循環(huán)為了使用消息映射宏:2.2.4消息機制與消息循環(huán)122BEGIN_MESSAGE_MAP(MyClass,MybaseClass)//{{AFX_MSG_MAP(MyClass)//ClassWizard維護消息映射宏的標記
ON_... //MFC預定義消息映射宏
ON_MESSAGE(message,memberFun)//用戶自定義消息映射宏
//}}AFX_MSG_MAPEND_MESSAGE_MAP()其中,MyClass是擁有消息映射的派生類名,MybaseClass是其基類名。2.2.4消息機制與消息循環(huán)BEGIN_MESSAGE_MAP(MyClass,Myb1232.2.4消息機制與消息循環(huán)2.2.4消息機制與消息循環(huán)1243自定義消息處理自定義消息處理:定義消息名、分配ID值及完成消息映射。Windows將所有的消息值分為4段:0x0000~0x03FF段:用于Windows系統(tǒng)消息0x0400~0x7FFF段:用于用戶自定義的窗口消息0x8000~0xBFFF段:為Windows保留值0xC000~0xFFFF段:用于應用程序的字符串消息。2.2.4消息機制與消息循環(huán)3自定義消息處理自定義消息處理:定義消息名、分配ID值125
常量WM_USER(為0x0400)與第一個自定義消息值相對應,用戶必須為自己的消息定義相對于WM_USER的偏移值,利用#define語句直接定義自己的消息,如下所示:
#defineWM_HIDEWM_USER+3//自定義消息WM_USER
也可以調用窗口消息注冊函數(shù)RegisterWindowMessage()來定義一個Windows消息,由系統(tǒng)分配消息一個整數(shù)值。該函數(shù)原型為:
UINTRegisterWindowMessage(LPCTSTRlpString);
其中參數(shù)lpString是要定義的消息名,調用成功后將返回該消息的ID值。2.2.4消息機制與消息循環(huán)常量WM_USER(為0x0400)與第1262.2.4消息機制與消息循環(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消息機制與消息循環(huán)自定義消息方法的步驟:1272.2.4消息機制與消息循環(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消息機制與消息循環(huán)3、在類的實現(xiàn)文件中,使用ON1282.2.4消息機制與消息循環(huán)4、實現(xiàn)消息處理函數(shù)。該函數(shù)使用WPRAM和LPARAM參數(shù)并返回LRESULT。
LRESULTCMainFrame::OnHide(WPARAMwParam,LPARAMlParam){
MessageBox(_T("我的消息"));return0;
}
2.2.4消息機制與消息循環(huán)4、實現(xiàn)消息處理函數(shù)。該函數(shù)使1292.2.4消息機制與消息循環(huán)5、在適當?shù)臅r候發(fā)送自定義消息,進行消息處理。需要注意使用SendMessage還是PostMessage進行處理:SendMessage是消息處理完畢后再返回;而PostMessage則是把消息放到消息隊列后立即返回。
SendMessage(theApp.GetMainWnd()->GetSafeHwnd(),WM_PROGRESS,0L,0L);如果用戶需要整個系統(tǒng)唯一的消息,可以調用SDK函數(shù)RegisterWindowMessage并使用ON_REGISTER_MESSAGE宏指令取代ON_MESSAGE宏指令,其余步驟同上。2.2.4消息機制與消息循環(huán)5、在適當?shù)臅r候發(fā)送自定義消息1302.2.4消息機制與消息循環(huán)SendMessage函數(shù)原型LRESULTSendMessage(HWNDhWnd,UINTMsg,WPARAMwParam,LPARAMlParam)hWnd:其窗口程序將接收消息的窗口的句柄。Msg:指定被發(fā)送的消息號。wParam:指定附加的消息特定信息。lParam:指定附加的消息特定信息。返回值:返回值指定消息處理的結果,依賴于所發(fā)送的消息。2.2.4消息機制與消息循環(huán)SendMessage函數(shù)原1312.2.4消息機制與消息循環(huán)演示并編寫一個自定義消息應用程序,添加WM_PROGRESS消息。當程序運行時,則調用自定義消息處理函數(shù),輸出文本“自定義消息處理函數(shù)被調用!”。2.2.4消息機制與消息循環(huán)演示并編寫一個自定義消息應用程132消息傳遞標準Windows消息傳遞直線上溯命令消息傳遞迂回上溯消息傳遞標準Windows消息傳遞133第2章MFC應用程序課件134消息傳遞對于WM_COMMAND消息。框架窗口實際上是大多數(shù)WM_COMMAND消息的接受者,但WM_COMMAND消息還可以在視圖、文檔,甚至應用程序類中被處理。消息傳遞對于WM_COMMAND消息。框架窗口實際上是大多數(shù)135
文檔/視圖體系結構是MFC應用程序框架結構的基石,它定義了一種程序結構,這種結構利用文檔對象保存應用程序的數(shù)據(jù),依靠視圖對象控制視圖顯示數(shù)據(jù),文檔與視圖的關系是一對多的關系,也就是說,文檔中的數(shù)據(jù)可以以不同的方式顯示。2.3文檔與視圖文檔/視圖體系結構是MFC應用程序框架結構的基石,它1362.3文檔與視圖文檔負責數(shù)據(jù)讀取、存取以及其它的操作。CDocument類本身只是一個空殼,我們需要從它派生一個數(shù)據(jù)自已的類,并在類中聲明我們需要的變量,用以承載數(shù)據(jù)。CDocument類已經(jīng)為我們做好了一些重要的函數(shù),其中包括與View類的”溝通”函數(shù)、文檔存取等函數(shù)。2.3文檔與視圖文檔負責數(shù)據(jù)讀取、存取以及其它的操作。137表主要的CDocument操作2.3文檔與視圖表主要的CDocument操作2.3文檔與視圖138表主要的CDocument可覆蓋函數(shù)2.3文檔與視圖表主要的CDocument可覆蓋函數(shù)2.3文檔與視圖139
用戶可通過函數(shù)GetFirstViewPosition()和GetNextView()得到和文檔關聯(lián)的視圖的指針,代碼如下:POSITIONpos=GetFirstViewPosition();//得到視圖列表頭的位置While(pos!=NULL){CView*pView=GetNextView(pos); //獲得視圖列表中的視圖指針
…}
2.3文檔與視圖用戶可通過函數(shù)GetFirstViewPos1402.3文檔與視圖視圖類有兩個用途:提供文檔的可視化表示將用戶輸入(特別是鼠標和鍵盤消息)轉換為操作文檔數(shù)據(jù)的命令。MFC還包含了一組CView類的派生類,用來完成不同功能的視圖。2.3文檔與視圖視圖類有兩個用途:141CEditView:簡單的文本編輯器,類似NotepadCListView:基于列表的視圖,類似文件夾瀏覽CTreeView:基于樹狀控件的視圖,類似文件瀏覽左側的樹狀結構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ù)使用,用以標識出視圖類所屬的文檔。AppWizard為視圖類生成源代碼時,它覆蓋了基類的GetDocument函數(shù)。其強制轉換了m_pDocument為派生類指針。2.3文檔與視圖一個文檔可以具有與其聯(lián)系的多個視圖,而一個1432.3文檔與視圖表主要的CView可覆蓋函數(shù)2.3文檔與視圖表主要的CView可覆蓋函數(shù)1442.3文檔與視圖
OnInitialUpdate與OnUpdate在SDI中,視圖與文檔一樣,只構造一次,重復使用。在SDI中,每當文檔被打開或創(chuàng)建時,都要調用視圖的OnInitialUpdate()OnInitialUpdate()默認要調用OnUpdate()OnUpdate()的默認操作是使視圖客戶區(qū)無效并執(zhí)行重繪。在CView類的派生類中,如果重寫了OnInitialUpdate(),需要要調用CView::OnInitialUpdate(),否則新文檔被打開或創(chuàng)建時不會被更新。2.3文檔與視圖OnInitialUpdate與OnUp1452.3文檔與視圖CView::OnDraw何時調用:在WM_PAINT到來時(當視窗顯示區(qū)域的一部分顯示內容或者全部變?yōu)椤笩o效」,以致于必須「更新畫面」時,將由這個訊息通知程式。)在文檔被打印時什么是CDCDC:DeviceContext,設備描述表。在WM_PAINT到來時,DC指向屏幕設備在文檔被打印時,DC指向打印機設備2.3文檔與視圖CView::OnDraw何時調用:1462.3文檔與視圖OnPaint()與OnDrawWM_PAINT到來時會調用OnPaint()函數(shù),此函數(shù)在CView中被定義。WM_PRINT到來時會調用OnPrint()函數(shù),此函數(shù)在CView中被定義。兩個函數(shù)都調用了OnDraw(),并傳送不同的DC,分別代表屏幕設備與打印設備。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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025企業(yè)單方終止合同補償
- 2025地質勘察合同范本
- 2025委托開發(fā)合同范本協(xié)議
- 2025技術合作 科技創(chuàng)新與資本對接項目合同
- 2025家居設計代購簡約版合同范本
- 山東省泰安市2025屆高三二輪復習檢測語文試題及參考答案
- 2025年農(nóng)村房屋買賣合同范本
- 2025供暖設備供應合同(模板)
- 2025年購買二手別墅合同范本
- 2025版權質押合同深度分析
- 鑄造行業(yè)安全培訓課件
- 應急物業(yè)合同范本
- 《信息加密技術》課件
- 企業(yè)變更 備案 申請書
- 人教部編版八年級道德與法治上冊:8.2《堅持國家利益至上》聽課評課記錄3
- 《“長賜”輪擱淺蘇伊士運河事故探析及預防對策探究》7700字
- 2025年天翼云高級運維工程師認證參考試題庫(含答案)
- 加油站的員工培訓與技能提升
- 小米財務管理
- 光伏項目資產(chǎn)評估報告
- 《變態(tài)反應性皮膚病》課件
評論
0/150
提交評論