《Visual C++ 第二版》第8章圖形和文本
《《Visual C++ 第二版》第8章圖形和文本》由會(huì)員分享,可在線(xiàn)閱讀,更多相關(guān)《《Visual C++ 第二版》第8章圖形和文本(43頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
1、第第8章章圖形和文本圖形和文本 8.18.1設(shè)備環(huán)境和簡(jiǎn)單數(shù)據(jù)類(lèi)設(shè)備環(huán)境和簡(jiǎn)單數(shù)據(jù)類(lèi) 8.28.2圖形設(shè)備接口圖形設(shè)備接口 8.38.3圖形繪制圖形繪制 8.48.4字體與文字處理字體與文字處理 8.1設(shè)備環(huán)境和簡(jiǎn)單數(shù)據(jù)類(lèi)設(shè)備環(huán)境和簡(jiǎn)單數(shù)據(jù)類(lèi) 8.1.18.1.1設(shè)備環(huán)境和簡(jiǎn)單數(shù)據(jù)類(lèi)設(shè)備環(huán)境和簡(jiǎn)單數(shù)據(jù)類(lèi) 設(shè)備環(huán)境類(lèi)CDC提供了繪制和打印的全部函數(shù)。為了能讓用戶(hù)使用一些特殊的設(shè)備環(huán)境,CDC還派生了CPaintDC、CClientDC、CWindowDC和CMetaFileDC類(lèi)。(1)(1)CPaintDC比較特殊,它的構(gòu)造函數(shù)和析構(gòu)函數(shù)都是針對(duì)OnPaint進(jìn)行的,但用戶(hù)一旦獲得相關(guān)的CDC
2、指針,就可以將它當(dāng)成任何設(shè)備環(huán)境(包括屏幕、打印機(jī))指針來(lái)使用。CPaintDC類(lèi)的構(gòu)造函數(shù)會(huì)自動(dòng)調(diào)用BeginPaint,而它的析構(gòu)函數(shù)則會(huì)自動(dòng)調(diào)用EndPaint。(2)(2)CClientDC只能在窗口的客戶(hù)區(qū)(不包括邊框、標(biāo)題欄、菜單欄以及狀態(tài)欄)中進(jìn)行繪圖,點(diǎn)(0,0)通常指的是客戶(hù)區(qū)的左上角。而CWindowDC允許在窗口的任意位置中進(jìn)行繪圖,點(diǎn)(0,0)指整個(gè)窗口的左上角。CWindowDC和CClientDC構(gòu)造函數(shù)分別調(diào)用GetWindowDC和GetDC,但它們的析構(gòu)函數(shù)都是調(diào)用ReleaseDC函數(shù)。(3)(3)CMetaFileDC封裝了在一個(gè)Windows圖元文件中繪
3、圖的方法。圖元文件是一系列與設(shè)備無(wú)關(guān)的圖片的集合,由于它對(duì)圖象的保存比像素更精確,因而往往在要求較高的場(chǎng)合下使用,例如AutoCAD的圖像保存等。目前的Windows已使用增強(qiáng)格式(enhanced-format)的32位圖元文件來(lái)進(jìn)行操作。8.1設(shè)備環(huán)境和簡(jiǎn)單數(shù)據(jù)類(lèi)設(shè)備環(huán)境和簡(jiǎn)單數(shù)據(jù)類(lèi) 8.1.2坐標(biāo)映射坐標(biāo)映射 為了能保證打印的結(jié)果不受設(shè)備的影響,定義了一些映射模式,這些映射模式?jīng)Q定了設(shè)備坐標(biāo)和邏輯坐標(biāo)之間的關(guān)系,如表。這樣,我們就可以通過(guò)調(diào)用CDC:SetMapMode(int nMapMode)來(lái)設(shè)置相應(yīng)的映射模式。在MM_ISOTROPIC映射模式下,縱橫比總是1:1;但在MM_AN
4、ISOTROPIC映射模式下,x和y的比例因子可以獨(dú)立地變化,即圓可以被拉扁成橢圓形狀。在映射模式MM_ANISOTROPIC和MM_ISOTROPIC中,調(diào)用CDC:SetWindowExt(設(shè)置窗口大小)和CDC:SetViewportExt(設(shè)置視口大小)函數(shù)來(lái)設(shè)置所需要的比例因子。所謂“窗口”,可以理解成是一種邏輯坐標(biāo)下的窗口,“視口”是實(shí)際看到的那個(gè)窗口。根據(jù)“窗口”和“視口”的大小就可以確定x和y的比例因子,它們的關(guān)系如下:x比例因子=視口x大小/窗口x大小y比例因子=視口y大小/窗口y大小 8.1設(shè)備環(huán)境和簡(jiǎn)單數(shù)據(jù)類(lèi)設(shè)備環(huán)境和簡(jiǎn)單數(shù)據(jù)類(lèi)(1)(1)創(chuàng)建一個(gè)默認(rèn)的單文檔應(yīng)用程序Ex
5、_Draw。(2)(2)在CEx_DrawView:OnDraw函數(shù)中添加下列代碼:void CEx_DrawView:OnDraw(CDC*pDC)CEx_DrawDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);CRect rectClient;GetClientRect(rectClient);/獲得當(dāng)前窗口的客戶(hù)區(qū)大小pDC-SetMapMode(MM_ANISOTROPIC);/設(shè)置MM_ANISOTROPIC映射模式pDC-SetWindowExt(1000,1000);/設(shè)置窗口范圍pDC-SetViewportExt(rectClient.ri
6、ght,-rectClient.bottom);/設(shè)置視口范圍pDC-SetViewportOrg(rectClient.right/2,rectClient.bottom/2);pDC-Ellipse(CRect(-500,-500,500,500);(3)(3)編譯運(yùn)行,如圖。8.1設(shè)備環(huán)境和簡(jiǎn)單數(shù)據(jù)類(lèi)設(shè)備環(huán)境和簡(jiǎn)單數(shù)據(jù)類(lèi) 8.1.3CPoint、CSize和和CRect CPoint、CSize和和CRect類(lèi)的構(gòu)造函數(shù)類(lèi)的構(gòu)造函數(shù) CPoint類(lèi)帶參數(shù)的常用構(gòu)造函數(shù)原型如下:CPointCPoint(intint initX,intint initY););CPointCPoint(P
7、OINT(POINT initPt););CSize類(lèi)帶參數(shù)的常用構(gòu)造函數(shù)原型如下:CSizeCSize(intint initCX,intint initCY););CSizeCSize(SIZE(SIZE initSize););CRect類(lèi)帶參數(shù)的常用構(gòu)造函數(shù)原型如下:CRect(int CRect(int l,int,int t,int,int r,int,int b););CRectCRect(const RECT&(const RECT&srcRect););CRectCRect(LPCRECT(LPCRECT lpSrcRect););CRectCRect(POINT(POINT
8、 point,SIZE,SIZE size););CRectCRect(POINT(POINT topLeft,POINT,POINT bottomRight););l、t、r、b指定CRect的left、top、right和bottom成員的值。srcRect 和lpSrcRect用一個(gè)RECT結(jié)構(gòu)或指針來(lái)初始化CRect的成員。point指定矩形的左上角位置。size指定矩形的長(zhǎng)度和寬度。topLeft和bottomRight指定CRect的左上角和右下角的位置。8.1設(shè)備環(huán)境和簡(jiǎn)單數(shù)據(jù)類(lèi)設(shè)備環(huán)境和簡(jiǎn)單數(shù)據(jù)類(lèi) CRect類(lèi)的常用操作類(lèi)的常用操作 傳遞LPRECT、LPCRECT或RECT結(jié)
9、構(gòu)作為參數(shù)的任何地方,都可以用CRect對(duì)象來(lái)代替。構(gòu)造一個(gè)CRect時(shí),要使它符合規(guī)范。即使其left小于right,top小于bottom。一個(gè)不 符 合 規(guī) 范 的 矩 形,CRect的 許 多 成 員 函 數(shù) 都 不 會(huì) 有 正 確 的 結(jié) 果。常 常 用CRect:NormalizeRect函數(shù)使一個(gè)不符合規(guī)范的矩形合乎規(guī)范。成員函數(shù)InflateRect和DeflateRect用來(lái)擴(kuò)大和縮小一個(gè)矩形。由于它們的操作是相互的,也就是說(shuō),若指定InflateRect函數(shù)的參數(shù)為負(fù)值,那么操作的結(jié)果是縮小矩形,因此下面只給出InflateRect函數(shù)的原型:void void Infla
10、teRectInflateRect(intint x,intint y););void void InflateRectInflateRect(SIZE(SIZE size););void void InflateRectInflateRect(LPCRECT(LPCRECT lpRect););void void InflateRectInflateRect(intint l,intint t,intint r,intint b););x指定擴(kuò)大CRect左、右邊的數(shù)值。y指定擴(kuò)大CRect上、下邊的數(shù)值。size中的cx成員指定擴(kuò)大左、右邊的數(shù)值,cy指定擴(kuò)大上、下邊的數(shù)值。lpRect的
11、各個(gè)成員指定擴(kuò)大每一邊的數(shù)值。l、t、r和b指定擴(kuò)大CRect左、上、右和下邊的數(shù)值。對(duì)于前兩個(gè)重載函數(shù)來(lái)說(shuō),CRect的總寬度被增加了兩倍的x或cx,總高度被增加了兩倍的y或cy。成員函數(shù)IntersectRect和UnionRect用來(lái)將兩個(gè)矩形進(jìn)行相交和合并。原型如下:BOOL BOOL IntersectRectIntersectRect(LPCRECT(LPCRECT lpRect1,LPCRECT,LPCRECT lpRect2););BOOL BOOL UnionRectUnionRect(LPCRECT(LPCRECT lpRect1,LPCRECT,LPCRECT lpRe
12、8.1設(shè)備環(huán)境和簡(jiǎn)單數(shù)據(jù)類(lèi)設(shè)備環(huán)境和簡(jiǎn)單數(shù)據(jù)類(lèi)8.1設(shè)備環(huán)境和簡(jiǎn)單數(shù)據(jù)類(lèi)設(shè)備環(huán)境和簡(jiǎn)單數(shù)據(jù)類(lèi) 8.1.4顏色和顏色對(duì)話(huà)框顏色和顏色對(duì)話(huà)框 一個(gè)彩色象素常用的顏色空間有RGB和YUV兩種。CDC使用的是RGB顏色空間。COLORREF是用來(lái)表示RGB顏色的一個(gè)32位的數(shù)據(jù)類(lèi)型,它可以用十六進(jìn)制表示一個(gè)RGB值:0 x00bbggrr rr、gg、bb表示紅、綠、藍(lán)三個(gè)顏色分量的16進(jìn)制值。使用下列的宏操作:GetBValue 獲得32位RGB顏色值中的藍(lán)色分量GetGValue 獲得32位RGB顏色值中的綠色分量GetRValue 獲得32位RGB顏色值中的紅色分量RGB 將指定的R、G、B分量
13、值轉(zhuǎn)換成一個(gè)32位的RGB顏色值。MFC的CColorDialog類(lèi)為應(yīng)用程序提供了顏色選擇通用對(duì)話(huà)框。構(gòu)造函數(shù):CColorDialog(COLORREF clrInit=0,DWORD dwFlags=0,CWnd*pParentWnd=NULL);dwFlags表示定制對(duì)話(huà)框外觀和功能的系列標(biāo)志參數(shù)??梢允窍铝兄换颉眧”組合:CC_ANYCOLOR 在基本顏色單元中列出所有可得到的顏色CC_FULLOPEN 顯示所有的顏色對(duì)話(huà)框界面CC_PREVENTFULLOPEN 禁用“規(guī)定自定義顏色”按鈕CC_SHOWHELP 在對(duì)話(huà)框中顯示“幫助”按鈕CC_SOLIDCOLOR 在基本顏色單元
14、中只列出所得到的純色 單擊對(duì)話(huà)框“確定”退出(即DoModal返回 IDOK)時(shí),可調(diào)用下列成員獲得相應(yīng)的顏色。COLORREF COLORREF GetColorGetColor()const;()const;/返回用戶(hù)選擇的顏色。void void SetCurrentColorSetCurrentColor(COLORREF(COLORREF clr);/);/強(qiáng)制使用clr作為當(dāng)前選擇的顏色static COLORREF*GetSavedCustomColors();/返回用戶(hù)自己定義顏色 8.2圖形設(shè)備接口圖形設(shè)備接口 Windows為設(shè)備環(huán)境提供了各種各樣的繪圖工具,例如用于畫(huà)線(xiàn)的
15、“畫(huà)筆”、填充區(qū)域的“畫(huà)刷”以及用于繪制文本的“字體”。MFC封裝了這些工具,并提供相應(yīng)的類(lèi)來(lái)作為應(yīng)用程序的圖形設(shè)備接口GDI,這些類(lèi)有一個(gè)共同的抽象基類(lèi)CGdiObject,如表。8.2圖形設(shè)備接口圖形設(shè)備接口 8.2.1GDI對(duì)象一般使用方法對(duì)象一般使用方法 選擇GDI對(duì)象進(jìn)行繪圖時(shí),往往遵循著下列的步驟:(1)(1)在堆棧中定義一個(gè)GDI對(duì)象,用相應(yīng)的函數(shù)創(chuàng)建此GDI對(duì)象。要注意:有些GDI派生類(lèi)的構(gòu)造函數(shù)允許用戶(hù)提供足夠的信息,從而一步即可完成對(duì)象的創(chuàng)建任務(wù)。(2)(2)將構(gòu)造的GDI對(duì)象選入當(dāng)前設(shè)備環(huán)境中,但不要忘記將原來(lái)的GDI對(duì)象保存起來(lái)。(3)(3)繪圖結(jié)束后,恢復(fù)當(dāng)前設(shè)備環(huán)境
16、中原來(lái)的GDI對(duì)象。(4)(4)GDI對(duì)象是在堆棧中創(chuàng)建中,程序結(jié)束后,框架會(huì)自動(dòng)刪除程序創(chuàng)建的GDI對(duì)象。具體操作可像下面的代碼過(guò)程:void CMyView:OnDraw(CDC*pDC)CPen penBlack;/定義一個(gè)畫(huà)筆變量penBlack.CreatePen(PS_SOLID,2,RGB(0,0,0);/創(chuàng)建畫(huà)筆/將此畫(huà)筆選入當(dāng)前設(shè)備環(huán)境并保存原來(lái)的畫(huà)筆CPen*pOldPen=pDC-SelectObject(&penBlack);/用此畫(huà)筆繪圖pDC-MoveTo(.);pDC-LineTo(.);pDC-SelectObject(pOldPen);/恢復(fù)設(shè)備環(huán)境中原來(lái)的畫(huà)
17、筆8.2圖形設(shè)備接口圖形設(shè)備接口 8.2.2畫(huà)筆畫(huà)筆 畫(huà)筆是繪制各種直線(xiàn)和曲線(xiàn)的一種圖形工具,可分為修飾畫(huà)筆和幾何畫(huà)筆兩種類(lèi)型。幾何畫(huà)筆不但有修飾畫(huà)筆的屬性,還跟畫(huà)刷的樣式、陰影線(xiàn)類(lèi)型有關(guān),通常用在對(duì)繪圖有較高要求的場(chǎng)合。修飾畫(huà)筆通常用在簡(jiǎn)單的直線(xiàn)和曲線(xiàn)等場(chǎng)合。一個(gè)修飾畫(huà)筆通常具有寬度、風(fēng)格和顏色三種屬性。畫(huà)筆的寬度用來(lái)確定所畫(huà)的線(xiàn)條寬度,它是用設(shè)備單位表示的。默認(rèn)的畫(huà)筆寬度是一個(gè)像素單位。畫(huà)筆的顏色確定了所畫(huà)的線(xiàn)條顏色。畫(huà)筆的風(fēng)格確定了所繪圖形的線(xiàn)型,它通常有實(shí)線(xiàn)、虛線(xiàn)、點(diǎn)線(xiàn)、點(diǎn)劃線(xiàn)、雙點(diǎn)劃線(xiàn)、不可見(jiàn)線(xiàn)和內(nèi)框線(xiàn)等七種風(fēng)格。如表。8.2圖形設(shè)備接口圖形設(shè)備接口創(chuàng)建一個(gè)修飾畫(huà)筆,可以使用CPen
18、類(lèi)的CreatePen函數(shù),其原型如下:BOOL BOOL CreatePenCreatePen(intint nPenStyle,intint nWidth,COLORREF,COLORREF crColor););參數(shù)nPenStyle、nWidth、crColor指定畫(huà)筆的風(fēng)格、寬度和顏色。此外,還有一個(gè)CreatePenIndirect函數(shù)也是用來(lái)創(chuàng)建畫(huà)筆對(duì)象,它的作用與CreatePen函數(shù)是完全一樣的,只是畫(huà)筆的三個(gè)屬性不是直接出現(xiàn)在函數(shù)參數(shù)中,而是通過(guò)一個(gè)LOGPEN結(jié)構(gòu)間接地給出。BOOL BOOL CreatePenIndirectCreatePenIndirect(LPLO
19、GPEN(LPLOGPEN lpLogPen););此函數(shù)用由LOGPEN結(jié)構(gòu)指針指定的相關(guān)參數(shù)創(chuàng)建畫(huà)筆,LOGPEN結(jié)構(gòu)如下:typedef struct tagLOGPEN /*lgpn*/UINT lopnStyle;/畫(huà)筆風(fēng)格 POINT lopnWidth;/POINT結(jié)構(gòu)的y不起作用,而用x表示畫(huà)筆寬度 COLORREF lopnColor;/畫(huà)筆顏色 LOGPEN;注意:l修 飾 畫(huà) 筆 的 寬 度 大 于 1個(gè) 像 素 時(shí),畫(huà) 筆 的 風(fēng) 格 只 能 取 PS_NULL、PS_SOLID或 PS_INSIDEFRAME,定義為其他風(fēng)格不會(huì)起作用。l畫(huà)筆的創(chuàng)建工作也可在畫(huà)筆的構(gòu)造
20、函數(shù)中進(jìn)行,它具有下列原型:CPen(int nPenStyle,int nWidth,COLORREF crColor);8.2圖形設(shè)備接口圖形設(shè)備接口 8.2.3畫(huà)刷畫(huà)刷 畫(huà)刷用于指定填充的特性,許多窗口、控件以及其他區(qū)域都需要用畫(huà)刷進(jìn)行填充繪制,它比畫(huà)筆的內(nèi)容更加豐富。畫(huà)刷的屬性通常包括填充色、填充圖案和填充樣式三種。畫(huà)刷的填充色是使用COLORREF顏色類(lèi)型,畫(huà)刷的填充圖案通常是用戶(hù)定義的8 x 8位圖,填充樣式往往是CDC內(nèi)部定義的一些特性,是以HS_為前綴的標(biāo)識(shí),如圖:8.2圖形設(shè)備接口圖形設(shè)備接口 CBrush類(lèi)根據(jù)畫(huà)刷屬性提供了相應(yīng)的創(chuàng)建函數(shù),原型如下:BOOL BOOL Cr
21、eateSolidBrushCreateSolidBrush(COLORREF(COLORREF crColor););/創(chuàng)建填充色畫(huà)刷BOOL BOOL CreateHatchBrushCreateHatchBrush(intint nIndex,COLORREF COLORREF crColor );/);/創(chuàng)建填充樣式畫(huà)刷 與畫(huà)筆相類(lèi)似,也有一個(gè)LOGBRUSH 邏輯結(jié)構(gòu)用于畫(huà)刷屬性的定義,并通過(guò) CBrush的成員函數(shù)CreateBrushIndirect來(lái)創(chuàng)建,原型如下:BOOL BOOL CreateBrushIndirectCreateBrushIndirect(const LO
22、GBRUSH*(const LOGBRUSH*lpLogBrush););LOGBRUSH 邏輯結(jié)構(gòu)如下定義:typedef struct tagLOGBRUSH /lb UINT lbStyle;/風(fēng)格 COLORREF lbColor;/填充色 LONG lbHatch;/填充樣式 LOGBRUSH;注意:l畫(huà)刷的創(chuàng)建工作也可在其構(gòu)造函數(shù)中進(jìn)行,它具有下列原型:CBrushCBrush(COLORREF(COLORREF crColor););CBrushCBrush(intint nIndex,COLORREF,COLORREF crColor););CBrushCBrush(CBitm
23、apCBitmap*pBitmap););l畫(huà)刷也可用位圖來(lái)指定其填充圖案,但該位圖應(yīng)該是88像素,若位圖太大,Windows則只使用其左上角的8 8的像素。l 畫(huà)刷僅對(duì)繪圖函數(shù)Chord、Ellipse、FillRect、FrameRect、InvertRect、Pie、Polygon、PolyPolygon、Rectangle、RoundRect有效。8.2圖形設(shè)備接口圖形設(shè)備接口8.2.4位圖位圖 CBitmap類(lèi)類(lèi) LoadBitmap是位圖的初始化函數(shù),其函數(shù)原型如下:BOOL BOOL LoadBitmapLoadBitmap(LPCTSTR(LPCTSTR lpszResourc
24、eName););BOOL BOOL LoadBitmapLoadBitmap(UINT(UINT nIDResource););函數(shù)從應(yīng)用程序中調(diào)入一個(gè)位圖資源。若用戶(hù)直接創(chuàng)建一個(gè)位圖對(duì)象,可使用CBitmap類(lèi)中的CreateBitmap、CreateBitmapIndirect以及CreateCompatibleBitmap函數(shù),其原型如下。BOOL BOOL CreateBitmapCreateBitmap(intint nWidth,intint nHeight,UINT UINT nPlanes,UINT UINT nBitcount,const void*,const void*
25、lpBits););該函數(shù)用指定的寬度、和位模式創(chuàng)建一個(gè)位圖對(duì)象。參數(shù)nPlanes表示位圖的顏色位面的數(shù)目,nBitcount表示每個(gè)像素的顏色位個(gè)數(shù),lpBits表示包含位值的短整型數(shù)組;若此數(shù)組為NULL,則位圖對(duì)象還未初始化。BOOL BOOL CreateBitmapIndirectCreateBitmapIndirect(LPBITMAP(LPBITMAP lpBitmap););該函數(shù)直接用BITMAP結(jié)構(gòu)來(lái)創(chuàng)建一個(gè)位圖對(duì)象。BOOL BOOL CreateCompatibleBitmapCreateCompatibleBitmap(CDC*(CDC*pDC,intint nWi
26、dth,intint nHeight););該函數(shù)為某設(shè)備環(huán)境創(chuàng)建一個(gè)指定的寬度和高度的位圖對(duì)象。8.2圖形設(shè)備接口圖形設(shè)備接口 GDI位圖的顯示位圖的顯示 對(duì)于GDI位圖的顯示則必須遵循下列步驟:(1)(1)CreateBitmap、CreateCompatibleBitmap及 CreateBitmapIndirect函數(shù)創(chuàng)建一個(gè)適當(dāng)?shù)奈粓D對(duì)象。(2)(2)調(diào)用CDC:CreateCompatibleDC函數(shù)創(chuàng)建一個(gè)內(nèi)存設(shè)備環(huán)境,以便位圖在內(nèi)存中保存下來(lái),并與指定設(shè)備(窗口設(shè)備)環(huán)境相兼容;(3)(3)調(diào)用CDC:SelectObject函數(shù)將位圖對(duì)象選入內(nèi)存設(shè)備環(huán)境中;(4)(4)調(diào)用C
27、DC:BitBlt或CDC:StretchBlt函數(shù)將位圖復(fù)制到實(shí)際設(shè)備環(huán)境中。(5)(5)使用之后,恢復(fù)原來(lái)的內(nèi)存設(shè)備環(huán)境。8.2圖形設(shè)備接口圖形設(shè)備接口 (1)(1)創(chuàng)建一個(gè)默認(rèn)的單文檔應(yīng)用程序Ex_BMP。(2)(2)按快捷鍵Ctrl+R,彈出“插入資源”對(duì)話(huà)框,選擇Bitmap資源類(lèi)型。(3)(3)單擊導(dǎo)入,將文件類(lèi)型選擇為“所有文件(*.*)”,從外部文件中選定一個(gè)位圖文件,單擊Import。保留默認(rèn)的位圖資源標(biāo)識(shí)IDB_BITMAP1。(4)(4)在CEx_BMPView:OnDraw函數(shù)中添加下列代碼:void CEx_BMPView:OnDraw(CDC*pDC)CEx_BMP
28、Doc*pDoc=GetDocument();ASSERT_VALID(pDoc);CBitmap m_bmp;m_bmp.LoadBitmap(IDB_BITMAP1);/調(diào)入位圖資源BITMAP bm;/定義一個(gè)BITMAP結(jié)構(gòu)變量,以便獲取位圖參數(shù)m_bmp.GetObject(sizeof(BITMAP),&bm);CDC dcMem;/定義并創(chuàng)建一個(gè)內(nèi)存設(shè)備環(huán)境dcMem.CreateCompatibleDC(pDC);CBitmap*pOldbmp=dcMem.SelectObject(&m_bmp);pDC-BitBlt(0,0,bm.bmWidth,bm.bmHeight,&d
29、cMem,0,0,SRCCOPY);/將位圖復(fù)制到實(shí)際的設(shè)備環(huán)境中dcMem.SelectObject(pOldbmp);/恢復(fù)原來(lái)的內(nèi)存設(shè)備環(huán)境 8.2圖形設(shè)備接口圖形設(shè)備接口 (5)(5)編譯運(yùn)行,如圖。通過(guò)上述代碼過(guò)程可以看出:位圖的最終顯示是通過(guò)調(diào)用CDC:BitBlt函數(shù)來(lái)完成的。除此之外,也可以使用CDC:StretchBlt函數(shù)。這兩個(gè)函數(shù)的區(qū)別在于:StretchBlt函數(shù)可以對(duì)位圖進(jìn)行縮小或放大,而B(niǎo)itBlt則不能,但BitBlt的顯示更新速度較快。它們的原型如下:BOOL BitBlt(int x,int y,int nWidth,int nHeight,CDC*pSrc
30、DC,int xSrc,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);8.3圖形繪制圖形繪制 8.3.1畫(huà)點(diǎn)、線(xiàn)畫(huà)點(diǎn)、線(xiàn) 點(diǎn)點(diǎn) 畫(huà)點(diǎn)是通過(guò)調(diào)用CDC:SetPixel或CDC:SetPixelV函數(shù)來(lái)實(shí)現(xiàn)的。COLORREF COLORREF SetPixelSetPixel(intint x,x,intint y,COLORREF y,COLORREF
31、crColorcrColor););COLORREF COLORREF SetPixelSetPixel(POINT point,COLORREF(POINT point,COLORREF crColorcrColor););BOOL BOOL SetPixelV(intSetPixelV(int x,x,intint y,COLORREF y,COLORREF crColorcrColor););BOOL BOOL SetPixelVSetPixelV(POINT point,COLORREF(POINT point,COLORREF crColorcrColor););GetPixel函數(shù)
32、是用來(lái)獲取指定點(diǎn)的顏色。COLORREF COLORREF GetPixelGetPixel(intint x,intint y)const;)const;COLORREF COLORREF GetPixelGetPixel(POINT(POINT point)const;)const;畫(huà)線(xiàn)畫(huà)線(xiàn)CDC的LineTo和MoveTo函數(shù)就是用來(lái)實(shí)現(xiàn)畫(huà)線(xiàn)功能的兩個(gè)函數(shù):BOOL BOOL LineToLineTo(intint x,intint y););BOOL BOOL LineToLineTo(POINT(POINT point););CPointCPoint MoveToMoveTo(int
33、int x,intint y););CPointCPoint MoveToMoveTo(POINT(POINT point););8.3圖形繪制圖形繪制 折線(xiàn)折線(xiàn) 除了LineTo函數(shù)可用來(lái)畫(huà)線(xiàn)之外,CDC中還提供了一系列用于畫(huà)各種折線(xiàn)的函數(shù)。它們主要是Polyline、PolyPolyline和PolylineTo。這三個(gè)函數(shù)中,Polyline和PolyPolyline既不使用當(dāng)前位置,也不更新當(dāng)前位置;而PolylineTo總是把當(dāng)前位置作為起始點(diǎn),并且在折線(xiàn)畫(huà)完之后,還把折線(xiàn)終點(diǎn)所在位置設(shè)為新的當(dāng)前位置。BOOL BOOL PolylinePolyline(LPPOINT(LPPOIN
34、T lpPoints,intint nCount););BOOL BOOL PolylineToPolylineTo(const POINT*(const POINT*lpPoints,intint nCount););這兩個(gè)函數(shù)用來(lái)畫(huà)一系列連續(xù)的折線(xiàn)。參數(shù)lpPoints是POINT或CPoint的頂點(diǎn)數(shù)組;nCount表示數(shù)組中頂點(diǎn)的個(gè)數(shù),它至少為2。BOOL BOOL PolyPolylinePolyPolyline(const const POINT*POINT*lpPoints,const const DWORD*DWORD*lpPolyPoints,intint nCount);)
35、;此函數(shù)可用來(lái)繪制多條折線(xiàn)。其中l(wèi)pPoints同前定義,lpPolyPoints表示各條折線(xiàn)所需的頂點(diǎn)數(shù),nCount表示折線(xiàn)的數(shù)目。8.3圖形繪制圖形繪制 8.3.2矩形和多邊形矩形和多邊形 矩形和圓角矩形矩形和圓角矩形 CDC的Rectangle和RoundRect函數(shù)用于矩形和圓角矩形的繪制,原型:BOOL Rectangle(BOOL Rectangle(intint x1,intint y1,intint x2,intint y2););BOOL Rectangle(LPCRECTBOOL Rectangle(LPCRECT lpRect););BOOL BOOL RoundRec
36、tRoundRect(intint x1,intint y1,intint x2,intint y2,intint x3,intint y3););BOOL BOOL RoundRectRoundRect(LPCRECT(LPCRECT lpRect,POINT,POINT point););如圖。設(shè)置多邊形填充模式設(shè)置多邊形填充模式 多邊形填充模式有兩種選擇:ALTERNATE和WINDING。ALTERNATE模式是尋找相鄰的奇偶邊作為填充區(qū)域,WINDING是按順時(shí)針或逆時(shí)針進(jìn)行尋找;對(duì)于像五角星這樣的圖形,填充的結(jié)果大不一樣,如圖。8.3圖形繪制圖形繪制 多邊形多邊形 多邊形可以說(shuō)就是
37、由首尾相接的封閉折線(xiàn)所圍成的圖形。畫(huà)多邊形的函數(shù)Polygon原型如下:BOOL Polygon(LPPOINTBOOL Polygon(LPPOINT lpPoints,intint nCount););Polygon函數(shù)的參數(shù)形式與Polyline函數(shù)是相同的。但也稍有一點(diǎn)小差異。例如,要畫(huà)一個(gè)三角形,使用Polyline函數(shù),頂點(diǎn)數(shù)組中就得給出四個(gè)頂點(diǎn)(盡管始點(diǎn)和終點(diǎn)重復(fù)出現(xiàn)),而用Polygon函數(shù)則只需給出三個(gè)頂點(diǎn)。與PolyPolyline可畫(huà)多條折線(xiàn)一樣,使用PolyPolygon函數(shù),一次可畫(huà)出多個(gè)多邊形,這兩個(gè)函數(shù)的參數(shù)形式和含義也一樣。BOOL PolyPolygon(LP
38、POINT lpPoints,LPINT lpPolyCounts,int nCount);8.3圖形繪制圖形繪制 8.3.3曲線(xiàn)曲線(xiàn) 圓弧和橢圓圓弧和橢圓 調(diào)用CDC的Arc函數(shù)可以畫(huà)一條橢圓弧線(xiàn)或者整個(gè)橢圓。Arc函數(shù)的原型:BOOL Arc(BOOL Arc(intint x1,x1,intint y1,y1,intint x2,x2,intint y2,y2,intint x3,x3,intint y3,y3,intint x4,x4,intint y4);y4);BOOL Arc(LPCRECT BOOL Arc(LPCRECT lpRectlpRect,POINT,POINT pt
39、StartptStart,POINT,POINT ptEndptEnd););通過(guò)調(diào)用SetArcDirection函數(shù)將繪制方向改設(shè)為順時(shí)針?lè)较?。intint SetArcDirectionSetArcDirection(intint nArcDirectionnArcDirection););ArcTo與Arc函數(shù)的唯一的區(qū)別是:ArcTo將圓弧的終點(diǎn)作為新的當(dāng)前位置,而Arc不會(huì)。BOOL BOOL ArcToArcTo(intint x1,intint y1,intint x2,intint y2,intint x3,intint y3,intint x4,intint y4););B
40、OOL BOOL ArcToArcTo(LPCRECT(LPCRECT lpRect,POINT,POINT ptStart,POINT,POINT ptEnd););調(diào)用CDC成員函數(shù)Ellipse可以用當(dāng)前畫(huà)刷繪制一個(gè)橢圓區(qū)域。BOOL Ellipse(BOOL Ellipse(intint x1,intint y1,intint x2,intint y2););BOOL Ellipse(LPCRECTBOOL Ellipse(LPCRECT lpRect););8.3圖形繪制圖形繪制弦形和扇形弦形和扇形 CDC函數(shù)Chord和Pie是用來(lái)繪制弦形(圖8.8)和扇形(圖8.9)。BOOL
41、Chord(BOOL Chord(intint x1,intint y1,intint x2,intint y2,intint x3,intint y3,intint x4,intint y4););BOOL Chord(LPCRECT BOOL Chord(LPCRECT lpRect,POINT,POINT ptStart,POINT,POINT ptEnd););BOOL Pie(BOOL Pie(intint x1,intint y1,intint x2,intint y2,intint x3,intint y3,intint x4,intint y4););BOOL Pie(LPCR
42、ECT lpRect,POINT ptStart,POINT ptEnd);Bzier曲線(xiàn)曲線(xiàn) 函數(shù)PolyBezier是用來(lái)畫(huà)出一條或多條Bzier曲線(xiàn)的,其函數(shù)原型如下:BOOL PolyBezier(const POINT*lpPoints,int nCount);如果需要使用當(dāng)前位置,那么就應(yīng)該使用PolyBezierTo函數(shù)。BOOL PolyBezierTo(const POINT*lpPoints,int nCount);8.3圖形繪制圖形繪制8.3.4圖形繪制示例圖形繪制示例 例例Ex_SDI Ex_SDI 繪制線(xiàn)圖。(1)(1)創(chuàng)建一個(gè)默認(rèn)的單文檔應(yīng)用程序Ex_SDI。(2)
43、(2)在CEx_GDIView:OnDraw函數(shù)中添加下列代碼:(3)(3)編譯運(yùn)行,如圖。編譯運(yùn)行,如圖。需要說(shuō)明的是:l大多數(shù)的繪圖函數(shù)一般都是添加在用戶(hù)視圖中的OnDraw函數(shù)內(nèi),這時(shí)因?yàn)镺nDraw是CView類(lèi)的一個(gè)虛成員函數(shù),每當(dāng)視窗需要被重新繪制時(shí),系統(tǒng)都要調(diào)用OnDraw函數(shù)。當(dāng)用戶(hù)改變了窗口尺寸,或當(dāng)窗口恢復(fù)了先前被覆蓋的部分,或當(dāng)應(yīng)用程序改變了窗口數(shù)據(jù)時(shí),窗口都需要被重新繪制。通過(guò)重載此函數(shù),用戶(hù)程序隨OnDraw一起調(diào)用,確保圖形在窗口的顯示。與OnDraw類(lèi)似的還有OnPaint函數(shù)。l 若對(duì)同一個(gè)GDI對(duì)象重新構(gòu)造,則必須調(diào)用Detach函數(shù)把該對(duì)象從GDI中分離出來(lái)
44、。8.3圖形繪制圖形繪制8.3圖形繪制圖形繪制 8.3.5在對(duì)話(huà)框控件中繪制圖形在對(duì)話(huà)框控件中繪制圖形 (1)(1)創(chuàng)建一個(gè)基于對(duì)話(huà)框應(yīng)用程序項(xiàng)目Ex_CtrlDraw。(2)(2)將對(duì)話(huà)框標(biāo)題設(shè)為“在控件中繪圖”,刪除取消,將確定標(biāo)題改為“退出”,打開(kāi)對(duì)話(huà)框網(wǎng)格,添加靜態(tài)文本和組合框控件。左邊靜態(tài)文本控件用來(lái)繪制圖 形,將 其“Extended Styles”中 的“Static edge”屬 性 選 中,標(biāo) 識(shí) 符 設(shè) 為IDC_DRAW。(3)(3)打開(kāi)Member Variables頁(yè)面,為組合框添加成員變量m_hatchCombo,其類(lèi)型為Control類(lèi)的CComboBox。(4)
45、(4)為對(duì)話(huà)框類(lèi)CEx_CtrlDrawDlg添加一個(gè)int類(lèi)型的成員變量m_nHatch。(5)(5)為對(duì)話(huà)框類(lèi)CEx_CtrlDrawDlg添加一個(gè)void類(lèi)型的成員函數(shù)DrawCtrl,代碼:void CEx_CtrlDrawDlg:DrawCtrl()CWnd*pWnd=GetDlgItem(IDC_DRAW);/獲得IDC_DRAW控件窗口指針CDC*pDC=pWnd-GetDC();/獲得窗口當(dāng)前的設(shè)備環(huán)境指針CBrush drawBrush;/定義畫(huà)刷變量drawBrush.CreateHatchBrush(m_nHatch,RGB(0,0,0);/創(chuàng)建一個(gè)畫(huà)刷。CBrush*p
46、OldBrush=pDC-SelectObject(&drawBrush);CRect rcClient;pWnd-GetClientRect(rcClient);pDC-Rectangle(rcClient);pDC-SelectObject(pOldBrush);8.3圖形繪制圖形繪制(6)(6)在CEx_CtrlDrawDlg:OnInitDialog中添加下代碼:BOOL CEx_CtrlDrawDlg:OnInitDialog()CDialog:OnInitDialog();CString str6=“水平線(xiàn)”,“豎直線(xiàn)”,“向下斜線(xiàn)”,“向上斜線(xiàn)”,“十字線(xiàn),交叉線(xiàn);int nIn
47、dex;for(int i=0;iUpdateWindow();DrawCtrl();(9)(9)編譯運(yùn)行并測(cè)試。8.4字體與文字處理字體與文字處理 8.4.1字體和字體對(duì)話(huà)框字體和字體對(duì)話(huà)框 字體的屬性和創(chuàng)建字體的屬性和創(chuàng)建 字體的屬性主要屬性有字樣、風(fēng)格和尺寸三個(gè)。字樣是字符書(shū)寫(xiě)和顯示時(shí)表現(xiàn)出的特定模式。字體風(fēng)格主要表現(xiàn)為字體的粗細(xì)和是否傾斜等特點(diǎn)。字體尺寸是指定字符所占區(qū)域的大小。字體尺寸可以取毫米或英寸作為單位。系統(tǒng)定義一種“邏輯字體”,它是應(yīng)用程序?qū)τ诶硐胱煮w的一種描述方式。使用邏輯字體繪制文字時(shí),系統(tǒng)會(huì)采用一種特定的算法把邏輯字體映射為最匹配的物理字體。邏輯字體的具體屬性可由LOG
48、FONT結(jié)構(gòu)來(lái)描述,這里僅列最常用到的結(jié)構(gòu)成員。typedef struct tagLOGFONT /lf LONG lfHeight;/字體的邏輯高度 LONG lfWidth;/字符的平均邏輯寬度 LONG lfEscapement;/傾角 LONG lfOrientation;/書(shū)寫(xiě)方向 LONG lfWeight;/字體的粗細(xì)程度 BYTE lfItalic;/斜體標(biāo)志 BYTE lfUnderline;/下劃線(xiàn)標(biāo)志 BYTE lfStrikeOut;/刪除線(xiàn)標(biāo)志 BYTE lfCharSet;/字符集,漢字必須為GB2312_CHARSET TCHAR lfFaceNameLF_FA
49、CESIZE;/字樣名稱(chēng)/LOGFONT;8.4字體與文字處理字體與文字處理 lfHeight表示字符的邏輯高度。這里的高度是字符的純高度,當(dāng)此值 0時(shí),系統(tǒng)將此值映射為實(shí)際字體單元格的高度;當(dāng)=0時(shí),系統(tǒng)將使用默認(rèn)的值;當(dāng)SelectObject(&cf);pDC-TextOut(100,100,Hello);pDC-SelectObject(oldfont);/恢復(fù)設(shè)備環(huán)境原來(lái)的屬性cf.DeleteObject();/刪除字體對(duì)象 8.4字體與文字處理字體與文字處理使用字體對(duì)話(huà)框使用字體對(duì)話(huà)框 CFontDialog類(lèi)提供了字體及其文本顏色選擇的通用對(duì)話(huà)框,如圖。它的構(gòu)造函數(shù)如下:CFo
50、ntDialog(LPLOGFONT lplfInitial=NULL,DWORD dwFlags=CF_EFFECTS|CF_SCREENFONTS,CDC*pdcPrinter=NULL,CWnd*pParentWnd=NULL);當(dāng)字體對(duì)話(huà)框DoModal返回IDOK后,可使用下列的成員函數(shù):void GetCurrentFont(LPLOGFONT lplf);/返回用戶(hù)選擇的LOGFONT字體CString GetFaceName()const;/返回用戶(hù)選擇的字體名稱(chēng)CString GetStyleName()const;/返回用戶(hù)選擇的字體樣式名稱(chēng)int GetSize()con
51、st;/返回用戶(hù)選擇的字體大小COLORREF GetColor()const;/返回用戶(hù)選擇的文本顏色int GetWeight()const;/返回用戶(hù)選擇的字體粗細(xì)程度BOOL IsStrikeOut()const;/判斷是否有刪除線(xiàn)BOOL IsUnderline()const;/判斷是否有下劃線(xiàn)BOOL IsBold()const;/判斷是否是粗體BOOL IsItalic()const;/判斷是否是斜體。8.4字體與文字處理字體與文字處理 8.4.2常用文本輸出函數(shù)常用文本輸出函數(shù) CDC類(lèi)提供了四個(gè)輸出文本的成員函數(shù):TextOut、ExtTextOut、TabbedTextOu
52、t和DrawText。對(duì)于這四個(gè)函數(shù),應(yīng)根據(jù)具體情況來(lái)選用。virtual BOOL virtual BOOL TextOutTextOut(intint x,intint y,LPCTSTR,LPCTSTR lpszString,intint nCount););BOOL BOOL TextOutTextOut(intint x,intint y,const,const CStringCString&str););TextOut函數(shù)是用當(dāng)前字體在指定位置(x,y)處顯示一個(gè)文本。參數(shù)中l(wèi)pszString和str指定即將顯示的文本,nCount表示文本的字節(jié)長(zhǎng)度。virtual virtua
53、l CSizeCSize TabbedTextOutTabbedTextOut(intint x,intint y,LPCTSTRLPCTSTR lpszString,intint nCount,int int nTabPositions,LPINTLPINT lpnTabStopPositions,int int nTabOrigin ););CSizeCSize TabbedTextOutTabbedTextOut(intint x,intint y,const,const CStringCString&str,intint nTabPositions,LPINT,LPINT lpnTab
54、StopPositions,int,int nTabOrigin););TabbedTextOut也是用當(dāng)前字體在指定位置處顯示一個(gè)文本,它還根據(jù)指定的制表位(Tab)設(shè)置相應(yīng)字符位置,函數(shù)成功時(shí)返回輸出文本的大小。nTabPositions表示lpnTabStopPositions數(shù)組的大小,lpnTabStopPositions表示多個(gè)遞增的制表位的數(shù)組,nTabOrigin表示制表位x方向的起始點(diǎn)(邏輯坐標(biāo))。如果nTabPositions為0,且lpnTabStopPositions為NULL,則使用默認(rèn)的制表位,即一個(gè)Tab相當(dāng)于8個(gè)字符。virtual virtual intint
55、 DrawTextDrawText(LPCTSTRLPCTSTR lpszString,intint nCount,LPRECTLPRECT lpRect,UINT UINT nFormat););int DrawText(const CString&str,LPRECT lpRect,UINT nFormat);8.4字體與文字處理字體與文字處理 DrawText函數(shù)是當(dāng)前字體在指定矩形中對(duì)文本進(jìn)行格式化繪制。lpRect指定文本繪制時(shí)的參考矩形,本身不顯示;nFormat表示文本的格式,可以是常用值之一或“|”組合:DT_BOTTOM 下對(duì)齊文本,該值還必須與DT_SINGLELINE組合
56、DT_CENTER 水平居中DT_END_ELLIPSIS 使用省略號(hào)取代文本末尾的字符DT_PATH_ELLIPSIS 使用省略號(hào)取代文本中間的字符DT_EXPANDTABS 使用制表位,默認(rèn)的制表長(zhǎng)度為8個(gè)字符DT_LEFT 左對(duì)齊DT_MODIFYSTRING 將文本調(diào)整為能顯示的字符串DT_NOCLIP 不裁剪DT_NOPREFIX 不支持“&”字符轉(zhuǎn)義DT_RIGHT 右對(duì)齊DT_SINGLELINE 指定文本的基準(zhǔn)線(xiàn)為參考點(diǎn)DT_TABSTOP 設(shè)置停止位。nFormat的高位字節(jié)是每個(gè)制表位的數(shù)目DT_TOP 上對(duì)齊DT_VCENTER 垂直居中DT_WORDBREAK 自動(dòng)換行
57、DT_NOCLIP及 DT_NOPREFIX等不能與 DT_TABSTOP組合。默認(rèn)時(shí),上述文本輸出函數(shù)既不使用也不更新“當(dāng)前位置”。若要使用和更新“當(dāng)前位置”,必須調(diào)用SetTextAlign,并將參數(shù)nFlags設(shè)置為T(mén)A_UPDATECP。使用時(shí),最好在文本輸出前用MoveTo將當(dāng)前位置移動(dòng)至指定位置后,再調(diào)用文本輸出函數(shù);這樣,文本輸出函數(shù)參數(shù)中x,y或指定的矩形的左邊才會(huì)被忽略。8.4字體與文字處理字體與文字處理(1)(1)用MFC AppWizard創(chuàng)建一個(gè)默認(rèn)的單文檔應(yīng)用程序Ex_DrawText。(2)(2)在CEx_DrawTextView:OnDraw中添加下列代碼:voi
58、d CEx_DrawTextView:OnDraw(CDC*pDC)CEx_DrawTextDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);CRect rc(10,10,200,140);pDC-Rectangle(rc);pDC-DrawText(單 行 文 本 居 中,rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE);rc.OffsetRect(200,0);/將矩形向右偏移200pDC-Rectangle(rc);int nTab=40;/將一個(gè)Tab位的值指定為10個(gè)邏輯單位pDC-TabbedTextOut(rc.lef
59、t,rc.top,繪制tTabt文本t示例,1,&nTab,rc.left);/使用自定義的停止位(Tab)nTab=80;pDC-TabbedTextOut(rc.left,rc.top+20,繪制tTabt文本t示例,1,&nTab,rc.left);/使用自定義的停止位(Tab)pDC-TabbedTextOut(rc.left,rc.top+40,繪制tTabt文本t示例,0,NULL,0);/使用默認(rèn)的停止位 8.4字體與文字處理字體與文字處理(3)(3)編譯運(yùn)行,如圖。8.4字體與文字處理字體與文字處理 8.4.3文本格式化屬性文本格式化屬性 通常包括文本顏色、對(duì)齊方式、字符間隔以
60、及文本調(diào)整等。在CDC類(lèi)中,SetTextColor、SetBkColor和SetBkMode函數(shù)分別設(shè)置文本顏色、文本背景色和背景模式,GetTextColor、GetBkcolor和GetBkMode函數(shù)分別獲取這三項(xiàng)屬性的。原型:virtual COLORREF virtual COLORREF SetTextColorSetTextColor(COLORREF(COLORREF crColor););COLORREF COLORREF GetTextColorGetTextColor()const;()const;virtual COLORREF virtual COLORREF Se
61、tBkColorSetBkColor(COLORREF(COLORREF crColor););COLORREF COLORREF GetBkColorGetBkColor()const;()const;intint SetBkModeSetBkMode(intint nBkMode););intint GetBkModeGetBkMode()const;()const;文本對(duì)齊方式的設(shè)置和獲取是由CDC函數(shù)SetTextAlign和GetTextAlign決定的。原型:UINT UINT SetTextAlignSetTextAlign(UINT(UINT nFlags););UINT Ge
62、tTextAlign()const;8.4字體與文字處理字體與文字處理 8.4.4計(jì)算字符的幾何尺寸計(jì)算字符的幾何尺寸 打印和顯示某段文本時(shí),要了解字符的高度計(jì)算及字符的測(cè)量方式。在CDC類(lèi)中,GetTextMetrics是獲得指定映射模式下相關(guān)設(shè)備環(huán)境的字符幾何尺寸及其它屬性的,其TEXTMETRIC結(jié)構(gòu)描述如下:typedef struct tagTEXTMETRIC /tm int tmHeight;/字符的高度(ascent+descent)int tmAscent;/高于基準(zhǔn)線(xiàn)部分的值 int tmDescent;/低于基準(zhǔn)線(xiàn)部分的值 int tmInternalLeading;/字
63、符內(nèi)標(biāo)高 int tmExternalLeading;/字符外標(biāo)高 int tmAveCharWidth;/字體中字符平均寬度 int tmMaxCharWidth;/字符的最大寬度/TEXTMETRIC;在CDC類(lèi)中計(jì)算字符串的寬度和高度的函數(shù)主要兩個(gè):GetTextExtent函數(shù)(用于字符串沒(méi)有制表符時(shí))和GetTabbedTextExtent函數(shù)(用于含有制表符的字符串)。原型:CSizeCSize GetTextExtentGetTextExtent(LPCTSTR(LPCTSTR lpszString,intint nCount)const;)const;CSizeCSize Ge
64、tTextExtentGetTextExtent(const(const CStringCString&str)const;)const;CSizeCSize GetTabbedTextExtentGetTabbedTextExtent(LPCTSTR(LPCTSTR lpszString,intint nCount,intint nTabPositions,LPINT,LPINT lpnTabStopPositions)const;)const;CSizeCSize GetTabbedTextExtentGetTabbedTextExtent(const(const CStringCStri
65、ng&str,int nTabPositions,LPINT lpnTabStopPositions)const;8.4字體與文字處理字體與文字處理 8.4.5文檔內(nèi)容顯示及其字體改變文檔內(nèi)容顯示及其字體改變 (1)(1)用MFC AppWziard創(chuàng)建一個(gè)單文檔應(yīng)用程序Ex_Text,在創(chuàng)建的第6步將視圖的基類(lèi)選擇為CScrollView。(2)(2)為CEx_TextDoc類(lèi)添加CStringArray類(lèi)型的成員變量m_strContents,將讀取的文檔內(nèi)容保存。(3)(3)在CEx_TextDoc:Serialize函數(shù)中添加讀取文檔內(nèi)容的代碼:void CEx_TextDoc:Ser
66、ialize(CArchive&ar)if(ar.IsStoring()elseCString str;m_strContents.RemoveAll();while(ar.ReadString(str)m_strContents.Add(str);(4)(4)為CEx_TextView類(lèi)添加LOGFONT類(lèi)型的成員變量m_lfText,用來(lái)保存當(dāng)前所使用的邏輯字體。8.4字體與文字處理字體與文字處理 (5)(5)在CEx_TextView類(lèi)構(gòu)造函數(shù)中添加m_lfText的初始化代碼:CEx_TextView:CEx_TextView()memset(&m_lfText,0,sizeof(LOGFONT);m_lfText.lfHeight=-12;m_lfText.lfCharSet=GB2312_CHARSET;strcpy(m_lfText.lfFaceName,宋體);(6)(6)用MFC ClassWizard為CEx_TextView類(lèi)添加WM_LBUTTONDBLCLK(雙擊鼠標(biāo))的消息映射函數(shù),并增加下列代碼:void CEx_TextView:OnLButtonDbl
- 溫馨提示:
1: 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 六級(jí)上冊(cè)科學(xué)ppt課件-誰(shuí)選擇了它們-教科版
- 護(hù)理核心制度培訓(xùn)一_圖文課件
- 部編《池子與河流》課件
- SWOT分析法(非常全面)課件
- 主題班會(huì)我的成長(zhǎng)目標(biāo)課件
- 城市交通擁堵及治理總結(jié)課件
- 輸血相關(guān)性急性肺損傷課件
- 議論文的謀篇布局與論點(diǎn)的提出ppt課件
- 六級(jí)上冊(cè)科學(xué)ppt課件-地球的近鄰——月球-冀人版
- 疾病預(yù)防、冬季保暖-課件
- 中考英語(yǔ)語(yǔ)法復(fù)習(xí)之狀語(yǔ)從句ppt課件集4
- 《百分?jǐn)?shù)的意義和讀寫(xiě)》參考ppt課件
- 主題班會(huì)堅(jiān)持就是勝利課件
- 第二章--用人單位對(duì)大學(xué)生的要求概況ppt課件
- 教科版六年級(jí)科學(xué)上冊(cè)第三單元檢測(cè)卷(含答案)課件