




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、 Windows編程基礎1本課程旨在向?qū)W員介紹:1掌握GDI基礎應用2掌握框架應用程序開發(fā)過程3深入透徹理解框架應用程序時間:學時6教學方法:講授+課上練習+課下作業(yè)第七章GDI基礎及框架應用程序解析2 3從需求開始編寫一個單文檔應用程序,程序運行后界面顯示:”這是一個單文檔應用程序!” . 4三種典型的Visual C +應用程序使用AppWizard 創(chuàng)建項目時可以選擇三種類型的應用界面即單文檔、多文檔和基于對話框的應用程序。單文檔程序一次只能打開一個文件或文檔,如記事本程序。多文檔程序一次可以打開多個文檔,如word 程序。使用AppWizard 創(chuàng)建單文檔和多文檔程序幾乎一樣,差別在于
2、:在創(chuàng)建SDI 界面的應用程序時,生成CMainFrame 類,CMainFrame 類的基類為CFrameWnd 在創(chuàng)建MDI 界面的應用程序時,CMainFrame 類的基類為CMDIFrameWnd ,生成CMDIChildWnd 類 5每次當視窗需要被重新繪制時,應用程序框架就要調(diào)用OnDraw 函數(shù)。驅(qū)使程序調(diào)用OnDraw 的兩個途徑:用戶改變窗口的尺寸;窗口恢復先前被遮蓋的部分;應用程序改變了窗口數(shù)據(jù);程序中調(diào)用Invalidate (或者InvalidateRect ,通知Windows 調(diào)用OnDraw 函數(shù)OnDraw 成員函數(shù) MFC中有許多類,但只有少數(shù)幾個核心的類會對
3、應用程序的基本框架產(chǎn)生影響,它們分別是CWinAppCDocumentCViewCFrameWndCDocTemplate這5個類構(gòu)成了大部分MFC文檔/視圖框架應用程序的核心,6 MFC并不是直接利用這些類生成框架,而是使用他們的派生類?;惻缮怌WinApp CHelloAppCFrameWnd CMainFrameCDocument CHelloDocCView CHelloView使用派生類優(yōu)點繼承基類功能繼承了框架方便增加新功能7 8應用程序類和框架窗口類應用程序類(CWinApp : 用MFC 編寫的程序中唯一必不可少的類就是CWinApp ,它控制程序的流程??蚣艽翱?CFra
4、meWnd 框架窗口是應用程序的頂層窗口,通常是WS _OVERLAPPEDWINDOW 樣式的窗口,帶有可縮放邊框,標題欄、系統(tǒng)菜單以及最小化、最大化和關閉按鈕,它擔當了視圖的容器SDI 應用程序只有一個框架窗口CFrameWnd ,它被用作應用程序的頂層窗口并來包含視圖。MDI 應用程序使用兩種不同類型的框架窗口,其中CMDIFrameWnd 用作頂層窗口,而CMDIChildWnd 在頂層窗口中浮動用來包含應用程序文檔的視圖 在文檔/視圖結(jié)構(gòu)中,文檔是用來管理和組織數(shù)據(jù)的。CDocument類支持文檔的標準操作,為了在應用程序中處理文檔,首先應該從CDocument類派生出一個屬于自己的
5、文檔類,并且在類中聲明一些成員變量,用來存放數(shù)據(jù);然后完成讀取和修改文檔數(shù)據(jù)的成員函數(shù);最后再至少重載專門負責文件讀寫操作的Serialize( 函數(shù)。9 10在使用MFC 創(chuàng)建新的應用程序框架時,AppWizard 準備好了文檔類的空殼class CHelloDoc : public CDocument protected : CHelloDoc (; DECLARE _DYNCREATE (CHelloDoc public : virtual BOOL OnNewDocument (; virtual void Serialize (CArchive & ar ; ; 11視圖類-1/4在
6、文檔/視圖結(jié)構(gòu)中,視圖的作用是顯示和編輯文檔數(shù)據(jù),提供用戶與文檔數(shù)據(jù)的交互接口。視圖在MFC 的CView 類里被實例化。在開發(fā)應用程序時,應該從CView 類派生出一個屬于自己的視圖類,并且在類中至少改寫專門負責顯示數(shù)據(jù)的OnDraw (函數(shù)或OnPrint (函數(shù)。 12視圖類-2/4class CHelloView : public CView /派生出一個屬于自己的視圖類protected : / create from serialization onlyCHelloView (; DECLARE _DYNCREATE (CHelloView public :CMyDoc * Get
7、Document (; /得到與之相關聯(lián)的文檔對象的指針public :virtual void OnDraw (CDC * pDC ; / 負責顯示數(shù)據(jù)的OnDraw (函數(shù) virtual BOOL PreCreateWindow (CREATESTRUCT & cs ;protected :virtual BOOL OnPreparePrinting (CPrintInfo * pInfo ; virtual void OnBeginPrinting (CDC * pDC , CPrintInfo * pInfo ;public :virtual CHelloView (; ; CVie
8、w類和它的9個派生類封裝了視圖的各種不同的功能,它們?yōu)橛脩魧崿F(xiàn)最新的Windows特性提供了很大的便利。這些派生視圖類也可以作為用戶程序中視圖類的基類,而將這些視圖類設置為基類的最基本的方法是在MFCAPPWizard創(chuàng)建SDI/MDI的第6步中進行基類的選擇。這些視圖類如下表所示。13 1415框架窗口、文檔、視圖類關系 16文檔模板(Document Template 文檔模板定義了文檔、視圖和框架窗口這3個類的關系。MFC 提供了一個文檔模板類CDocTemplate 支持文檔模板。文檔模板類是一個抽象的基類,它定義了文檔模板的基本處理函數(shù)接口。由于它是一個抽象基類,因此不能直接用它來定
9、義對象而必需用它的派生類。對一個單文檔界面程序,使用CSingleDocTemplate 類,而對于一個多文檔界面程序,使用CMultipleDocTemplate 類。 17應用實例應用實例1:小球運動基礎版,實現(xiàn)小球從左上角到右下角移動應用實例2:小球運動升級版,當小球碰到邊界是,實現(xiàn)反彈功能。圖形設備接口Windows操作系統(tǒng)具有豐富的圖形界面,可以說圖形是Windows應用程序的主體,這些圖形包括一般的幾何圖形、位圖、光標形狀、甚至文本。為了實現(xiàn)Windows應用程序的圖形化,Windows操作系統(tǒng)提供了大量的函數(shù),實現(xiàn)繪圖要求,這些函數(shù)的集合,我們稱之為圖形設備接口。GDI的結(jié)構(gòu):從
10、程序員的角度來看,GDI由幾百個函數(shù)調(diào)用和一些相關的數(shù)據(jù)類型和宏組成。在GDI32.DLL中。(Window三大模塊:KERNEL32.DLL、USER32.DLL 、GDI32.DLL18 在Windows應用程序中,應用程序的輸出并不直接面向物理設備,如顯示屏或打印機,而是針對一個稱之為設備描述表(Device Context的邏輯設備進行操作,設備環(huán)境與實際設備之間的信息傳送由Windows直接管理。設備描述表(Device Context簡稱為DC,也稱設備上下文、設備環(huán)境,是一種包含各種繪圖屬性(如前面所說的字體、顏色和方法(即各種繪圖函數(shù)的數(shù)據(jù)結(jié)構(gòu),它定義了設備、畫圖工具和畫圖信息
11、,它不僅可以繪制各種圖形,而且還可以確定在應用窗口中繪制圖形的方式和圖形的樣式,它是應用程序與輸出設備之間的橋梁。19 如果想在一個圖形輸出設備上繪圖:首先獲得一個DC的句柄(類型:HDC在GDI函數(shù)中將這個句柄作為一個參數(shù),告訴Windows你想在這個設備上進行繪圖。20 21設備描述表-3/3得到DC 句柄后,Windows 會使用默認的屬性值,然后將這些屬性值填入到設備表結(jié)構(gòu)。可以通過設置設備描述表屬性的GDI 函數(shù)改變這些屬性值。通過GDI 獲取屬性信息函數(shù)可以取得這些屬性的當前值。還有其他的一些GDI 繪圖函數(shù)可以實現(xiàn)在客戶區(qū)上繪圖。 22MFC 中的設備描述表在MFC 編程中,設備
12、描述表被封裝成類。在MFC 編程方式中,程序員不用捕獲設備描述表句柄和調(diào)用GDI 輸出函數(shù),而是通過創(chuàng)建一個設備描述表對象并調(diào)用它的成員函數(shù)來實現(xiàn)畫圖和文本顯示。MFC 的CDC 類將Windows 設備描述表和獲取設備描述表句柄的GDI 函數(shù)封裝在一起,而CDC 的派生類如CPaintDC 和CClientDC 則代表Windows 應用程序使用不同類型的設備描述表。CObjectCDCCClientDCCWindowDCCPaintDCCMetaFileDC23 CDC類它是所有設備描述表的基類.CPaintDC類這是創(chuàng)建響應WM_PAINT消息的DC,僅限于OnPaint處理程序,也就是
13、說通常它在OnPaint應用程序的OnPaint函數(shù)中使用,注意OnPaint函數(shù)會調(diào)用OnDraw函數(shù)。CClientDC類這是客戶區(qū)設備描述表,在窗口中畫圖可以使用這個類(除了WM_PAINT消息外。24 CWindowDC類這是代表整個窗口的設備描述表,包括客戶區(qū)和非客戶區(qū)CMetaFileDC類這是代表Windows圖元文件的DC。25CWindowDC、CPaintDC、CClientDC比較繪圖區(qū)域不同用CPaintDC和CClientDC類的對象繪制圖形時,繪制區(qū)只能是客戶區(qū),而不能在非客戶區(qū);而CWindowDC可以在非客戶區(qū)進行繪圖。繪圖坐標系不同在CWindowDC繪圖類下
14、,坐標系是建立在整個屏幕之上的,在像素坐標方式下,坐標原點在屏幕的左上角。而CPaintDC和CClientDC類的坐標系是建立在客戶區(qū)上的,在像素坐標方式下,坐標原點在客戶區(qū)的左上角。2627CDC 設備描述表屬性函數(shù)CDC :GetMapMode CDC :SetMapMode MM _TEXT 映射模式CDC :SelectObject CDC :SelectObject WHITE _BRUSH 當前畫刷CDC :SelectObject CDC :SelectObject BLACK _PEN 當前畫筆CDC :GetTextColor CDC :SetTextColor Black
15、 文本顏色獲取函數(shù)設置函數(shù)缺省值屬性 28方法1:GetDC 函數(shù)最常用的調(diào)用形式有兩種,一種是Windows API 函數(shù)形式,如下:HDC GetDC (HWND hWnd / handle to window;該函數(shù)只有一個參數(shù),此參數(shù)是想要獲得的DC 所在的窗口的句柄,如果該參數(shù)為NULL ,那么得到的DC 將是整個屏幕釋放函數(shù)格式:int ReleaseDC ( HWND hWnd , HDC hDC 另一種是CWnd 類的成員函數(shù),如下:CDC * GetDC ( ;int ReleaseDC ( CDC * pDC ; 29方法2:BeginPaint 函數(shù)其最常用的調(diào)用形式也有
16、兩種,一種是Windows API 函數(shù)形式,如下:HDC BeginPaint ( HWND hwnd , LPPAINTSTRUCT lpPaint ;該函數(shù)有兩個參數(shù),一個是需要重繪的窗口的句柄,另一個是指向結(jié)構(gòu)PAINTSTRUCT 變量的指針。釋放函數(shù)格式:BOOL EndPaint ( HWND hWnd ,CONST PAINTSTRUCT *lpPaint ;另一種常用的形式是CWnd 類的成員函數(shù),如下:CDC * BeginPaint ( LPPAINTSTRUCT lpPaint 釋放函數(shù)格式:void EndPaint ( LPPAINTSTRUCT lpPaint ;
17、 方法3:直接構(gòu)造CDC對象該方法是用聲明一個CDC類或其派生類對象的方式來獲取。方法如下:CClientDC dc( CWnd* ;此時構(gòu)造的是一個對象。這種方法實際上是間接使用了GetDC成員函數(shù)。因為當一個C+類聲明一個對象時,系統(tǒng)會自動調(diào)用該類的構(gòu)造函數(shù),而在CClient類的構(gòu)造函數(shù)中就調(diào)用了GetDC函數(shù)。當這個對象被釋放時,又會自動調(diào)用該類的析構(gòu)函數(shù),在析構(gòu)函數(shù)中則調(diào)用了ReleaseDC函數(shù),用例釋放設備描述表。30 31關于設備描述表使用說明當在棧上構(gòu)造DC ,若對象的生命周期結(jié)束,則它的析構(gòu)函數(shù)會被自動調(diào)用,而且析構(gòu)函數(shù)一旦被調(diào)用,設備描述表就會返回給Windows 。當在
18、堆上用new 創(chuàng)建設備描述表(DC 時,要注意親自釋放設備描述表,如:CPaintDC * pDC =new CPaintDC (this ;在這種情況下,有必要在創(chuàng)建設備描述表的函數(shù)結(jié)束之前執(zhí)行刪除語句。delete pDC ; 32MFC 框架封裝的OnPaint (函數(shù)void CView :OnPaint ( CPaintDC dc (this ; OnPrepareDC (&dc ; OnDraw (&dc ; 說明:CPaintDC 的構(gòu)造函數(shù)自動調(diào)用BeginPaint 函數(shù),析構(gòu)函數(shù)中自動調(diào)用EndPaint 函數(shù) 第一個WM_PAINT消息大多數(shù)應用程序在WinMain中進入
19、消息循環(huán)之前的初始化期間都會調(diào)用函數(shù)UpdateWindow。Windows利用這個機會給窗口過程發(fā)送第一個WM_PAINT消息什么情況會產(chǎn)生WM_PAINT消息?在用戶移動或顯示窗口時,窗口中先前被隱藏的區(qū)域重新可見;用戶改變窗口的大小。程序使用ScrollWindow或ScrollDC函數(shù)滾動客戶區(qū)的一部分;程序使用InvalidateRect或InvalidateRgn等函數(shù)時,這種方法經(jīng)常被使用。其它情況:如下拉菜單或工具條提示信息等情況33 34GDI 對象應用實例例:在View 窗口中實現(xiàn)畫線的功能,以鼠標左鍵按下及抬起點做端點畫線。實現(xiàn)過程:新建MFC 應用程序在View 類中添
20、加成員變量,用于保存鼠標按下點的坐標。添加響應的消息WM _LBUTTONDOWN 和WM _LBUTTONUP .實現(xiàn)消息響應函數(shù)使用MoveTo 和LineTo 成員函數(shù) 35與繪制圖形相關的幾個類先介紹幾個常用的與圖形繪制有關的數(shù)據(jù)結(jié)構(gòu)類。1.CPoint 類2.CSize 類3.CRect 類4.RGB 宏圖形對象圖形對象類是MFC封裝的Windows繪圖工具CObjectCGdiObjectCPen CBrush CFont CBitmap CPalette CRgn 畫筆類刷子類字體類位圖類調(diào)色板類區(qū)域類36 37畫筆對象MFC 類CPen 封裝了GDI 中的畫筆對象,畫筆對象代表
21、了進行繪制時所用的線條。默認畫筆畫出的是一個像素點寬的黑色實線。Windows 用當前選入DC 的畫筆繪制直線和曲線,并給用Rectangle 、Ellipse 以及其它圖形生成函數(shù)畫出的圖形鑲畫邊框。 方法一:構(gòu)造一個CPen對象并把定義畫筆所用參數(shù)都傳給該對象。CPen pen(PS_SOLID,1,RGB(255,0,0;方法二:構(gòu)造一個沒有初始化的CPen對象并調(diào)用CPen:CreatePen。CPen pen;pen.CreatePen(PS_SOLID,1,RGB(255,0,0;38 39方法三:構(gòu)造一個沒有初始化的CPen 對象,向LOGPEN 結(jié)構(gòu)中填充描述畫筆特性的參數(shù),然
22、后再調(diào)用CPen :CreatePenIndirect 生成畫筆。 CPen pen ;LOGPEN lp ; lp .lopnStyle =PS _SOLID ; lp .lopnWidth .x =1; lp .lopnColor =RGB (255,0,0; pen .CreatePenIndirect (&lp ; BOOL CreatePen( int nPenStyle, int nWidth,COLORREF crColor ;其中參數(shù)nPenStyle代表了畫筆的樣式,可以為下列值之一PS_SOLID,PS_DASH,PS_DOT,PS_DASHDOT,PS_DASHDOTDO
23、T,PS_NULL,PS_INSIDEFRAME怎樣使用創(chuàng)建好的畫筆只要把畫筆選入DC,然后調(diào)用畫線函數(shù)即可。示例如下:CPen pen(PS_SOLID,10,RGB(255,0,0;/紅色畫筆CPen *pOldPen=dc.SelectObject(&pen;dc.Ellipse(0,0,100,100;40 41 42 43畫筆的使用格式在OnDraw 函數(shù)中CClientDC dc (this ;CPen NewPen ,*OldPen ;NewPen .CreatePen (PS _DASH ,1,RGB (255,0,0;OldPen =dc .SelectObject (&Ne
24、wPen ;使用該筆進行繪畫;dc .SelectObject (OldPen ; 44刷子對象用來在GDI 輸出時填充一個封閉圖形的內(nèi)部。在繪制時,Windows 將多個這樣的位圖平鋪起來填充封閉圖形的內(nèi)部MFC 的CBrush 類封裝了刷子對象CBrush ( ;CBrush (COLORREF crColor ;CBrush (int nIndex ,COLORREF crColor ;CBrush (CBitmap * pBitmap ;crColor 刷子顏色nIndex 刷子圖案 畫刷有三種基本類型:單色畫刷:它填充的是單色帶陰影話刷:它采用預先定義好的交叉線圖案填充圖形。圖案話刷
25、:它采用位圖來填充圖形。單色畫刷的創(chuàng)建方法方法一:將COLORREF的值傳遞給CBrush構(gòu)造函數(shù)。Cbrush brush(RGB(255,0,0;方法二:創(chuàng)建一個沒有初始化的CBrush對象,然后調(diào)用CBrush:CreateSolidBrush函數(shù)。方法三:將LOGBRUSH初始化并調(diào)用CBrush:CreateBrushIndirect45 陰影畫刷的創(chuàng)建方法:方法一:CBrush brush(HS_DIAGCROSS,RGB(255,0,0;方法二:CBrush brush;brush.CreateHatchBrush(HS_DIAGCROSS,RGB(255,0,0;成員函數(shù)CreateHatchBrush創(chuàng)建一個陰影刷子,其原型如下:BOOL CreateHatchBrush( int nIndex, COLORREFcrColor 參數(shù)nIndex指定了刷子的樣式,它可以為以下常量之一:HS_BDIAGONAL:由左向右下斜45度的陰影線HS_CROSS:水平和垂直的交叉線HS_DIAGCROSS:45度的斜交叉線46 字體對象字體對象決定的設備上下文中進行文本輸出的字符樣式。在使用字體對象的時候,我們一般先創(chuàng)建一個CFont對象,然后調(diào)用CreateFont、CreateFontIndirect、CreatePointFont及CreatePointFontI
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中國煙感產(chǎn)品行業(yè)發(fā)展監(jiān)測及投資方向研究報告
- 2020-2025年中國薄荷醇行業(yè)市場調(diào)查研究及投資前景預測報告
- 2025年中國真空設備制造行業(yè)市場供需現(xiàn)狀及未來發(fā)展趨勢報告
- 機械設備安全檢查表模板
- 膨化機安全操作規(guī)程
- 手術(shù)安全核查制度檢查表
- 職工食堂安全事故反思報告
- 人際資源工作計劃范文模板
- 安全突發(fā)事故應急預案
- 貨運企業(yè)安全生產(chǎn)隱患自查自糾報告
- 設備租賃方案(3篇)
- 公關費用標準管理制度
- 2025-2030年中國潔凈室風扇過濾單元行業(yè)市場現(xiàn)狀供需分析及投資評估規(guī)劃分析研究報告
- AI大模型賦能數(shù)字農(nóng)業(yè)農(nóng)村數(shù)字鄉(xiāng)村建設方案
- 防汛物資儲備定額編制規(guī)程(SL298-2024)
- 綜合實踐:畫數(shù)學連環(huán)畫(大單元教學設計)一年級數(shù)學下冊北師大版2025
- 2025年大學英語六級考試試卷及答案
- 水工程概論課件
- 詐騙還款協(xié)議書范本
- 研學活動協(xié)議書合同協(xié)議
- 2025年教師參加初中英語新教材培訓心得體會
評論
0/150
提交評論