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