資源描述:
《Windows程序設(shè)計(jì)教程 第2版 教學(xué)課件 作者 王秀梅 第5章-Windows繪圖程序設(shè)計(jì).ppt》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在應(yīng)用文檔-天天文庫。
1、在編寫Windows應(yīng)用程序過程中,加載位圖或者創(chuàng)建位圖是程序員常用的方法。只有熟練地掌握對于位圖的有關(guān)操作方法,才能編寫出標(biāo)準(zhǔn)且美觀的應(yīng)用程序。本章主要介紹Windows繪圖程序有關(guān)的知識,并對繪圖所需要的類進(jìn)行充分講解。通過本章的學(xué)習(xí),讀者可以掌握各種圖形的繪制及圖像在窗口中的一些操作。圖形設(shè)備接口5.1設(shè)備上下文5.2GDI對象5.3繪圖函數(shù)5.4畫筆與畫刷5.55.1圖形設(shè)備接口在MS-DOS程序中,通常采用直接向視頻存儲區(qū)或打印機(jī)端口輸送數(shù)據(jù)的方式。但采用這種方式需要各種顯示卡或打印機(jī)驅(qū)動程序。為了支持這些設(shè)備,又需要編寫大量不同的代碼來包含這些驅(qū)動程序。為了避免上述問題,Wi
2、ndows提供了一個抽象的接口—圖形設(shè)備接口(GraphicsDeviceInterface,GDI)。5.2設(shè)備上下文設(shè)備上下文(DeviceContext,DC)。設(shè)備上下文是一種包含有關(guān)某個設(shè)備(如顯示器或打印機(jī))的繪制屬性信息的Windows數(shù)據(jù)結(jié)構(gòu)。下面對設(shè)備上下文進(jìn)行詳細(xì)介紹。5.2.1設(shè)備上下文介紹在Windows應(yīng)用程序設(shè)計(jì)中,所有繪制調(diào)用都通過設(shè)備上下文對象進(jìn)行,這些對象封裝了用于繪制線條、形狀和文本的WindowsAPI。設(shè)備上下文允許在Windows中進(jìn)行與設(shè)備無關(guān)的繪制。設(shè)備上下文可用于繪制到屏幕、打印機(jī)或者圖元文件。在Windows應(yīng)用程序中,每個窗口都關(guān)聯(lián)有設(shè)
3、備上下文。用戶只要獲取到窗口的設(shè)備上下文,就可以在窗口中繪制各種圖形圖像等信息。獲取窗口設(shè)備上下文的函數(shù)是GetDC(),該函數(shù)的原型如下:HDCGetDC(HWNDhWnd);圖5.1程序sample0501的運(yùn)行結(jié)果5.2.2設(shè)備上下文類型1.顯示設(shè)備上下文2.打印機(jī)設(shè)備上下文3.內(nèi)存設(shè)備上下文4.信息設(shè)備上下文5.2.3設(shè)備上下文MFC類在MFC中,為了方便用戶繪圖,提供了一個設(shè)備上下文類——CDC。CDC類封裝了繪圖所需要的所有成員函數(shù),以及各種類型的Windows設(shè)備上下文的全部功能。此外,CDC還提供了幾個派生類,如圖5.2所示。1.CDC類在CDC類中存在兩個成員變量,m_
4、hDC和m_hAttribDC。這兩個成員變量都是Windows設(shè)備上下文句柄。CDC對象使用m_hDC對其所有的成員函數(shù)作輸出調(diào)用,而使用m_hAttribDC對其所有的成員函數(shù)作屬性調(diào)用。CDC類的構(gòu)造函數(shù)原型如下:圖5.2設(shè)備上下文MFC類CDC::CDC(){m_hDC=NULL;m_hAttribDC=NULL;m_bPrinting=FALSE;}CDC::~CDC(){if(m_hDC!=NULL)::DeleteDC(Detach());}2.CPaintDC類在Windows應(yīng)用程序中,通常在繪制圖像之前調(diào)用函數(shù)BeginPaint(),然后在設(shè)備上下文中進(jìn)行一系列的繪
5、制操作,最后調(diào)用EndPaint函數(shù)結(jié)束繪制。在MFC中,CPaintDC類完全封裝了這一過程,其機(jī)制是這樣的:在構(gòu)造CPaintDC對象的同時,其構(gòu)造函數(shù)自動調(diào)用BeginPaint()函數(shù);在銷毀CPaintDC對象的同時,其析構(gòu)函數(shù)自動調(diào)用EndPaint()函數(shù)。因此整個過程可以簡化如下:構(gòu)造CDC對象,執(zhí)行繪制操作,最終銷毀CDC對象。CPaintDC類是所有CDC類中最常用的一個類,該類代表了應(yīng)用程序窗口的客戶區(qū),其只能運(yùn)行在CView類中的OnDraw()函數(shù)中。OnDraw()函數(shù)的原型如下:voidCView::OnDraw(CDC*pDC){CDoc*pDoc=Get
6、Document();ASSERT_VALID(pDoc);}3.CClientDC類與CPaintDC類一樣,CClientDC類所封裝的設(shè)備上下文僅代表一個窗口的客戶區(qū)。但與CPaintDC類不同的是,CPaintDC類的對象只能在視圖類的OnDraw()函數(shù)中使用,而CClientDC類的對象可以在除了OnDraw()函數(shù)之外的任何地方使用。圖5.3程序sample0502的運(yùn)行結(jié)果圖5.4彈出式菜單圖5.5添加單擊消息圖5.6程序sample0503的運(yùn)行結(jié)果4.CWindowDC類CWindowDC類所封裝的設(shè)備上下文表示的是整個窗口,即不僅包括其客戶區(qū),同時也包括窗口的邊框及
7、標(biāo)題欄等其他非客戶區(qū)對象。其構(gòu)造函數(shù)如下:CWindowDC::CWindowDC(CWnd*pWnd){ASSERT(pWnd==NULL
8、
9、::IsWindow(pWnd->m_hWnd));if(!Attach(::GetWindowDC(m_hWnd=pWnd->GetSafeHwnd())))AfxThrowResourceException();}5.CMetaFileDC類在應(yīng)用程序中,有時需要重復(fù)顯示一些圖形。如果每