《c語言學(xué)習(xí)》PPT課件.ppt
《《c語言學(xué)習(xí)》PPT課件.ppt》由會員分享,可在線閱讀,更多相關(guān)《《c語言學(xué)習(xí)》PPT課件.ppt(166頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、作業(yè)提交地址:yg_,1,2,第一章 Visual C++集成開發(fā)環(huán)境簡介,,3,項目的創(chuàng)建與編譯、鏈接過程,4,Visual C++ IDE功能組成,編輯: AutoComplete、IntelliSense 編譯: 預(yù)編譯頭文件(stdafx.h),可以加快編譯速度 鏈接: 增量式鏈接、ProjectSettingsLinkLink Incrementally 調(diào)試:Edit ,16,顯示一個字符串,繪制設(shè)備上下文 BeginPaint() EndPaint(),17,添加資源,菜單 對話框,18,SDK程序向MFC程序轉(zhuǎn)變,第一步:WinMain改造為CWinApp 第二步:窗口函數(shù)改造
2、為消息映射,19,Win32 API應(yīng)用程序的修改,InitApplication InitInstance 消息映射結(jié)構(gòu)體,20,為什么使用MFC,是微軟提供的Windows編程接口 使應(yīng)用程序的結(jié)構(gòu)標(biāo)準(zhǔn)化 使應(yīng)用程序小而且快(DLL) Visual C++降低編碼復(fù)雜程度 MFC庫具有豐富的特性,21,第三章 用AppWizard創(chuàng)建的第一個MFC程序,目的:如何編制一個具有一定功能的MFC類庫應(yīng)用程序(引入簡單的視圖/文檔概念) 什么是視圖 用戶角度:與其他Windows窗口一樣的窗口 程序員:從MFC的Cview類派生的類的一個對象 單文檔界面和多文檔界面 單文檔:一次只能打開一個文檔
3、(NotePad) 多文檔:一次能打開多個文檔(Word),22,應(yīng)用程序的主要元素 WinMain函數(shù) CMyApp類----theApp CMyApp::InitInstance(); CMyApp::Run() ;//CMyApp::OnIdle() CMyFrame類 CMyFrame::OnLButtonDown、CMyFrame::OnPaint()、CMyFrame::OnDraw() 關(guān)閉主畫面窗口后關(guān)閉應(yīng)用程序。,23,MFC庫消息映射,MFC庫對Windows消息映射不采用虛擬函數(shù),而通過宏把特定的消息映射到派生類成員函數(shù)。主要是為避免大量的vtable開支。 菜單命令消息
4、和按扭消息的處理與Windows消息一樣。 一個MFC消息處理程序需要一個函數(shù)原型、一個函數(shù)體和一個在消息映射中的項。,24,MFC庫消息映射,afx_msg void OnLButtonDown(UINT nFlags,Cpoint point) CMyFrame::OnLButtonDown(UINT nFlags,CPoint point) BEGIN_MESSAGE_MAP(CMyFrame,CFrameWnd) ON_WM_LBUTTONDOWN() END_MESSAGE_MAP(),25,文檔和視圖,文檔----代表數(shù)據(jù)模型,基類是CDocument 視圖----代表用戶接口,基
5、類是Cview,26,第一個MFC程序,什么是視圖 用戶角度:與其他Windows窗口一樣的窗口 程序員:從MFC的Cview類派生類的一個對象 單文檔界面和多文檔界面 單文檔:一次只能打開一個文檔(NotePad) 多文檔:一次能打開多個文檔(Word) 在窗口中繪圖 通過響應(yīng)OnDraw()函數(shù)來完成繪圖 設(shè)備上下文 圖形設(shè)備對象,27,,資源編輯器 ex03a.rc包含 afxres.h(只讀符號) afxres.rc(通用組件) resource.h(自定義符號) Debug與Release目標(biāo) 啟用診斷宏(C:WINNTafx.ini TraceEnabled=1) Tools/MF
6、C Tracer/enable tracing 予編譯頭文件(stdafx.cpp stdafx.h),28,在視圖窗口中繪圖,通過修改OnDraw()函數(shù)來完成繪圖 是CView類的虛擬成員函數(shù),每次視圖重畫時調(diào)用(WM_PAINTOnPaintOnDraw) 如果程序的數(shù)據(jù)被改變,則可以調(diào)用視圖的Invalidate()成員函數(shù),并最終調(diào)用OnDraw() InvalidateWM_PAINTOnDraw() 對視圖窗口的重畫不要過于頻繁 畫圖過程中涉及的MFC類 設(shè)備上下文 其他圖形設(shè)備對象,29,設(shè)備上下文,Windows系統(tǒng)不允許直接操作顯示硬件,而是通過一個抽象層設(shè)備上下文來進(jìn)行通
7、訊 MFC編程中,設(shè)備上下文是CDC及其派生類的對象 添入代碼:,30,資源,資源編輯器 ex03a.rc包含 加速器、對話框、圖標(biāo)、菜單、字符串、工具條、版本信息 afxres.h(只讀符號),通用的MFC庫資源 afxres.rc(通用組件),通用的MFC庫資源 resource.h(自定義符號),31,Debug與Release目標(biāo),分兩個版本:發(fā)行版和調(diào)試版 區(qū)別:源碼調(diào)試、診斷宏、鏈接庫、編譯優(yōu)化等方面不同 啟用診斷宏(C:WINNTafx.ini TraceEnabled=1) Tools/MFC Tracer/enable tracing 予編譯頭文件(stdafx.cpp st
8、dafx.h) /Yc(stdafx.cpp)、/Yu(復(fù)用)、/Fp(pch文件路徑)編譯開關(guān),32,第四章 基本事件處理、映射模式,MFC類庫中有很多On-函數(shù)由框架調(diào)用,完成對事件的響應(yīng)。 他們不是虛擬函數(shù),必須通過消息映射結(jié)構(gòu),使應(yīng)用框架和我們的代碼關(guān)聯(lián) 消息映射 當(dāng)用戶在視圖中按下鼠標(biāo),Windows發(fā)送WM_LBUTTONDOWN消息給視圖窗口,視圖窗口必須有一個OnLButtonDown(UINT nFlags,CPoint point)成員函數(shù)來響應(yīng)該消息,頭文件中加入消息處理函數(shù)原型afx_msg void OnLButtonDown(UINT nFlags,CPoint p
9、oint),通過消息映射宏將框架和函數(shù)關(guān)聯(lián),將消息和消息的響應(yīng)函數(shù)連接的過程稱為消息映射。,33,消息映射的步驟:,定義函數(shù):void CMyView::OnLButtonDown(UINT nFlags,CPoint point) 函數(shù)原型:afx_msg void OnLButtonDown(UINT nFlags,CPoint point) 消息映射宏 BEGIN_MESSAGE_MAP() ON_WM_LBUTTONDOWN END_MESSAGE_MAP() 頭文件中添加: DECLARE_MESSAGE_MAP(),34,保存視圖的狀態(tài),通過一些狀態(tài)的變化反映事件,在引入文檔類之前
10、,存放在視圖的數(shù)據(jù)成員中 CRect m_rectEllipse;UINT m_nColor 數(shù)據(jù)成員初始化:放在視圖的構(gòu)造函數(shù)中 CEx04aView::CEx04aView():m_rectEllipse(0,0,200,200),m_nColor(GRAY_BRUSH),35,如何反映事件,鼠標(biāo)點擊不會引起重畫,需要調(diào)用: CWnd::InvalidateRect(LPRECT rect); 視圖的客戶區(qū): CRect,CSize,Cpoint及其相互運算 如何判斷點在矩形內(nèi)部 CRect rect; if(rect.PtInRect(point)... 如何判斷點在區(qū)域內(nèi)部 CRgn
11、rgn; rgn.CreateEllipticRgnIndirect(m_rectEllipse); if(rgn.PtInRegion(point)... 實例,36,映射方式,為使顯示與顯示分辨率無關(guān),應(yīng)使用不同于以像素為單位的坐標(biāo)系統(tǒng) 設(shè)備坐標(biāo)----以像素表示的坐標(biāo)值。 邏輯坐標(biāo)----當(dāng)前映射方式下的坐標(biāo)值。 映射方式----邏輯坐標(biāo)和設(shè)備坐標(biāo)之間的比例關(guān)系。 Windows映射方式,映射方式邏輯單位 MM_LOENGLISH 0.01 inch MM_HIENGLISH 0.001 inch MM_LOMETRIC 0.1 mm MM_HIMETRIC 0.01 mm MM_TWI
12、PS 1/1440 inch MM_TEXT1pixel,37,MM_TEXT映射方式,邏輯坐標(biāo)和設(shè)備坐標(biāo)1:1 坐標(biāo)X向右增加,坐標(biāo)Y向下增加 通過調(diào)用CDC的SetWindowOrg,SetViewportOrg改變原點 CMyView::OnDraw(CDC* pDC) pDC-SetMapMode(MM_TEXT); pDC-SetWindowOrg(CPoint(100,100)); //將邏輯坐標(biāo)(100,100)設(shè)置為窗口原點 ,38,自定義映射方式一:固定縮放的映射方式,向右X增加,向下Y減少,39,自定義映射方式二: 縮放可變的映射方式,可以改變縮放因子和原點 MM_ISOT
13、ROPIC和MM_ANISOTROPIC MM_ISOTROPIC縱橫比始終是1;1 MM_ANISOTROPIC可以分別改變X和Y縮放因子,40,坐標(biāo)轉(zhuǎn)換,一些重要的規(guī)則: CDC的成員函數(shù)使用邏輯坐標(biāo) CWnd的成員函數(shù)使用設(shè)備坐標(biāo) 在設(shè)備坐標(biāo)系中進(jìn)行擊鍵測試如(CRect::PtInRect) 用邏輯坐標(biāo)存儲長期的值。 CDC的函數(shù)LPtoDP和DPtoLP負(fù)責(zé)兩個系統(tǒng)之間的轉(zhuǎn)換。 在CView::OnPrepareDC()中完成映射方式設(shè)定。 編程示例,41,滾動窗口,當(dāng)窗口比屏幕大時,可能需要滾動視口。 通過從CScrollView中派生視圖類可以實現(xiàn)。 在OnInitialUpda
14、te()中定義邏輯大小和映射方式。 見舉例,42,第五章 圖形設(shè)備接口,所有與繪制有關(guān)的操作都要用到GDI元素 設(shè)備上下文是最重要的GDI元素,代表某個具體的物理設(shè)備,43,設(shè)備上下文類,基類是CDC,每個設(shè)備上下文對象有一個Windows設(shè)備上下文,由32位HDC句柄標(biāo)識 CDC類的虛擬性是應(yīng)用框架的一個重要特性。 顯示器上下文類:CClientDC、CWindowDC等,44,構(gòu)造和銷毀,構(gòu)造設(shè)備上下文對象后,應(yīng)及時銷毀,Windows限制可獲取設(shè)備上下文的數(shù)量。 構(gòu)造的兩種方法,45,設(shè)備上下文的狀態(tài),使用CDC對象繪圖時,屏幕上的內(nèi)容依賴于設(shè)備上下文的當(dāng)前狀態(tài): 繪圖需要的相關(guān)對象:筆
15、、刷子、字體 映射方式 其他方面(文本對齊方式、填充方式等),46,CPaintDC類,重寫了OnPaint函數(shù)后,需要用到CPaintDC類 OnPaint用正確設(shè)置的CPaintDC調(diào)用OnDraw();,47,圖形設(shè)備接口對象,CBitmap CBrush CFont CPalatte CPen CRgn,48,如何構(gòu)造和銷毀,一步構(gòu)造 CPen newPen(PS_DASHDOTDOT, 2, (COLORREF) 0); 先定義對象,再創(chuàng)建 CFont font; font.CreateFont(30, 10, 0, 0, 400, FALSE, FALSE, 0, ANSI_CHA
16、RSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_MODERN, Courier New); // TrueType 如何斷開其與設(shè)備上下文的關(guān)系 先選出設(shè)備上下文,然后析構(gòu) 庫存GDI對象自動析構(gòu),49,Windows顏色映射,Windows圖形設(shè)備接口提供獨立于硬件的顏色接口 程序中的絕對顏色代碼由圖形設(shè)備接口映射到視頻卡的某種或某幾種顏色的組合。 VGA模式下提供16種標(biāo)準(zhǔn)純色 256色視頻卡提供20種標(biāo)準(zhǔn)純色 16位顏色視頻卡,可以顯示32768中顏色。 24位真彩色。,
17、50,字體,字體是GDI對象 字體的選擇 與設(shè)備無關(guān)的True Type字體和與設(shè)備有關(guān)的字體(Windows系統(tǒng)顯示字體和LaserJet LinePrinter字體) MFC提供選擇準(zhǔn)確的打印機(jī)字體和大小,然后盡力使顯示最好。 打印字體 以磅來度量 顯示字體 顯示字體和打印字體一般不能嚴(yán)格匹配,除非使用MM_TEXT方式。,51,計算字符高度,,52,計算字符高度,字體高度=tmHeight-tmInternalHeight(點數(shù)) 行高=tmHeight+tmExternalLeading 對應(yīng)TEXTMETRIC和GetTextMetrics(,53,舉例1,,54,舉例2,,55,舉
18、例3,,56,第六章 模態(tài)對話框和Windows公用控件,模態(tài)和非模態(tài)對話框 模態(tài):在對話框關(guān)閉之前,不能轉(zhuǎn)到其他窗口工作 非模態(tài):可以轉(zhuǎn)到其他窗口,但對話框在最頂端,57,對話框與其他窗口類的不同,對話框是基于資源的,資源指定其包含的元素和布局。 對話框包含的窗口元素:控件 一個從CDialog類派生的MFC類完成和對話框界面的聯(lián)系,58,模態(tài)對話框編程,編程步驟 使用對話框編輯器創(chuàng)建對話框資源 ClassWizard生成派生對話框類 ClassWizard添加數(shù)據(jù)成員 ClassWizard消息映射 特殊控件初始化 在視圖中編寫代碼,激活對話框?qū)ο?舉例1,59,對話框的運行過程,Cdia
19、log::DoModal(),OnInitDialog,CDialog::OnInitDialog,CWnd::UpdateData(FALSE),DoDatExchange,Cdialog::OnOK,UpdateData(TRUE),60,增強(qiáng)對話框程序,控制OnOK的退出 OnCancel 處理 掛接滾動條控件 改進(jìn)的ex06a,61,識別控件,CWnd指針和控件ID GetDlgItem返回CWnd指針 GetDlgCtrlID返回ID 設(shè)置對話框背景和控件的顏色(WM_CTLCOLOR------OnCtlColor) 在對話框窗口內(nèi)部畫圖 運行時增加控件,62,Windows公用控
20、件,在Windows95中引入,NT也提供 包含在comctl32.dll動態(tài)連接庫中 窗口過程函數(shù)及窗口類注冊代碼包含在該庫中 DLL加載時注冊窗口類 對公用控件,ClassWizard不能提供數(shù)據(jù)成員支持,但提供通知消息的映射 應(yīng)在OnInitDialog和OnOK中分別初始化和讀取控件數(shù)據(jù),63,幾種Windows公用控件,進(jìn)度指示器控件,對應(yīng)C++類是CProgressCtrl,可以調(diào)用其成員函數(shù)SetRange和SetPos進(jìn)行初始化或更新操作 Slider(跟蹤欄控件),對應(yīng)的C++類是CSliderCtrl,不需要映射WM_HSCROLL和WM_VSCROLL即可滾動。,64,幾
21、種Windows公用控件,Spin(微調(diào)控件),對應(yīng)的C++類是CSpinButtonCtrl,經(jīng)常和一個編輯控件一起使用,稱“伙伴”,編輯控件的Tab順序僅在Spin之前。SetRange()和SetAccel()及AutoBuddy和Set Buddy Integer屬性,65,幾種Windows公用控件,列表控件,對應(yīng)的C++類是CListCtrl,需要一個圖片文件夾,CImageList類的對象 樹型控件,對應(yīng)的C++類是 CTreeCtrl,用HTREEITEM而不是整型索引,插入時使用TV_INSERTSTRUCT結(jié)構(gòu),66,控件通知消息結(jié)構(gòu),早期的Windows控件利用WM_CO
22、MMAND發(fā)送通知消息 對于Windows公用控件來說,標(biāo)準(zhǔn)的32位wParam和lParam參數(shù)是不夠的,67,控件通知消息結(jié)構(gòu),微軟提供WM_NOTIFY消息解決這一問題,其結(jié)構(gòu)如下: 舉例2,68,第七章 非模態(tài)對話框,本章介紹非模態(tài)對話框和Windows公用對話框 非模態(tài)對話框:在對話框活動的同時允許在其他地方工作。 公用對話框包括:文件、頁面設(shè)置、顏色選擇等,包含在comdlg32.dll中,69,非模態(tài)對話框,MFC中類CDialog為基類。 創(chuàng)建: (1)調(diào)用CDialog的缺省構(gòu)造函數(shù)構(gòu)造對象 (2)調(diào)用CDialog::Create(IDD)創(chuàng)建 可以通過向視圖發(fā)送用戶定義的
23、消息處理按鈕消息。 (1)SendMessage() (2)PostMessage(),70,舉例1,,71,Windows公用對話框,CColorDialog CFileDialog CFindReplaceDialog CPageSetupDialog CFontDialog CPrintDialog,72,直接使用公用對話框類,73,Windows公用對話框,派生新類 對話框嵌套 創(chuàng)建帶有一個特殊成組框的對話框(成組框ID=0 x045f),74,第八章 使用ActiveX控件,1991年推出VB,同時引入VBX VBX被證明是成功的,但它是16位段結(jié)構(gòu)的,不能移植到32位系統(tǒng) Acti
24、veX是基于COM技術(shù)的VBX的強(qiáng)有力的替代 ActiveX的開發(fā)可以用MFC和ATL ActiveX可以在VB和VC中使用,75,普通控件和ActiveX控件,普通控件 都是子窗口(經(jīng)常在對話框中使用) 通過MFC類對象操控 客戶程序負(fù)責(zé)創(chuàng)建控件的子窗口 控件向父窗口發(fā)送標(biāo)準(zhǔn)Windows消息(BN_CLICKED) 父窗口通過調(diào)用對應(yīng)控件的C++類的成員函數(shù)操作控件,76,普通控件和ActiveX控件,ActiveX控件 屬性和方法 屬性具有符號名字(可以匹配到整型索引)和類型 方法與函數(shù)非常相似 不是向控件容器發(fā)送WM_通知消息,而是“觸發(fā)”事件入Clicked事件 可以沒有窗口,窗口的
25、創(chuàng)建是通過控件自己(CreateIn place activation) 常用動態(tài)連接庫存放,但其擴(kuò)展名是OCX,77,使用ActiveX控件,安裝 拷貝相關(guān)文件到系統(tǒng)目錄下(*.ocx,*.hlp,*.lic等) 運行Regsvr32 注冊 將想要的控件加到項目中,78,ActiveX控件容器的編程,Calender控件 訪問屬性 控件的C++包裝類 AppWizard中對ActiveX的支持 AfxEnableControlContainer() Stdafx.h中的#include 利用ClassWizard添加針對ActiveX控件的數(shù)據(jù)成員和事件處理函數(shù),79,數(shù)據(jù)成員,可以向?qū)υ捒?/p>
26、類添加兩種數(shù)據(jù)成員 針對ActiveX控件某個屬性的,可以在控件顯示出來之前控制其屬性的值 針對ActiveX控件的對象數(shù)據(jù)成員,可以方便地操作屬性等 映射控件事件 將控件鎖定在內(nèi)存種 AfxOleLockControl(m_Cal.GetClsId()) AfxOleUnlockControl( 一個示例,80,第九章 Internet Explorer 4控件,發(fā)布IE4的同時,帶有新的COMCTL32.DLL,稱IE4公用控件 IE4公用控件介紹 日期和時間選取器 月歷 IP協(xié)議地址控件 擴(kuò)展組合框 示例,81,第十章 位圖,位圖就是一個位矩陣,影射到顯示器的象素點上。 GDI位圖和DI
27、B位圖 GDI位圖由MFC的類Cbitmap代表 GDI位圖在同一臺機(jī)器的不同程序間可以傳輸,但不同機(jī)器間不可以 DIB帶有自己的顏色信息 彩色位圖和單色位圖,82,使用GDI位圖,位圖也是GDI對象之一 首先創(chuàng)建位圖 創(chuàng)建內(nèi)存設(shè)備上下文CreateCompatibleDC 將位圖選入內(nèi)存設(shè)備上下文SelectObject 從內(nèi)存設(shè)備上下文將位圖畫到實際的設(shè)備上下文BitBlt或StretchBlt(),83,使用GDI位圖,從資源中裝載位圖,84,映射模式的效果,如果映射模式不是MM_TEXT,則位圖可能會變形 使用pDC-SetStretchBltMode(COLORONCOLOR);調(diào)用
28、可以使顯示效果好一些 也可以通過位圖拉伸解決問題 示例,85,DIB位圖/調(diào)色板編程,如果你的程序顯示單一DIB位圖 創(chuàng)建邏輯調(diào)色板(包含DIB位圖的顏色信息) 將邏輯調(diào)色板“實現(xiàn)”到硬件系統(tǒng)調(diào)色板中 如果你的程序是前臺程序,實現(xiàn)過程將把DIB位圖的所有顏色拷貝到系統(tǒng)調(diào)色板(236種顏色,20種由系統(tǒng)保留) 如果另一個程序是前臺程序,且要顯示236級的綠色場景,則在你的邏輯調(diào)色板和系統(tǒng)調(diào)色板之間建立映射,假如有一個品紅色,則將被映射位標(biāo)準(zhǔn)紅色,如果忘了實現(xiàn)調(diào)色板,則將被映射為綠色,86,何時“實現(xiàn)”調(diào)色板,任何程序?qū)崿F(xiàn)其調(diào)色板的時候,你的程序的主窗口將收到WM_PALETTECHANGED消息
29、 你程序中的任何一個窗口得到焦點時,WM_QUERYNEWPALETTE消息發(fā)送 在主框架窗口中應(yīng)響應(yīng)這兩種消息 用pDC-SelectPalette()將邏輯調(diào)色板選入 用RealizePalette 實現(xiàn),87,DIB、象素和顏色表,一個DIB由一個兩維的象素矩陣組成 每個象素由1、4、8、16、32個位組成 對于16bpp、24bpp、32bpp的DIB,每個象素是一個RGB顏色 1bpp、4bpp、8bpp的DIB,有一個顏色表,每個象素是一個指向顏色表的索引 當(dāng)需要顯示的顏色多于顯示卡能顯示的顏色時: 如果DIB包含重要顏色表 CreateHalftonePalette,88,DIB
30、位圖的結(jié)構(gòu),89,DIB位圖的結(jié)構(gòu),BITMAPFILEHEADER結(jié)構(gòu) 包含到映象位矩陣的偏移量 BITMAPINFOHEADER DIB位映象按列、行組織 從最底行開始 每行填充到4字節(jié)對齊,90,DIB存取函數(shù),SetDIBitsToDevice:按一個位圖位顯示成一個顯示象素或一個打印點顯示 StretchDIBits:類似于StretchBlt() GetDIBits從一個GDI位圖構(gòu)建DIB CreateDIBitmap:從DIB構(gòu)建GDI位圖 CreateDIBSection:創(chuàng)建一個稱為DIB段的特殊DIB,返回一個GDI位圖句柄,91,構(gòu)建自己的Cdib類,示例,92,在按扭
31、上放置位圖,,93,第四部分 MFC文檔/視圖結(jié)構(gòu)詳解,,94,第一章 菜單、鍵盤加速器及屬性表,本章的主要內(nèi)容是菜單和命令路由架構(gòu) 同時介紹: 框架、文檔和視圖的關(guān)系 命令用戶接口更新函數(shù) 鍵盤加速器 以RichText控件和屬性表來介紹,95,主框架窗口,主框架窗口管理菜單條、標(biāo)題條、工具條、狀態(tài)條及視圖窗口,96,Windows菜單,一般由水平菜單列表及附屬的彈出式菜單組成 一般為框架窗口定義默認(rèn)的菜單資源,創(chuàng)建時自動裝載 也可以定義獨立的菜單,用戶程序負(fù)責(zé)裝載,97,鍵盤加速鍵,選擇菜單命令的快捷方式(定義菜單時字母前導(dǎo) Windows應(yīng)用的啟動過程 Windows將程序載入內(nèi)存 構(gòu)造
32、全局對象theApp Windows調(diào)用全局函數(shù)WinMain()AfxWinMain WinMain尋找唯一的一個CWinApp的派生類的對象 WinMain調(diào)用theApp的InitInstance()函數(shù) 重寫的InitInstance()啟動載入文檔并顯示主框架窗口和視圖窗口的進(jìn)程 WinMain調(diào)用theApp的Run()函數(shù),進(jìn)入消息循環(huán),127,文檔模板類,建立了應(yīng)用類、文檔類、視圖類、框架窗口類之間的關(guān)系 MFC類中的DECLARE_DYNCREATE和實現(xiàn)部分的IMPLEMENT_DYNCREATE保證可以動態(tài)創(chuàng)建對象 對象的動態(tài)構(gòu)造,解決了用戶編碼復(fù)雜度問題; 使用RUNT
33、IME_CLASS宏通知框架,128,對象間的關(guān)系見圖,129,文檔模板資源,AddDocTemplate()的第一個參數(shù)是IDR_MAINFRAME,是字符串表的一個資源編號 其結(jié)構(gòu)如下:,130,CWinApp::OnFileNew(),在調(diào)用完InitInstance()之后,調(diào)用CWinApp::OnFileNew()通過CWinApp::ProcessShellCommand完成如下操作: 構(gòu)造文檔對象,但不載入數(shù)據(jù)(串行化) 構(gòu)造主框架對象,并創(chuàng)建主框架窗口(IDR_MAINFRAME菜單,工具條,狀態(tài)條),但不顯示 構(gòu)造視圖對象,并創(chuàng)建視圖窗口,但不顯示 建立文檔、主框架、視圖對
34、象之間的關(guān)系 調(diào)用虛擬CDocument::OnNewDocument,該函數(shù)調(diào)用 DeleteContents (實際中經(jīng)常需要重寫) 調(diào)用視圖的CView::OnInitialUpdate 函數(shù) 對框架對象調(diào)用虛擬的CFrameWnd::ActivateFrame ,顯示主框架窗口、菜單,工具條,狀態(tài)條,131,關(guān)于文檔類的其他操作,OnNewDocument()函數(shù),完成一些初始化操作 將文件打開操作和串行化代碼關(guān)聯(lián) 提示用戶選擇文件 對已存在的文檔對象,調(diào)用CDocument::OnOpenDocument ,該函數(shù)調(diào)用CDocument::DeleteContents,創(chuàng)建歸檔對象,
35、調(diào)用Serialize載入數(shù)據(jù) 調(diào)用CView::OnInitialUpdate() 文檔類的DeleteContents()虛擬函數(shù):如果你要從磁盤載入文檔數(shù)據(jù)(OnFileNew和OnFileOpen),先調(diào)用這個函數(shù),一般要重寫; 將存盤和另存操作和Serialize()關(guān)聯(lián),兩個操作都要調(diào)用OnSaveDocument(),OnSaveDocument()要調(diào)用Serialize() 文檔“臟”標(biāo)志,文檔類的數(shù)據(jù)成員m_bModified表示,通過SetModifiedFlag()和IsModified() 示例,132,第五章 MDI應(yīng)用程序的文檔讀寫,多文檔應(yīng)用程序與單文檔應(yīng)用程序
36、的啟動流程基本一致 多文檔模板類CMultiDocTemplate MDI框架窗口和子窗口:一個MDI應(yīng)用擁有一個主框架窗口和多個子框架窗口 主框架窗口直接創(chuàng)建,而子框架窗口則在打開時創(chuàng)建,133,MDI應(yīng)用程序的資源,主框架和文檔模板資源 MDI應(yīng)用有兩個獨立的字符串和菜單資源分別由IDR_MAINFRAME和IDR_EXnnTYPE,前者代表只有空的主框架窗口時的資源,134,OnFileNew函數(shù),構(gòu)造文檔對象,但不載入數(shù)據(jù) 構(gòu)造子窗口對象,創(chuàng)建子窗口,但不顯示 構(gòu)造視圖對象,創(chuàng)建視圖窗口,但不顯示 建立文檔、子框架、視圖對象之間的關(guān)聯(lián) 調(diào)用OnNewDocument 調(diào)用OnIniti
37、alUpdate 對子框架窗口調(diào)用ActivateFrame,135,對已存在的文檔,創(chuàng)建另外的視圖,構(gòu)造子窗口對象,創(chuàng)建子窗口,但不顯示 構(gòu)造視圖對象,創(chuàng)建視圖窗口,但不顯示 建立文檔、子框架、視圖對象之間的關(guān)聯(lián) 調(diào)用OnInitialUpdate 對子框架窗口調(diào)用ActivateFrame,136,第六章 打印和打印予覽,Windows通過提供各種打印機(jī)的驅(qū)動程序和統(tǒng)一的編程接口簡化了打印編程,對編程用戶透明 標(biāo)準(zhǔn)打印機(jī)對話框 交互打印紙張選擇 打印時顯示顯示打印狀態(tài)(張數(shù)/打印張數(shù)),137,打印機(jī)編程,MFC框架為打印及打印予覽完成了大部分功能,為此必須了解打印過程中函數(shù)調(diào)用序列及哪些
38、函數(shù)要重寫; 打印需要的設(shè)備上下文由框架生成,并作為參數(shù) 顯示: OnPaint-OnDraw,顯示設(shè)備上下文 打?。篛nPrint-OnDraw,打印機(jī)設(shè)備上下文 OnPrint():每打印一頁,調(diào)用一次,可以添加打印特有的代碼,或也可以選擇不調(diào)用OnDraw,實現(xiàn)顯示與打印完全獨立; OnPrepareDC:,可以設(shè)置不同的映射模式,在OnPrint之前調(diào)用; OnPreparePrinting:是第一個調(diào)用的函數(shù),可以設(shè)置頁碼等; OnBeginPrinting:OnEndPrinting,138,打印機(jī)編程,幾個函數(shù)之間的關(guān)系: OnPreparePrinting:設(shè)置頁碼 OnBeg
39、inPrinting:創(chuàng)建GDI對象 OnPrepareDC:設(shè)置映射模式 OnPrint():具體完成打印 OnEndPrinting:刪除GDI對象,139,第五部分 MFC程序設(shè)計的其他方面,,140,第1章 多線程程序設(shè)計,非搶占式多任務(wù)和搶占式多任務(wù) 通過定時器實現(xiàn)的多任務(wù) 多線程編程 使用事件使線程同步,141,單線程程序消息處理,迄今為止所有實例為單線程,只有一個執(zhí)行路徑; 消息處理過程如下: MSG message; while (::GetMessage( 沒有消息時程序掛起;消息到來,喚醒,獲得消息、處理消息,142,Win32為搶占式多任務(wù) 可以在計算量很大的函數(shù)中
40、采用放棄控制權(quán)的方法避免死鎖; 一個使用定時器的實例,143,多線程編程主要工作: 定義全局或靜態(tài)函數(shù),其形式為: UINT FuncName(LPVOID pParam) 啟動線程: CWinThread* pThread = AfxBeginThread(FuncName, pParam, THREAD_PRIORITY_NORMAL); 線程間交互: 全局變量(::InterLockedIncrement()) 消息,144,線程同步的幾種技術(shù): 事件、關(guān)鍵段、互斥、信號量 使用事件使線程同步 使用CEvent類,包含afxmt.h; 定義相應(yīng)的CEvent對象,對象狀態(tài)為有信號和無信號
41、; 使用WaitForSingleObject和WaitForMultiObject在線程中獲取信號狀態(tài),達(dá)到控制線程的目的;,145,第2章 動態(tài)連接庫程序設(shè)計,Win32動態(tài)連接庫 靜態(tài)連接MFC的常規(guī)動態(tài)連接庫 共享連接MFC的常規(guī)動態(tài)連接庫 共享連接MFC的擴(kuò)展動態(tài)連接庫,146,Win32動態(tài)連接庫,在不使用MFC功能的情況下 通過AppWizard生成Win32 DLL框架 加入要輸出的函數(shù)、變量、類 __declspec(dllexport)指定作為輸出函數(shù) __declspec(dllimport)在引用程序中指定輸入,147,Win32動態(tài)連接庫的引用,VC++下引用 需要庫
42、文件*.lib 需要頭文件 VB下引用 函數(shù)的調(diào)用格式是:_stdcall(或WINAPI) 需要模塊定義文件*.def,將函數(shù)名和順序號成對映射,148,客戶程序定位DLL順序,包含EXE文件的目錄 進(jìn)程的當(dāng)前目錄 Windows系統(tǒng)目錄 Windows目錄 列在Path環(huán)境變量中的目錄,149,靜態(tài)連接MFC的常規(guī)動態(tài)連接庫,可以適用于任意Win32編程環(huán)境(包括VB) DLL的大小比共享連接MFC時大 *.def文件 示例,150,共享連接MFC的常規(guī)動態(tài)連接庫,可以適用于任意Win32編程環(huán)境(包括VB) 要求目標(biāo)機(jī)器上有合適的MFC動態(tài)連接庫 *.def文件 示例,151,共享連接M
43、FC的擴(kuò)展動態(tài)連接庫,能導(dǎo)出C++類,將宏AFX_EXT_CLASS加入到類聲明中,如: class AFX_EXT_CLASS_CStudent:public Cobject 擴(kuò)展DLL資源的搜索順序: EXE需要資源時:(1)EXE (2)擴(kuò)展DLL (3)MFC庫 擴(kuò)展DLL需要資源時: (1)擴(kuò)展DLL (2)MFC DLL (3)EXE 可以如下改變搜索順序:,152,第3章 TCP/IP網(wǎng)絡(luò)程序設(shè)計,基于Socket的套接字編程實例。,153,建立基于Socket程序的步驟,Socket程序分服務(wù)器端和客戶端2部分AppWizard生成2個框架程序在各自InitInstance()
44、中執(zhí)行AfxSocketInit()函數(shù),框架初始化Socket套接字。服務(wù)器端需要一個監(jiān)聽套接字和若干伙伴套接字(異步套接字對象)客戶端需要一個用于連接的套接字對象,154,服務(wù)器端流程,155,客戶端流程,156,建立服務(wù)器端框架程序,157,建立客戶端框架程序,158,第4章 數(shù)據(jù)庫程序設(shè)計,關(guān)系數(shù)據(jù)庫基本概念 表、列、記錄、游標(biāo)、事務(wù) SQL語言: SELECT、INSERT、DELETE、UPDATE MFC支持以下數(shù)據(jù)庫接口 ODBC(OPEN DATABASE CONNECTIVITY) DAO(DATA ACCESS OBJECT) OLE DB ADO(ACTIVEX DAT
45、A OBJECT),159,4.1 DAO,微軟提供的針對Microsoft Jet數(shù)據(jù)庫引擎的接口 提供CDaoWorkspace、CDaoDatabase、CDaoRecordset、CDaoTableDef、CDaoQueryDef等類,160,4.2 ODBC/MFC,ODBC是訪問不同數(shù)據(jù)庫的通用接口,以API函數(shù)的形式提供 MFC ODBC是微軟對通用ODBC API以類的形式進(jìn)行了封裝 提供CDatabase、CRecordSet、CRecordView類 必須覆蓋的虛擬成員函數(shù):GetDefaultSQL(),GetDefaultConnect(),161,4.3 ADO,AD
46、O是以組COM組件,可以以不同方式使用 VC++下使用其C++接口 提供ADOConnection、ADORecordset、ADOCommand、ADOField、ADOProperty、ADOParameter等類,162,ADO編程步驟,包含相關(guān)頭文件 #include #include #include 從CADORecordBiding類派生數(shù)據(jù)存取類,以將數(shù)據(jù)源的數(shù)據(jù)綁定到程序中 調(diào)用CoInitialize初始化COM 調(diào)用CoCreateInstance創(chuàng)建ADOConnection和ADOCommand實例,163,ADO編程步驟,創(chuàng)建或獲取一個ADORecordset實例
47、從這個記錄集對象獲取一個IADORecordBinding接口的指針 用Open方法打開已建立的記錄集(如是命令結(jié)果則不必) 調(diào)用IADORecordBinding的BindToRecordset函數(shù)綁定 然后進(jìn)行瀏覽、插入、刪除、更新操作 示例,164,4.4 OLE DB,數(shù)據(jù)存取技術(shù)從數(shù)據(jù)庫發(fā)展向更一般的數(shù)據(jù)源 軟件開發(fā)的發(fā)展要求:使用組件形式的可重用軟件包 兩者結(jié)合導(dǎo)致UDA即統(tǒng)一數(shù)據(jù)存?。║niversal Data Access) UDA的重要組件:OLE DB 微軟還提供另一種獨立于語言的接口ADO,是基于OLE DB的,165,OLE DB,定義了以組接口,用于和一般的數(shù)據(jù)源交互,提供和消費數(shù)據(jù) 基于COM的 在標(biāo)準(zhǔn)的C/S模式中,數(shù)據(jù)的源成Provider,數(shù)據(jù)的使用者稱consumer 我們介紹OLE DB consumer程序的設(shè)計,166,OLE DB Consumer程序的設(shè)計,在工程中加入數(shù)據(jù)庫和COM支持 #include #include 初始化ATL 選擇數(shù)據(jù)源 針對數(shù)據(jù)集類編程 示例,
- 溫馨提示:
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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 建筑施工重大危險源安全管理制度
- 安全培訓(xùn)資料:典型建筑火災(zāi)的防治基本原則與救援技術(shù)
- 企業(yè)雙重預(yù)防體系應(yīng)知應(yīng)會知識問答
- 8 各種煤礦安全考試試題
- 9 危險化學(xué)品經(jīng)營單位安全生產(chǎn)管理人員模擬考試題庫試卷附答案
- 加壓過濾機(jī)司機(jī)技術(shù)操作規(guī)程
- 樹脂砂混砂工藝知識總結(jié)
- XXXXX現(xiàn)場安全應(yīng)急處置預(yù)案
- 某公司消防安全檢查制度總結(jié)
- 1 煤礦安全檢查工(中級)職業(yè)技能理論知識考核試題含答案
- 4.燃?xì)獍踩a(chǎn)企業(yè)主要負(fù)責(zé)人模擬考試題庫試卷含答案
- 工段(班組)級安全檢查表
- D 氯化工藝作業(yè)模擬考試題庫試卷含答案-4
- 建筑起重司索信號工安全操作要點
- 實驗室計量常見的30個問問答題含解析