《圖形、文本和打印》PPT課件.ppt_第1頁
《圖形、文本和打印》PPT課件.ppt_第2頁
《圖形、文本和打印》PPT課件.ppt_第3頁
《圖形、文本和打印》PPT課件.ppt_第4頁
《圖形、文本和打印》PPT課件.ppt_第5頁
已閱讀5頁,還剩85頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、第7章圖形、文本和打印,圖形、文本和打印,Window為操作系統(tǒng)和硬件提供了圖形用戶接口GUI(Graphics Users Interface)。所有的信息,甚至文本,在Windows下都可以作為圖形畫到屏幕上。 Window的GDI(設(shè)備圖形接口)提供了繪圖的基本工具,如畫點、線、多邊形、位圖以及文本輸出。主要負(fù)責(zé)系統(tǒng)與用戶或繪圖程序之間的信息交換,并在輸出設(shè)備上顯示圖形或文字。 MFC提供了設(shè)備環(huán)境類CDC和圖形對象類CGdiObject來完成繪圖操作。,7.1 設(shè)備環(huán)境和簡單數(shù)據(jù)類,1,設(shè)備環(huán)境,設(shè)備環(huán)境是由Windows保存的一個數(shù)據(jù)結(jié)構(gòu),包含應(yīng)用程序向設(shè)備輸出時所需要的信息,如當(dāng)前

2、背景色或區(qū)域圖案、區(qū)域的無效部分等。 Windows通過設(shè)備環(huán)境確定任何輸出設(shè)備的GDI輸出的位置和圖形的屬性。 當(dāng)用戶繪圖時,需要訪問設(shè)備描述表DC(Device Context),它的主要作用是提供程序與物理設(shè)備或者偽設(shè)備之間的聯(lián)系,另外還處理繪圖屬性設(shè)置,如文本顏色設(shè)置。,7.1.1 設(shè)備環(huán)境類,設(shè)備環(huán)境類CDC是GDI封裝在MFC中的最大的一個類,它表示總的DC,是所有DC類的基類。CDC類定義環(huán)境對象,并提供在顯示器、打印機或窗口客戶區(qū)上繪制圖形的方法,它封裝了使用設(shè)備環(huán)境的GDI函數(shù)。 CDC類的成員函數(shù)有近200個,可分為位圖函數(shù)、剪裁函數(shù)、繪圖屬性函數(shù)、初始化函數(shù)和字體函數(shù)等。

3、,7.1.1 設(shè)備環(huán)境類,設(shè)備環(huán)境類CDC提供了繪制和打印的全部函數(shù)。為了能讓用戶使用一些特殊的設(shè)備環(huán)境,CDC還派生了CPaintDC、CClientDC、CWindowDC和CMetaFileDC類。 (1)CPaintDC比較特殊,它的構(gòu)造函數(shù)和析構(gòu)函數(shù)都是針對OnPaint進(jìn)行的,但用戶一旦獲得相關(guān)的CDC指針,就可以將它當(dāng)成任何設(shè)備環(huán)境(包括屏幕、打印機)指針來使用。CPaintDC類的構(gòu)造函數(shù)會自動調(diào)用BeginPaint,而它的析構(gòu)函數(shù)則會自動調(diào)用EndPaint。,7.1.1 設(shè)備環(huán)境類,(2)CClientDC只能在窗口的客戶區(qū)(不包括邊框、標(biāo)題欄、菜單欄以及狀態(tài)欄)中進(jìn)行繪

4、圖,點(0,0)通常指的是客戶區(qū)的左上角。而CWindowDC允許在窗口的任意位置中進(jìn)行繪圖,點(0,0)指整個窗口的左上角。WindowDC和CClientDC構(gòu)造函數(shù)分別調(diào)用GetWindowDC和GetDC,但它們的析構(gòu)函數(shù)都是調(diào)用ReleaseDC函數(shù)。 (3)CMetaFileDC封裝了在一個Windows圖元文件中繪圖的方法。圖元文件是一系列與設(shè)備無關(guān)的圖片的集合,由于它對圖象的保存比像素更精確,因而往往在要求較高的場合下使用。目前的Windows已使用增強格式(enhanced-format)的32位圖元文件來進(jìn)行操作。,7.1.2 坐標(biāo)映射,要指定繪圖位置,需使用坐標(biāo)系。Win

5、dows提供了兩類坐標(biāo)系:設(shè)備坐標(biāo)系和邏輯坐標(biāo)系。 邏輯坐標(biāo)就是內(nèi)存中虛擬的坐標(biāo),可以理解為看不見的,而設(shè)備坐標(biāo)就是跟具體的設(shè)備相聯(lián)系的坐標(biāo)系統(tǒng),如:顯示器和打印機設(shè)備坐標(biāo)系下的坐標(biāo),大小與分辨率有關(guān)。 為了能保證打印的結(jié)果不受設(shè)備的影響,Windows定義了一些映射模式,不同的映射模式?jīng)Q定了設(shè)備坐標(biāo)和邏輯坐標(biāo)之間的轉(zhuǎn)換關(guān)系,也就是兩種坐標(biāo)系統(tǒng)在相互轉(zhuǎn)換時,邏輯單位和設(shè)備單位之間的某種比例關(guān)系。 說明:Windows中,只有對需要設(shè)備環(huán)境句柄作參數(shù)的GDI函數(shù),映射方式才會起作用。,映 射 模 式,視口和窗口,窗口:可以理解成一種邏輯坐標(biāo)下的窗口 視口:可以理解成實際看到的那個窗口,即設(shè)備坐標(biāo)

6、下的窗口,通常與客戶區(qū)相同, 窗口和視口是與映射模式相關(guān)聯(lián)的,映射方式就是用于從“窗口”(邏輯坐標(biāo))到“視口”(設(shè)備坐標(biāo))的映射。在映射模式MM_ANISOTROPIC和MM_ISOTROPIC中,常??梢哉{(diào)用CDC:SetWindowExt()和CDC:SetViewportExt()來設(shè)置所需要的比例因子。 根據(jù)“窗口”和“視口”的大小可以確定x和y的比例因子,它們的關(guān)系如下: x比例因子=視口x大小/窗口x大小 y比例因子 =視口y大小/窗口y大小,7.1.3. CPoint、CSize和CRect,CPoint、CSize和CRect類是對Windows的POINT、SIZE和RECT

7、結(jié)構(gòu)的封裝,因此它們可以直接使用各自結(jié)構(gòu)的數(shù)據(jù)成員。 typedef struct tagPOINT LONG x; /點的x坐標(biāo) LONG y; /點的y坐標(biāo) POINT; CPoint類帶參數(shù)的常用構(gòu)造函數(shù)原型如下: CPoint( int initX, int initY ); CPoint( POINT initPt );,7.1.3. CPoint、CSize和CRect,typedef struct tagSIZE int cx; /水平大小 int cy; /垂直大小 SIZE; CSize類帶參數(shù)的常用構(gòu)造函數(shù)原型如下: CSize( int initCX, int initC

8、Y ); CSize( SIZE initSize );,7.1.3. CPoint、CSize和CRect,typedef struct tagRECT LONG left; /左上角點的x坐標(biāo) LONG top; /左上角點的y坐標(biāo) LONG right; /右下角點的x坐標(biāo) LONG bottom;/右下角點的y坐標(biāo) RECT; CRect類帶參數(shù)的常用構(gòu)造函數(shù)原型如下: CRect( int l, int t, int r, int b ); CRect( const RECT,CRect的常用操作(1),CRect的常用操作(2),CRect的常用操作(3),7.1.4. 顏色和顏色

9、對話框,一個彩色象素的顯示需要顏色空間的支持,常用的顏色空間有RGB和YUV兩種。RGB顏色空間選用紅(R)、綠(G)、藍(lán)(B)三種基色分量,通過對這三種基色不同比例的混合,可以得到不同的彩色效果。而YUV顏色空間是將一個彩色像素表示成一個亮度分量(Y)和兩個色度分量(U、V)。 在MFC中,CDC使用的是RGB顏色空間,其中,COLORREF是用來表示RGB顏色的一個32位的數(shù)據(jù)類型。它可以用下列的十六進(jìn)制表示一個RGB值:0 x00bbggrr,其中bb、gg、rr分別表示藍(lán)、綠、紅3個顏色分量的十六進(jìn)制值。,7.1.4. 顏色和顏色對話框,在具體操作RGB顏色時,可使用下列的宏操作: G

10、etBValue、GetGValue、GetRValue來獲得其中各個顏色分量值。 如:int nRed=GetBValue(color); RGB來將指定的三個分量值轉(zhuǎn)換成一個32位的RGB顏色值。 如: COLORREF color=RGB(nRed,nGreen,nBlue);,7.1.4. 顏色和顏色對話框,MFC的CColorDialog類為應(yīng)用程序提供了顏色選擇通用對話框,構(gòu)造函數(shù)如下: CColorDialog(COLORREF clrInit=0,DWORD dwFlags=0,CWnd * pParentWnd=NULL); 其中,clrInit指定選擇的默認(rèn)顏色值,默認(rèn)為R

11、GB(0,0,0)黑色。pParentWnd指定對話框的父窗口指針。dwFlags指定對話框外觀和功能(見教材P209)。 當(dāng)對話框單擊OK退出時,可調(diào)用下列成員函數(shù)獲得相應(yīng)的顏色。 COLORREF GetColor() const; void SetCurrentColor(COLORREF clr); static COLORREF * GetSavedCustomColors(),7.1.5. 圖形設(shè)備接口,Windows為設(shè)備環(huán)境提供了各種各樣的繪圖工具,例如用于畫線的“畫筆”、填充區(qū)域的“畫刷”以及用于繪制文本的“字體”。 MFC封裝了這些工具,并提供相應(yīng)的類來作為應(yīng)用程序的圖形設(shè)

12、備接口GDI(這些類有一個共同的抽象基類CGdiObject)。,7.1.5. 圖形設(shè)備接口,在選擇GDI對象進(jìn)行繪圖時,可遵循下列步驟: 在堆棧中定義一個GDI對象(如CPen對象),然后用相應(yīng)的函數(shù)(如CreatePen)創(chuàng)建此GDI對象,有些對象可用帶參的構(gòu)造函數(shù)一步創(chuàng)建完成。 將構(gòu)造的GDI對象選入當(dāng)前設(shè)備環(huán)境中,同時將原來的GDI對象保存起來。 繪圖結(jié)束后,恢復(fù)當(dāng)前設(shè)備環(huán)境中原來的GDI對象。 程序結(jié)束后,框架會自動刪除程序創(chuàng)建的GDI對象。,7.1.5. 圖形設(shè)備接口,void C*View:OnDraw(CDC* pDC) CPen penBlack; /創(chuàng)建對象 penBlac

13、k.CreatePen(PS_SOLID,2,RGB(0,0,0); CPen *pOldPen=pDC-SelectObject( ,7.1.5. 圖形設(shè)備接口,除了自定義的GDI對象外,還可使用CDC的成員函數(shù)SelectStockObject將Windows預(yù)定義的庫存GDI對象選入當(dāng)前設(shè)備環(huán)境中,并返回原先被選中的對象指針,同時使原先被選中的對象從設(shè)備環(huán)境中分離出來。 可被選中的庫存GDI對象類型: BLACK_BRUSH GRAY_BRUSH LTGRAY_BRUSH DKGRAY_BRUSH HOLLOW_BRUSH NULL_BRUSH WHITE_BRUSH BLACK_PEN

14、 WHITE_PEN NULL_PEN SYSTEM_FONT DEVICE_DEFAULT_FONT,7.2 簡單圖形繪制,2,7.2.1. 畫 筆,畫筆是Windows應(yīng)用程序中用來繪制各種直線和曲線的一種圖形工具,它可分為修飾畫筆和幾何畫筆兩種類型。 幾何畫筆通常在邏輯單元中繪圖并受當(dāng)前繪圖模式的影響。修飾畫筆通常在設(shè)備單元中繪圖而忽略當(dāng)前繪圖模式。 在這兩種類型中,幾何畫筆的定義最復(fù)雜,它不但有修飾畫筆的屬性,而且還跟畫刷的樣式、陰影線類型有關(guān),通常用在對繪圖有較高要求的場合。而修飾畫筆只有簡單的幾種屬性,通常用在簡單的直線和曲線等場合。,7.2.1. 畫 筆,一個修飾畫筆通常具有寬度

15、、風(fēng)格和顏色三種屬性。畫筆的寬度用來確定所畫的線條寬度,它是用設(shè)備單位表示的。默認(rèn)的畫筆寬度是一個像素單位。畫筆的顏色確定了所畫的線條顏色。畫筆的風(fēng)格確定了所繪圖形的線型,它通常有實線(PS_SOLID)、虛線(PS_DASH)、點線(PS_DOT)、點劃線(PS_DASHDOT)、雙點劃線(PS_DASHDOTDOT)、不可見線(PS_NULL)和內(nèi)框線(PS_INSIDEFRAME)等七種風(fēng)格。,1. 創(chuàng)建畫筆,CPen類封裝圖形設(shè)備接口GDI畫筆對象的功能。創(chuàng)建畫筆可以采用以下幾種方法: (1)使用無參構(gòu)造函數(shù)聲明對象,之后調(diào)用成員函數(shù)CreatePen()創(chuàng)建具體的畫筆。 BOOL C

16、reatePen(int nPenStyle, int nWidth, COLORREF crColor); 其中nPenStyle表示畫筆的樣式。nWidth表示畫筆的線寬。crColor表示畫筆的RGB顏色。 例如: CPen Pen; Pen.CreatePen(PS_SOLID,1,RGB(255,0,0); /調(diào)用成員函數(shù),創(chuàng)建線寬為1的紅色實線畫筆,1. 創(chuàng)建畫筆,(2) 使用構(gòu)造函數(shù)創(chuàng)建畫筆 CPen(int nPenStyle,int nWidth,COLORREF cfColor) 例如: CPen Pen(PS_SOLID,1,RGB(255,0,0); / 調(diào)用構(gòu)造函數(shù),

17、創(chuàng)建線寬為1的紅色實線畫筆 (3) 使用重載的構(gòu)造函數(shù)創(chuàng)建幾何畫筆 CPen(int nPenStyle,int nWidth, const LOGBRUSH*pLogBrush, int nStyleCount=0, const DWORD *lpstyle=NULL);,2. 庫存畫筆,庫存畫筆又叫堆畫筆。Windows定義了三種庫存畫筆,用戶可以直接使用這些畫筆,而不用創(chuàng)建對象。三種庫存畫筆分別是: BLANK_PEN:黑色畫筆;WHILE_PEN:白色畫筆; NULL_PEN:空畫筆。 可以使用CreatestockObject()函數(shù)進(jìn)行創(chuàng)建。 CPen Pen; Pen.Creat

18、estockObject(WHILE_PEN); 可以以庫存畫筆為參數(shù)來調(diào)用SelectStockObject()函數(shù),此函數(shù)選定放入當(dāng)前設(shè)備環(huán)境的新對象,并返回一個指向被替換對象的指針,CPen*pOldPen=pDC-SelectStockObject(BLANK_PEN);,3. 畫筆的使用方法,(1) 創(chuàng)建畫筆; (2) 使用新的畫筆,保存原來的畫筆以便恢復(fù); CPen *pOldPen; pOldPen=pDC-selectObject( 保存并恢復(fù)原來畫筆的原因是每個圖形設(shè)備接口對象要占用一個HDC句柄,而可用的句柄數(shù)量有限,如果用完后未及時釋放,積累下去將導(dǎo)致嚴(yán)重的運行錯誤。,7

19、.2.2 畫 刷,畫刷是用來填充圖形的工具。 畫刷的屬性通常包括填充色、填充圖案和填充樣式三種。畫刷的填充色和畫筆顏色一樣,都是使用COLORREF顏色類型,畫刷的填充圖案通常是用戶定義的8 x 8位圖,而填充樣式往往是CDC內(nèi)部定義的一些特性,它們都是以HS_為前綴的標(biāo)識,如圖所示:,7.2.2 畫 刷,MFC把GDI畫刷封裝在CRush類中。畫刷的使用方法同畫筆。畫刷分為純色畫刷、陰影畫刷、堆畫刷和圖案畫刷。CBrush類為不同的畫刷類型提供了不同的構(gòu)造函數(shù)。 Windows定義的堆畫刷共有7種,分別是: BLACK_BRUSH:黑色畫刷; DKGRAY_BRUSH:深灰色畫刷; GRAY

20、_BRUSH:灰色畫刷; HOLLOW_BRUSH:空畫刷; LTGRAY_BRUSH:淺灰色畫刷; NULL_BRUSH:空畫刷; WHITE_BRUSH:白色畫刷;,7.2.2 畫 刷,對堆畫刷,調(diào)用SelectStockObject()函數(shù)進(jìn)行選擇畫刷, 例如: CBrush * pOldBrush=pDC- SelectStockObject(WHITE_BRUSH); / 選擇白色堆畫刷,創(chuàng)建CBrush對象的四個構(gòu)造函數(shù)為:,(1) CBrush(); / 使用前必須初始化畫刷 (2) CBrush (COLORREF cfColor); / 構(gòu)造帶有指定顏色的純色畫刷 如: CB

21、rush Brush(RGB(255,0,0); / 創(chuàng)建紅色畫刷 (3) CBrush(int nIndex, COLORREF cfColor); / 構(gòu)造帶有指定填充樣式和顏色的填充畫刷 (4) CBrush(CBitmap*pBitmap); / 構(gòu)造使用位圖圖案的畫刷 CBitmap對象最大可使用88像素,若位圖過大,則只有左上角的部分可以用作畫刷圖案。,7.2.3 繪 圖 示 例,MFC為用戶的圖形繪制提供了許多函數(shù),這其中包括畫點、線、矩形、多邊形、圓弧、橢圓、扇形以及Bzier曲線等。 例:一個簡單圖形的繪制示例,表示一個班級某門課程的成績分布,它是一個直方圖,反映90五個分?jǐn)?shù)

22、段的人數(shù),它需要繪制五個矩形,相鄰矩形的填充樣式還要有所區(qū)別,并且還需要顯示各分?jǐn)?shù)段的人數(shù)。,Ex_Draw運行結(jié)果,7.3 字體與文字處理,3,字體,字體定義顯示文本的符號和字符,通過處理字體可以顯示某種特殊效果的文字,描述輸出文字的字體可用CFont對象。CFont對象的使用方法與畫筆和畫刷類似, 定義字體對象, 創(chuàng)建字體并保存原來的字體, 在文字輸出工作結(jié)束后恢復(fù)原來的字體。,7.3.1 字體和字體對話框,1. 字體的屬性,字體的主要屬性有字樣、風(fēng)格和尺寸。字樣是字符書寫和顯示時表現(xiàn)的特定模式,如宋體、楷體等多種字樣。字體風(fēng)格主要表現(xiàn)為字體的粗細(xì)和是否傾斜等特點。字體是用來指定字體所占區(qū)

23、域的大小,通常用字符高度來描述。 2. 字體的創(chuàng)建 (1)為了方便用戶創(chuàng)建字體,系統(tǒng)定義一種邏輯字體,根據(jù)定義的邏輯字體,可調(diào)用CFont類的CreateFontIndirect函數(shù)來創(chuàng)建字體。(P217),typedef struct tagLOGFONT LONG lfHeight; / 字體的邏輯高度 LONG lfWidth; / 字符的平均邏輯寬度 LONG lfEscapement; / 傾角 LONG lfOrientation; / 書寫方向 LONG lfWeight; / 字體的粗細(xì)程度 BYTE lfItalic; / 斜體標(biāo)志 BYTE lfUnderline; / 下

24、劃線標(biāo)志 BYTE lfStrikeOut; / 刪除線標(biāo)志 BYTE lfCharSet; / 字符集,漢字必須為GB2312_CHARSET TCHAR lfFaceNameLF_FACESIZE / 字樣名稱 / LOGFONT;,2字體的創(chuàng)建(2),當(dāng)需要某一特定的字體時,還可以使用MFC的CFont類的CreateFont()成員函數(shù)來創(chuàng)建字體,若該函數(shù)調(diào)用成功,則返回非0值,否則返回0。 其函數(shù)原型如下: BOOL CFont:CreateFont( int nHeight, / 字符邏輯高度 int nWidth, / 字符邏輯寬度 int nEscapement, / 出口矢量

25、與X軸的角度 int nOrientation, / 字符基線與X軸的角度 int nWeight, / 字體磅值 BYTE bItalic, / 非0則為斜體,BYTE bUnderline, / 非0則加下劃線 BYTE cStrickOut, / 非0則加刪除線 BYTE nCharSet, / 此字體的字符集 BYTE nClipPrecision, / 裁剪精度 BYTE nQualty, / 輸出質(zhì)量 BYTE nPitAndFamity, / 調(diào)距和字體族 LPCSTR lpszFacename;/ 字體的字符名 ); CreateFont()成員函數(shù)并不能產(chǎn)生新的Windows

26、 GDI字體,它只是從GDI字庫中選擇一種最近似的可用字體。,2字體的創(chuàng)建(2),7.3.1 字體和字體對話框,3. 使用字體對話框,CFontDialog類提供了字體及其文本顏色選擇的通用對話框。,它的構(gòu)造函數(shù)如下:,CFontDialog( LPLOGFONT lplfInitial = NULL, DWORD dwFlags = CF_EFFECTS |CF_SCREENFONTS, CDC* pdcPrinter = NULL, CWnd* pParentWnd = NULL );,7.3.2 常用文本輸出函數(shù),文本的最終輸出不僅依賴于文本的字體,而且還跟文本的顏色、對齊方式等有很大關(guān)

27、系。CDC類提供了4個輸出文本的函數(shù)。,(1)TextOut函數(shù)是用當(dāng)前字體在指定位置 (x,y) 處顯示一個文本。 virtual BOOL TextOut(int x,int y,LPCTSTR lpszString int nCount); BOOL TextOut(int x,int y,const CString ,7.3.2 常用文本輸出函數(shù),(2) TabbedTextOut也是用當(dāng)前字體在指定位置處顯示一個文本,但它還根據(jù)指定的制表位(Tab)設(shè)置相應(yīng)字符位置,函數(shù)成功時返回輸出文本的大小。 virtual CSize TabbedTextOut(int x,int y,LPC

28、TSTR lpszString int nCount,int nTabPositions,LPINT lpnTabStopPostions,int nTabOrigin); CSize TabbedTextOut(int x,int y,const CString ,7.3.2 常用文本輸出函數(shù),(3) DrawText函數(shù)是當(dāng)前字體在指定矩形中對文本進(jìn)行格式化繪制。 virtual int DrawText( LPCTSTR lpszString, int nCount, LPRECT lpRect, UINT nFormat ); int DrawText( const CString,7

29、.3.2 常用文本輸出示例,繪制下列圖形,(10,10),(200,140),200,20,停止位為40個單位,停止位為80個單位,停止位為默認(rèn)值,在C*View類的OnDraw(CDC *pDC)函數(shù)中添加繪圖代碼:,CRect rc(10, 10, 200, 140); pDC-Rectangle( rc ); pDC-DrawText( 單行文本居中, rc, DT_CENTER | DT_VCENTER | DT_SINGLELINE);,在C*View類的OnDraw(CDC *pDC)函數(shù)中添加繪圖代碼:,rc.OffsetRect( 200, 0 );/ 將矩形向右偏移200 p

30、DC-Rectangle( rc ); int nTab = 40; /將Tab位的值指定為40個邏輯單位 pDC-TabbedTextOut( rc.left, rc.top, 繪制tTabt文本t示例, 1, / 使用默認(rèn)的停止位,7.3.3 文本格式化屬性,文本的格式屬性通常包括文本顏色、對齊方式、字符間隔以及文本調(diào)整等。在繪圖設(shè)備環(huán)境中,默認(rèn)的文本顏色是黑色,而文本背景色為白色, 在CDC類中,SetTextColor、SetBkColor和SetBkMode函數(shù)就是分別用來設(shè)置文本顏色、文本背景色和背景模式,而與之相對應(yīng)的GetTextColor、GetBkcolor和GetBkMo

31、de函數(shù)則是分別獲取這三項屬性的。 SetTextAlign、GetTextAlign函數(shù)是設(shè)置和獲取文本對齊方式(文本的對齊方式如P221表7.5所示)。,7.3.3 文本格式化屬性,virtual COLORREF SetTextColor( COLORREF crColor ); COLORREF GetTextColor( ) const; virtual COLORREF SetBkColor( COLORREF crColor ); COLORREF GetBkColor( ) const; int SetBkMode( int nBkMode ); int GetBkMode(

32、) const; UINT SetTextAlign(UINT nFlags); UINT GetTextAlign() const;,7.3.4 計算字符的幾何尺寸,在打印和顯示文本時,若了解字符的高度計算及字符的測量方式,能更好地控制文本輸出效果。 在CDC類中,GetTextMetrics(LPTEXTMETRIC lpMetrics)函數(shù)是用來獲得指定映射模式下相關(guān)設(shè)備環(huán)境的字符幾何尺寸及其它屬性的。,7.3.4 計算字符的幾何尺寸,typedef struct tagTEXTMETRIC int tmHeight; / 字符的高度 int tmAscent; / 高于基準(zhǔn)線部分的值

33、int tmDescent; / 低于基準(zhǔn)線部分的值 int tmInternalLeading; / 字符內(nèi)標(biāo)高 int tmExternalLeading; / 字符外標(biāo)高 int tmAveCharWidth; / 字體中字符平均寬度 int tmMaxCharWidth; / 字符的最大寬度 / TEXTMETRIC;,7.3.4 計算字符的幾何尺寸,計算字符的幾何尺寸的方法: 利用TEXTMETRIC類型變量的成員。 如:計算字符的總高度: int charHeight=lpMetrics-tmHeight+ lpMetrics-tmExternalLeading; 利用CDC類的成

34、員函數(shù)。 如:計算字符寬度: int charWidth=pDC-GetCharWidth();,7.3.4 計算字符的幾何尺寸,計算字符串的寬度和高度,可利用CDC類的成員函數(shù)來實現(xiàn)。 CSize GetTextExtent(LPCTSTR lpszString,int nCount) const; CSize GetTextExtent(const CSting ,7.3.5 文檔內(nèi)容顯示及其字體改變,例:在視圖類中通過文本繪圖的方法來顯示文檔的文本內(nèi)容及改變顯示的字體。 (1) 創(chuàng)建一個單文檔應(yīng)用程序Ex_Text,在創(chuàng)建的第6步將視圖的基類選擇為CScrollView。 由于視圖客戶區(qū)

35、往往不能顯示文檔的全部內(nèi)容,因此需要視圖支持滾動操作。,(2) 為CEx_TextDoc類添加CStringArray類型的成員變量m_strContents,用來將讀取的文檔內(nèi)容保存。,7.3.5 文檔內(nèi)容顯示及其字體改變,void CEx_TextDoc:Serialize(CArchive ,(3) 在CEx_TextDoc:Serialize函數(shù)中添加讀取文檔內(nèi)容的代碼:,7.3.5 文檔內(nèi)容顯示及其字體改變,(5)在CEx_TextView類構(gòu)造函數(shù)中添加m_lfText的初始化代碼 CEx_TextView : CEx_TextView() memset( ,(4) 為CEx_Te

36、xtView類添加LOGFONT類型的成員變量m_lfText,用來保存當(dāng)前所使用的邏輯字體。,7.3.5 文檔內(nèi)容顯示及其字體改變,void CEx_TextView:OnLButtonDblClk(UINT nFlags, CPoint point) CFontDialog dlg(,(6) 用MFC ClassWizard為CEx_TextView類添加WM_LBUTTONDBLCLK(雙擊鼠標(biāo))的消息映射函數(shù),并增加下列代碼:,7.3.5 文檔內(nèi)容顯示及其字體改變,void CEx_TextView:OnDraw(CDC* pDC) CEx_TextDoc* pDoc = GetDoc

37、ument(); ASSERT_VALID(pDoc); / 創(chuàng)建字體 CFont cf; cf.CreateFontIndirect(,(7) 在CEx_TextView:OnDraw中添加下列代碼:,7.3.5 文檔內(nèi)容顯示及其字體改變,int y = 0; int tab = tm.tmAveCharWidth * 4; / 為一個TAB設(shè)置4個字符 / 輸出并計算行的最大長度 int lineMaxWidth = 0; CString str; CSize lineSize(0,0); for (int i=0; im_strContents.GetSize(); i+) str =

38、pDoc-m_strContents.GetAt(i); pDC-TabbedTextOut(0, y, str, 1, ,7.3.5 文檔內(nèi)容顯示及其字體改變,str = str + A;/ 多計算一個字符寬度 lineSize = pDC-GetTabbedTextExtent(str, 1, / 多算一行,以滾動窗口能全部顯示文檔內(nèi)容,7.3.5 文檔內(nèi)容顯示及其字體改變,CSize sizeTotal; sizeTotal.cx = lineMaxWidth; sizeTotal.cy = lineHeight * nLines; SetScrollSizes(MM_TEXT, siz

39、eTotal); / 設(shè)置滾動邏輯窗口的大小 ,7.4 位圖、圖標(biāo)與光標(biāo),4,位圖,位圖是一些和顯示像素相對應(yīng)的位陣列,它可以用來保存、加載和顯示。 圖標(biāo)、光標(biāo)也是一種位圖,但它們有各自的特點。同一個圖標(biāo)或光標(biāo)對應(yīng)于不同的顯示設(shè)備時,可以包含不同的圖像。 光標(biāo)還具有“熱點”的特性。,7.4.1. 使用圖形編輯器,圖形編輯器可以創(chuàng)建和編輯任何位圖格式的圖像資源,除工具欄外,它還用于位圖、圖標(biāo)和光標(biāo)。具體的使用同Windows中的“組圖”工具欄類似。 1.創(chuàng)建一個新的圖標(biāo)或光標(biāo) 在一個應(yīng)用程序中,在“插入資源”的對話框中選擇Cursor(光標(biāo))或Icon(圖標(biāo))資源類型時,系統(tǒng)為程序添加一個新的圖

40、標(biāo)或光標(biāo)資源的同時在開發(fā)環(huán)境右側(cè)出現(xiàn)圖形編輯器。 由于同一個圖標(biāo)或光標(biāo)對應(yīng)于不同的顯示設(shè)備時,可以包含不同的圖像。因此,在創(chuàng)建圖標(biāo)或光標(biāo)前必須事先指定好目標(biāo)顯示設(shè)備。,7.4.1. 使用圖形編輯器,2. 選用和定制顯示設(shè)備 在圖形編輯器窗口的控制條上,單擊New Device Image按鈕,系統(tǒng)將彈出相應(yīng)的新設(shè)備列表對話框,用戶可以從中選取需要的顯示設(shè)備。在對話框中單擊“定制”按鈕還可定制新的顯示設(shè)備。,7.4.1. 使用圖形編輯器,3. 設(shè)置光標(biāo)熱點 Windows系統(tǒng)借助光標(biāo)“熱點”來確定光標(biāo)實際的位置。在圖形編輯器的控制條上或光標(biāo)屬性對話框中都可以看到當(dāng)前的光標(biāo)“熱點”位置。 默認(rèn)時,

41、光標(biāo)熱點是左上角(0,0),熱點的位置可以重新指定,單擊Hot Spot按鍵后,在光標(biāo)圖像上單擊要指定的像素點即可。,設(shè)置熱點按鈕,7.4.2. 位 圖,Windows的位圖有兩種類型:一種是GDI位圖,另一種是DIB位圖。常用的是GDI位圖。GDI位圖是由MFC中的CBitmap類來表示的。 1.CBitmap類 CBitmap類封裝了Windows的GDI位圖操作所需的大部分函數(shù)。 (1)位圖的初始化函數(shù)LoadBitmap BOOL LoadBitmap( LPCTSTR lpszResourceName ); BOOL LoadBitmap( UINT nIDResource );,7

42、.4.2. 位 圖,(2)位圖的創(chuàng)建函數(shù) BOOL CreateBitmap(int nWidth,int nHeight,UINT nPlanes,UINT nBitCount,const void *lpBits ); BOOL CreateBitmapIndirect(LPBITMAP lpBitmap); BOOL CreateCompatibleBitmap(CDC *pSrcDC, int nWidth,int nHeight); (3)位圖的顯示函數(shù) BOOL BitBlt(int x,int y,int nWidth,int nHeight,CDC *pSrcDC,int xS

43、rc,int ySrc,DWORD dwRop); BOOL StretchBlt(int x,int y,int nWidth,int nHeight,CDC *pSrcDC,int xSrc,int ySrc,int nSrcWidth,int nSrcHeight,DWORD dwRop);,7.4.2. 位 圖,2. GDI位圖的顯示步驟,(1)調(diào)用CBitmap類的CreateBitmap、CreateCompatibleBitmap以及 CreateBitmapIndirect函數(shù)創(chuàng)建一個適當(dāng)?shù)奈粓D對象。 (2) 調(diào)用CDC:CreateCompatibleDC函數(shù)創(chuàng)建一個內(nèi)存設(shè)備

44、環(huán)境,以便位圖在內(nèi)存中保存下來,并與指定設(shè)備(窗口設(shè)備)環(huán)境相兼容; (3)調(diào)用CDC:SelectObject函數(shù)將位圖對象選入內(nèi)存設(shè)備環(huán)境中; (4) 調(diào)用CDC:BitBlt或CDC:StretchBlt函數(shù)將位圖復(fù)制到實際設(shè)備環(huán)境中。 (5) 使用之后,恢復(fù)原來的內(nèi)存設(shè)備環(huán)境。,7.4.2. 位 圖,3.位圖的最終顯示 通過調(diào)用CDC:BitBlt函數(shù)或CDC:StretchBlt函數(shù)來執(zhí)行的。 BOOL BitBlt(int x,int y,int nWidth,int nHeight,CDC *pSrcDC,int xSrc,int ySrc,DWORD dwRop); BOOL

45、StretchBlt(int x,int y,int nWidth,int nHeight,CDC 8pSrcDC,int xSrc,int ySrc,int nSrcWidth,int nSrcHeight,DWORD dwRop);,7.4.3 圖 標(biāo),在Windows中一個應(yīng)用程序可以使用兩種尺寸的圖標(biāo):普通圖標(biāo)(大圖標(biāo)32*32)和小圖標(biāo)(16*16)。 1.圖標(biāo)的調(diào)入與清除(可使用CWinApp類的成員函數(shù)) (1)圖標(biāo)的調(diào)入(C*App類的成員函數(shù)) HICON LoadIcon(LPCTSTR lpszResourceName)const; HICON LoadIcon(UINT

46、 nIDResource)const; (2)使用系統(tǒng)預(yù)定義的標(biāo)準(zhǔn)圖標(biāo)(C*App類的成員函數(shù)) HICON LoadStandardIcon(LPCTSTR lpszIconName)const; (3)刪除一個圖標(biāo)(全局函數(shù)) BOOL DestroyIcon(HICON hIcon);,7.4.3 圖 標(biāo),2.圖標(biāo)的繪制(可使用CDC類的成員函數(shù)) BOOL DrawIcon(int x,int y,HICON hIcon); BOOL DrawIcon(POINT point,HICON hIcon); 3.應(yīng)用程序圖標(biāo)的改變 (1)在圖形編輯器窗口內(nèi)直接修改 (2) 使用GetCla

47、ssLong和SetClassLong函數(shù)。(CWnd類的成員函數(shù)) DWORD SetClassLong(HWND hWnd,int nIndex,LONG dwNewLong); DWORD GetClassLong(HWND hWnd,int nIndex);,補充:實時更新設(shè)置,在應(yīng)用程序中設(shè)置計時器。使用CWnd類的成員函數(shù)SetTimer來設(shè)置時間間隔。 如:SetTimer(1,1000,NULL) 第一個參數(shù)指定該計時器的標(biāo)識值(不能為0),第二參數(shù)指定計時器的時間間隔(單位為ms),第三個參數(shù)指定處理WM_TIMER消息的函數(shù),一般都設(shè)為NULL。 設(shè)置計時器后,還應(yīng)處理計時

48、器消息WM_TIMER,在相應(yīng)的類中添加該消息映射函數(shù),即每隔一個時間間隔執(zhí)行該操作一次。,7.4.4 光 標(biāo),1. 使用系統(tǒng)光標(biāo) Windows預(yù)定義了一些經(jīng)常使用的標(biāo)準(zhǔn)光標(biāo),這些光標(biāo)均可以使用函數(shù)CWinApp: LoadStandardCursor加載到程序中,其函數(shù)原型如下: HCURSOR LoadStandardCursor( LPCTSTR lpszCursorName ) const; lpszCursorName用來指定一個標(biāo)準(zhǔn)光標(biāo)名,它可以是下列宏定義:,7.4.4 光 標(biāo),IDC_ARROW 標(biāo)準(zhǔn)箭頭光標(biāo) IDC_IBEAM 標(biāo)準(zhǔn)文本輸入光標(biāo) IDC_WAIT 漏斗型計時

49、等待光標(biāo) IDC_CROSS 十字形光標(biāo) IDC_UPARROW 垂直箭頭光標(biāo) IDC_SIZEALL 四向箭頭光標(biāo) IDC_SIZENWSE 左上至右下的雙向箭頭光標(biāo) IDC_SIZENESW 左下至右上的雙向箭頭光標(biāo) IDC_SIZEWE 左右雙向箭頭光標(biāo) IDC_SIZENS 上下雙向箭頭光標(biāo),7.4.4 光 標(biāo),2.使用光標(biāo)資源 用編輯器創(chuàng)建或從外部調(diào)入的光標(biāo)資源,可通過函數(shù)CWinApp:LoadCursor進(jìn)行加載,其原型如下: HCURSOR LoadCursor( LPCTSTR lpszResourceName ) const; HCURSOR LoadCursor( UIN

50、T nIDResource ) const;,7.4.4 光 標(biāo),3.更改程序中的光標(biāo) 更改應(yīng)用程序中的光標(biāo)除了可以使用GetClassLong和SetClassLong函數(shù)外,最簡單的方法是用MFC ClassWizard映射WM_SETCURSOR消息,該消息是當(dāng)光標(biāo)移動到一個窗口內(nèi)并且還沒有捕捉到鼠標(biāo)時產(chǎn)生的。CWnd為此消息的映射函數(shù)定義這樣的原型: afx_msg BOOL OnSetCursor( CWnd* pWnd, UINT nHitTest, UINT message );,7.4.4 光 標(biāo),4. 示例,根據(jù)當(dāng)前鼠標(biāo)所在的位置來確定單文檔應(yīng)用程序光標(biāo)的類型,當(dāng)處在標(biāo)題欄時為一個動畫光標(biāo),當(dāng)處在客戶區(qū)時為一個自定義光標(biāo)。,7.5 打印與打印預(yù)覽,5,7.5.1 打印與打印預(yù)覽機制,當(dāng)程序在打印機上打印時,它使用的是CDC類的設(shè)備環(huán)境對象,并將它作為參數(shù)傳給視圖類的OnDraw函數(shù)。如果應(yīng)用程序要把顯示結(jié)果在打印機上打印出來,則此時OnDraw函數(shù)根據(jù)設(shè)備環(huán)境不同會被不同的函數(shù)調(diào)用。顯示時,OnPaint函數(shù)會調(diào)用OnDraw,此時設(shè)備環(huán)境為屏幕

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論