《Visual C++ 第二版》第8章圖形和文本
《《Visual C++ 第二版》第8章圖形和文本》由會員分享,可在線閱讀,更多相關(guān)《《Visual C++ 第二版》第8章圖形和文本(43頁珍藏版)》請在裝配圖網(wǎng)上搜索。
1、第第8章章圖形和文本圖形和文本 8.18.1設(shè)備環(huán)境和簡單數(shù)據(jù)類設(shè)備環(huán)境和簡單數(shù)據(jù)類 8.28.2圖形設(shè)備接口圖形設(shè)備接口 8.38.3圖形繪制圖形繪制 8.48.4字體與文字處理字體與文字處理 8.1設(shè)備環(huán)境和簡單數(shù)據(jù)類設(shè)備環(huán)境和簡單數(shù)據(jù)類 8.1.18.1.1設(shè)備環(huán)境和簡單數(shù)據(jù)類設(shè)備環(huán)境和簡單數(shù)據(jù)類 設(shè)備環(huán)境類CDC提供了繪制和打印的全部函數(shù)。為了能讓用戶使用一些特殊的設(shè)備環(huán)境,CDC還派生了CPaintDC、CClientDC、CWindowDC和CMetaFileDC類。(1)(1)CPaintDC比較特殊,它的構(gòu)造函數(shù)和析構(gòu)函數(shù)都是針對OnPaint進行的,但用戶一旦獲得相關(guān)的CDC
2、指針,就可以將它當成任何設(shè)備環(huán)境(包括屏幕、打印機)指針來使用。CPaintDC類的構(gòu)造函數(shù)會自動調(diào)用BeginPaint,而它的析構(gòu)函數(shù)則會自動調(diào)用EndPaint。(2)(2)CClientDC只能在窗口的客戶區(qū)(不包括邊框、標題欄、菜單欄以及狀態(tài)欄)中進行繪圖,點(0,0)通常指的是客戶區(qū)的左上角。而CWindowDC允許在窗口的任意位置中進行繪圖,點(0,0)指整個窗口的左上角。CWindowDC和CClientDC構(gòu)造函數(shù)分別調(diào)用GetWindowDC和GetDC,但它們的析構(gòu)函數(shù)都是調(diào)用ReleaseDC函數(shù)。(3)(3)CMetaFileDC封裝了在一個Windows圖元文件中繪
3、圖的方法。圖元文件是一系列與設(shè)備無關(guān)的圖片的集合,由于它對圖象的保存比像素更精確,因而往往在要求較高的場合下使用,例如AutoCAD的圖像保存等。目前的Windows已使用增強格式(enhanced-format)的32位圖元文件來進行操作。8.1設(shè)備環(huán)境和簡單數(shù)據(jù)類設(shè)備環(huán)境和簡單數(shù)據(jù)類 8.1.2坐標映射坐標映射 為了能保證打印的結(jié)果不受設(shè)備的影響,定義了一些映射模式,這些映射模式?jīng)Q定了設(shè)備坐標和邏輯坐標之間的關(guān)系,如表。這樣,我們就可以通過調(diào)用CDC:SetMapMode(int nMapMode)來設(shè)置相應(yīng)的映射模式。在MM_ISOTROPIC映射模式下,縱橫比總是1:1;但在MM_AN
4、ISOTROPIC映射模式下,x和y的比例因子可以獨立地變化,即圓可以被拉扁成橢圓形狀。在映射模式MM_ANISOTROPIC和MM_ISOTROPIC中,調(diào)用CDC:SetWindowExt(設(shè)置窗口大小)和CDC:SetViewportExt(設(shè)置視口大小)函數(shù)來設(shè)置所需要的比例因子。所謂“窗口”,可以理解成是一種邏輯坐標下的窗口,“視口”是實際看到的那個窗口。根據(jù)“窗口”和“視口”的大小就可以確定x和y的比例因子,它們的關(guān)系如下:x比例因子=視口x大小/窗口x大小y比例因子=視口y大小/窗口y大小 8.1設(shè)備環(huán)境和簡單數(shù)據(jù)類設(shè)備環(huán)境和簡單數(shù)據(jù)類(1)(1)創(chuàng)建一個默認的單文檔應(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);/獲得當前窗口的客戶區(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)編譯運行,如圖。8.1設(shè)備環(huán)境和簡單數(shù)據(jù)類設(shè)備環(huán)境和簡單數(shù)據(jù)類 8.1.3CPoint、CSize和和CRect CPoint、CSize和和CRect類的構(gòu)造函數(shù)類的構(gòu)造函數(shù) CPoint類帶參數(shù)的常用構(gòu)造函數(shù)原型如下:CPointCPoint(intint initX,intint initY););CPointCPoint(P
7、OINT(POINT initPt););CSize類帶參數(shù)的常用構(gòu)造函數(shù)原型如下:CSizeCSize(intint initCX,intint initCY););CSizeCSize(SIZE(SIZE initSize););CRect類帶參數(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用一個RECT結(jié)構(gòu)或指針來初始化CRect的成員。point指定矩形的左上角位置。size指定矩形的長度和寬度。topLeft和bottomRight指定CRect的左上角和右下角的位置。8.1設(shè)備環(huán)境和簡單數(shù)據(jù)類設(shè)備環(huán)境和簡單數(shù)據(jù)類 CRect類的常用操作類的常用操作 傳遞LPRECT、LPCRECT或RECT結(jié)
9、構(gòu)作為參數(shù)的任何地方,都可以用CRect對象來代替。構(gòu)造一個CRect時,要使它符合規(guī)范。即使其left小于right,top小于bottom。一個不 符 合 規(guī) 范 的 矩 形,CRect的 許 多 成 員 函 數(shù) 都 不 會 有 正 確 的 結(jié) 果。常 常 用CRect:NormalizeRect函數(shù)使一個不符合規(guī)范的矩形合乎規(guī)范。成員函數(shù)InflateRect和DeflateRect用來擴大和縮小一個矩形。由于它們的操作是相互的,也就是說,若指定InflateRect函數(shù)的參數(shù)為負值,那么操作的結(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指定擴大CRect左、右邊的數(shù)值。y指定擴大CRect上、下邊的數(shù)值。size中的cx成員指定擴大左、右邊的數(shù)值,cy指定擴大上、下邊的數(shù)值。lpRect的
11、各個成員指定擴大每一邊的數(shù)值。l、t、r和b指定擴大CRect左、上、右和下邊的數(shù)值。對于前兩個重載函數(shù)來說,CRect的總寬度被增加了兩倍的x或cx,總高度被增加了兩倍的y或cy。成員函數(shù)IntersectRect和UnionRect用來將兩個矩形進行相交和合并。原型如下:BOOL BOOL IntersectRectIntersectRect(LPCRECT(LPCRECT lpRect1,LPCRECT,LPCRECT lpRect2););BOOL BOOL UnionRectUnionRect(LPCRECT(LPCRECT lpRect1,LPCRECT,LPCRECT lpRe
12、8.1設(shè)備環(huán)境和簡單數(shù)據(jù)類設(shè)備環(huán)境和簡單數(shù)據(jù)類8.1設(shè)備環(huán)境和簡單數(shù)據(jù)類設(shè)備環(huán)境和簡單數(shù)據(jù)類 8.1.4顏色和顏色對話框顏色和顏色對話框 一個彩色象素常用的顏色空間有RGB和YUV兩種。CDC使用的是RGB顏色空間。COLORREF是用來表示RGB顏色的一個32位的數(shù)據(jù)類型,它可以用十六進制表示一個RGB值:0 x00bbggrr rr、gg、bb表示紅、綠、藍三個顏色分量的16進制值。使用下列的宏操作:GetBValue 獲得32位RGB顏色值中的藍色分量GetGValue 獲得32位RGB顏色值中的綠色分量GetRValue 獲得32位RGB顏色值中的紅色分量RGB 將指定的R、G、B分量
13、值轉(zhuǎn)換成一個32位的RGB顏色值。MFC的CColorDialog類為應(yīng)用程序提供了顏色選擇通用對話框。構(gòu)造函數(shù):CColorDialog(COLORREF clrInit=0,DWORD dwFlags=0,CWnd*pParentWnd=NULL);dwFlags表示定制對話框外觀和功能的系列標志參數(shù)??梢允窍铝兄换颉眧”組合:CC_ANYCOLOR 在基本顏色單元中列出所有可得到的顏色CC_FULLOPEN 顯示所有的顏色對話框界面CC_PREVENTFULLOPEN 禁用“規(guī)定自定義顏色”按鈕CC_SHOWHELP 在對話框中顯示“幫助”按鈕CC_SOLIDCOLOR 在基本顏色單元
14、中只列出所得到的純色 單擊對話框“確定”退出(即DoModal返回 IDOK)時,可調(diào)用下列成員獲得相應(yīng)的顏色。COLORREF COLORREF GetColorGetColor()const;()const;/返回用戶選擇的顏色。void void SetCurrentColorSetCurrentColor(COLORREF(COLORREF clr);/);/強制使用clr作為當前選擇的顏色static COLORREF*GetSavedCustomColors();/返回用戶自己定義顏色 8.2圖形設(shè)備接口圖形設(shè)備接口 Windows為設(shè)備環(huán)境提供了各種各樣的繪圖工具,例如用于畫線的
15、“畫筆”、填充區(qū)域的“畫刷”以及用于繪制文本的“字體”。MFC封裝了這些工具,并提供相應(yīng)的類來作為應(yīng)用程序的圖形設(shè)備接口GDI,這些類有一個共同的抽象基類CGdiObject,如表。8.2圖形設(shè)備接口圖形設(shè)備接口 8.2.1GDI對象一般使用方法對象一般使用方法 選擇GDI對象進行繪圖時,往往遵循著下列的步驟:(1)(1)在堆棧中定義一個GDI對象,用相應(yīng)的函數(shù)創(chuàng)建此GDI對象。要注意:有些GDI派生類的構(gòu)造函數(shù)允許用戶提供足夠的信息,從而一步即可完成對象的創(chuàng)建任務(wù)。(2)(2)將構(gòu)造的GDI對象選入當前設(shè)備環(huán)境中,但不要忘記將原來的GDI對象保存起來。(3)(3)繪圖結(jié)束后,恢復(fù)當前設(shè)備環(huán)境
16、中原來的GDI對象。(4)(4)GDI對象是在堆棧中創(chuàng)建中,程序結(jié)束后,框架會自動刪除程序創(chuàng)建的GDI對象。具體操作可像下面的代碼過程:void CMyView:OnDraw(CDC*pDC)CPen penBlack;/定義一個畫筆變量penBlack.CreatePen(PS_SOLID,2,RGB(0,0,0);/創(chuàng)建畫筆/將此畫筆選入當前設(shè)備環(huán)境并保存原來的畫筆CPen*pOldPen=pDC-SelectObject(&penBlack);/用此畫筆繪圖pDC-MoveTo(.);pDC-LineTo(.);pDC-SelectObject(pOldPen);/恢復(fù)設(shè)備環(huán)境中原來的畫
17、筆8.2圖形設(shè)備接口圖形設(shè)備接口 8.2.2畫筆畫筆 畫筆是繪制各種直線和曲線的一種圖形工具,可分為修飾畫筆和幾何畫筆兩種類型。幾何畫筆不但有修飾畫筆的屬性,還跟畫刷的樣式、陰影線類型有關(guān),通常用在對繪圖有較高要求的場合。修飾畫筆通常用在簡單的直線和曲線等場合。一個修飾畫筆通常具有寬度、風(fēng)格和顏色三種屬性。畫筆的寬度用來確定所畫的線條寬度,它是用設(shè)備單位表示的。默認的畫筆寬度是一個像素單位。畫筆的顏色確定了所畫的線條顏色。畫筆的風(fēng)格確定了所繪圖形的線型,它通常有實線、虛線、點線、點劃線、雙點劃線、不可見線和內(nèi)框線等七種風(fēng)格。如表。8.2圖形設(shè)備接口圖形設(shè)備接口創(chuàng)建一個修飾畫筆,可以使用CPen
18、類的CreatePen函數(shù),其原型如下:BOOL BOOL CreatePenCreatePen(intint nPenStyle,intint nWidth,COLORREF,COLORREF crColor););參數(shù)nPenStyle、nWidth、crColor指定畫筆的風(fēng)格、寬度和顏色。此外,還有一個CreatePenIndirect函數(shù)也是用來創(chuàng)建畫筆對象,它的作用與CreatePen函數(shù)是完全一樣的,只是畫筆的三個屬性不是直接出現(xiàn)在函數(shù)參數(shù)中,而是通過一個LOGPEN結(jié)構(gòu)間接地給出。BOOL BOOL CreatePenIndirectCreatePenIndirect(LPLO
19、GPEN(LPLOGPEN lpLogPen););此函數(shù)用由LOGPEN結(jié)構(gòu)指針指定的相關(guān)參數(shù)創(chuàng)建畫筆,LOGPEN結(jié)構(gòu)如下:typedef struct tagLOGPEN /*lgpn*/UINT lopnStyle;/畫筆風(fēng)格 POINT lopnWidth;/POINT結(jié)構(gòu)的y不起作用,而用x表示畫筆寬度 COLORREF lopnColor;/畫筆顏色 LOGPEN;注意:l修 飾 畫 筆 的 寬 度 大 于 1個 像 素 時,畫 筆 的 風(fēng) 格 只 能 取 PS_NULL、PS_SOLID或 PS_INSIDEFRAME,定義為其他風(fēng)格不會起作用。l畫筆的創(chuàng)建工作也可在畫筆的構(gòu)造
20、函數(shù)中進行,它具有下列原型:CPen(int nPenStyle,int nWidth,COLORREF crColor);8.2圖形設(shè)備接口圖形設(shè)備接口 8.2.3畫刷畫刷 畫刷用于指定填充的特性,許多窗口、控件以及其他區(qū)域都需要用畫刷進行填充繪制,它比畫筆的內(nèi)容更加豐富。畫刷的屬性通常包括填充色、填充圖案和填充樣式三種。畫刷的填充色是使用COLORREF顏色類型,畫刷的填充圖案通常是用戶定義的8 x 8位圖,填充樣式往往是CDC內(nèi)部定義的一些特性,是以HS_為前綴的標識,如圖:8.2圖形設(shè)備接口圖形設(shè)備接口 CBrush類根據(jù)畫刷屬性提供了相應(yīng)的創(chuàng)建函數(shù),原型如下:BOOL BOOL Cr
21、eateSolidBrushCreateSolidBrush(COLORREF(COLORREF crColor););/創(chuàng)建填充色畫刷BOOL BOOL CreateHatchBrushCreateHatchBrush(intint nIndex,COLORREF COLORREF crColor );/);/創(chuàng)建填充樣式畫刷 與畫筆相類似,也有一個LOGBRUSH 邏輯結(jié)構(gòu)用于畫刷屬性的定義,并通過 CBrush的成員函數(shù)CreateBrushIndirect來創(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畫刷的創(chuàng)建工作也可在其構(gòu)造函數(shù)中進行,它具有下列原型:CBrushCBrush(COLORREF(COLORREF crColor););CBrushCBrush(intint nIndex,COLORREF,COLORREF crColor););CBrushCBrush(CBitm
23、apCBitmap*pBitmap););l畫刷也可用位圖來指定其填充圖案,但該位圖應(yīng)該是88像素,若位圖太大,Windows則只使用其左上角的8 8的像素。l 畫刷僅對繪圖函數(shù)Chord、Ellipse、FillRect、FrameRect、InvertRect、Pie、Polygon、PolyPolygon、Rectangle、RoundRect有效。8.2圖形設(shè)備接口圖形設(shè)備接口8.2.4位圖位圖 CBitmap類類 LoadBitmap是位圖的初始化函數(shù),其函數(shù)原型如下:BOOL BOOL LoadBitmapLoadBitmap(LPCTSTR(LPCTSTR lpszResourc
24、eName););BOOL BOOL LoadBitmapLoadBitmap(UINT(UINT nIDResource););函數(shù)從應(yīng)用程序中調(diào)入一個位圖資源。若用戶直接創(chuàng)建一個位圖對象,可使用CBitmap類中的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)建一個位圖對象。參數(shù)nPlanes表示位圖的顏色位面的數(shù)目,nBitcount表示每個像素的顏色位個數(shù),lpBits表示包含位值的短整型數(shù)組;若此數(shù)組為NULL,則位圖對象還未初始化。BOOL BOOL CreateBitmapIndirectCreateBitmapIndirect(LPBITMAP(LPBITMAP lpBitmap););該函數(shù)直接用BITMAP結(jié)構(gòu)來創(chuàng)建一個位圖對象。BOOL BOOL CreateCompatibleBitmapCreateCompatibleBitmap(CDC*(CDC*pDC,intint nWi
26、dth,intint nHeight););該函數(shù)為某設(shè)備環(huán)境創(chuàng)建一個指定的寬度和高度的位圖對象。8.2圖形設(shè)備接口圖形設(shè)備接口 GDI位圖的顯示位圖的顯示 對于GDI位圖的顯示則必須遵循下列步驟:(1)(1)CreateBitmap、CreateCompatibleBitmap及 CreateBitmapIndirect函數(shù)創(chuàng)建一個適當?shù)奈粓D對象。(2)(2)調(diào)用CDC:CreateCompatibleDC函數(shù)創(chuàng)建一個內(nèi)存設(shè)備環(huán)境,以便位圖在內(nèi)存中保存下來,并與指定設(shè)備(窗口設(shè)備)環(huán)境相兼容;(3)(3)調(diào)用CDC:SelectObject函數(shù)將位圖對象選入內(nèi)存設(shè)備環(huán)境中;(4)(4)調(diào)用C
27、DC:BitBlt或CDC:StretchBlt函數(shù)將位圖復(fù)制到實際設(shè)備環(huán)境中。(5)(5)使用之后,恢復(fù)原來的內(nèi)存設(shè)備環(huán)境。8.2圖形設(shè)備接口圖形設(shè)備接口 (1)(1)創(chuàng)建一個默認的單文檔應(yīng)用程序Ex_BMP。(2)(2)按快捷鍵Ctrl+R,彈出“插入資源”對話框,選擇Bitmap資源類型。(3)(3)單擊導(dǎo)入,將文件類型選擇為“所有文件(*.*)”,從外部文件中選定一個位圖文件,單擊Import。保留默認的位圖資源標識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;/定義一個BITMAP結(jié)構(gòu)變量,以便獲取位圖參數(shù)m_bmp.GetObject(sizeof(BITMAP),&bm);CDC dcMem;/定義并創(chuàng)建一個內(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è)備環(huán)境中dcMem.SelectObject(pOldbmp);/恢復(fù)原來的內(nèi)存設(shè)備環(huán)境 8.2圖形設(shè)備接口圖形設(shè)備接口 (5)(5)編譯運行,如圖。通過上述代碼過程可以看出:位圖的最終顯示是通過調(diào)用CDC:BitBlt函數(shù)來完成的。除此之外,也可以使用CDC:StretchBlt函數(shù)。這兩個函數(shù)的區(qū)別在于:StretchBlt函數(shù)可以對位圖進行縮小或放大,而BitBlt則不能,但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畫點、線畫點、線 點點 畫點是通過調(diào)用CDC:SetPixel或CDC:SetPixelV函數(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、是用來獲取指定點的顏色。COLORREF COLORREF GetPixelGetPixel(intint x,intint y)const;)const;COLORREF COLORREF GetPixelGetPixel(POINT(POINT point)const;)const;畫線畫線CDC的LineTo和MoveTo函數(shù)就是用來實現(xiàn)畫線功能的兩個函數(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圖形繪制圖形繪制 折線折線 除了LineTo函數(shù)可用來畫線之外,CDC中還提供了一系列用于畫各種折線的函數(shù)。它們主要是Polyline、PolyPolyline和PolylineTo。這三個函數(shù)中,Polyline和PolyPolyline既不使用當前位置,也不更新當前位置;而PolylineTo總是把當前位置作為起始點,并且在折線畫完之后,還把折線終點所在位置設(shè)為新的當前位置。BOOL BOOL PolylinePolyline(LPPOINT(LPPOIN
34、T lpPoints,intint nCount););BOOL BOOL PolylineToPolylineTo(const POINT*(const POINT*lpPoints,intint nCount););這兩個函數(shù)用來畫一系列連續(xù)的折線。參數(shù)lpPoints是POINT或CPoint的頂點數(shù)組;nCount表示數(shù)組中頂點的個數(shù),它至少為2。BOOL BOOL PolyPolylinePolyPolyline(const const POINT*POINT*lpPoints,const const DWORD*DWORD*lpPolyPoints,intint nCount);)
35、;此函數(shù)可用來繪制多條折線。其中l(wèi)pPoints同前定義,lpPolyPoints表示各條折線所需的頂點數(shù),nCount表示折線的數(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是按順時針或逆時針進行尋找;對于像五角星這樣的圖形,填充的結(jié)果大不一樣,如圖。8.3圖形繪制圖形繪制 多邊形多邊形 多邊形可以說就是
37、由首尾相接的封閉折線所圍成的圖形。畫多邊形的函數(shù)Polygon原型如下:BOOL Polygon(LPPOINTBOOL Polygon(LPPOINT lpPoints,intint nCount););Polygon函數(shù)的參數(shù)形式與Polyline函數(shù)是相同的。但也稍有一點小差異。例如,要畫一個三角形,使用Polyline函數(shù),頂點數(shù)組中就得給出四個頂點(盡管始點和終點重復(fù)出現(xiàn)),而用Polygon函數(shù)則只需給出三個頂點。與PolyPolyline可畫多條折線一樣,使用PolyPolygon函數(shù),一次可畫出多個多邊形,這兩個函數(shù)的參數(shù)形式和含義也一樣。BOOL PolyPolygon(LP
38、POINT lpPoints,LPINT lpPolyCounts,int nCount);8.3圖形繪制圖形繪制 8.3.3曲線曲線 圓弧和橢圓圓弧和橢圓 調(diào)用CDC的Arc函數(shù)可以畫一條橢圓弧線或者整個橢圓。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););通過調(diào)用SetArcDirection函數(shù)將繪制方向改設(shè)為順時針方向。intint SetArcDirectionSetArcDirection(intint nArcDirectionnArcDirection););ArcTo與Arc函數(shù)的唯一的區(qū)別是:ArcTo將圓弧的終點作為新的當前位置,而Arc不會。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可以用當前畫刷繪制一個橢圓區(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是用來繪制弦形(圖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曲線曲線 函數(shù)PolyBezier是用來畫出一條或多條Bzier曲線的,其函數(shù)原型如下:BOOL PolyBezier(const POINT*lpPoints,int nCount);如果需要使用當前位置,那么就應(yīng)該使用PolyBezierTo函數(shù)。BOOL PolyBezierTo(const POINT*lpPoints,int nCount);8.3圖形繪制圖形繪制8.3.4圖形繪制示例圖形繪制示例 例例Ex_SDI Ex_SDI 繪制線圖。(1)(1)創(chuàng)建一個默認的單文檔應(yīng)用程序Ex_SDI。(2)
43、(2)在CEx_GDIView:OnDraw函數(shù)中添加下列代碼:(3)(3)編譯運行,如圖。編譯運行,如圖。需要說明的是:l大多數(shù)的繪圖函數(shù)一般都是添加在用戶視圖中的OnDraw函數(shù)內(nèi),這時因為OnDraw是CView類的一個虛成員函數(shù),每當視窗需要被重新繪制時,系統(tǒng)都要調(diào)用OnDraw函數(shù)。當用戶改變了窗口尺寸,或當窗口恢復(fù)了先前被覆蓋的部分,或當應(yīng)用程序改變了窗口數(shù)據(jù)時,窗口都需要被重新繪制。通過重載此函數(shù),用戶程序隨OnDraw一起調(diào)用,確保圖形在窗口的顯示。與OnDraw類似的還有OnPaint函數(shù)。l 若對同一個GDI對象重新構(gòu)造,則必須調(diào)用Detach函數(shù)把該對象從GDI中分離出來
44、。8.3圖形繪制圖形繪制8.3圖形繪制圖形繪制 8.3.5在對話框控件中繪制圖形在對話框控件中繪制圖形 (1)(1)創(chuàng)建一個基于對話框應(yīng)用程序項目Ex_CtrlDraw。(2)(2)將對話框標題設(shè)為“在控件中繪圖”,刪除取消,將確定標題改為“退出”,打開對話框網(wǎng)格,添加靜態(tài)文本和組合框控件。左邊靜態(tài)文本控件用來繪制圖 形,將 其“Extended Styles”中 的“Static edge”屬 性 選 中,標 識 符 設(shè) 為IDC_DRAW。(3)(3)打開Member Variables頁面,為組合框添加成員變量m_hatchCombo,其類型為Control類的CComboBox。(4)
45、(4)為對話框類CEx_CtrlDrawDlg添加一個int類型的成員變量m_nHatch。(5)(5)為對話框類CEx_CtrlDrawDlg添加一個void類型的成員函數(shù)DrawCtrl,代碼:void CEx_CtrlDrawDlg:DrawCtrl()CWnd*pWnd=GetDlgItem(IDC_DRAW);/獲得IDC_DRAW控件窗口指針CDC*pDC=pWnd-GetDC();/獲得窗口當前的設(shè)備環(huán)境指針CBrush drawBrush;/定義畫刷變量drawBrush.CreateHatchBrush(m_nHatch,RGB(0,0,0);/創(chuàng)建一個畫刷。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=“水平線”,“豎直線”,“向下斜線”,“向上斜線”,“十字線,交叉線;int nIn
47、dex;for(int i=0;iUpdateWindow();DrawCtrl();(9)(9)編譯運行并測試。8.4字體與文字處理字體與文字處理 8.4.1字體和字體對話框字體和字體對話框 字體的屬性和創(chuàng)建字體的屬性和創(chuàng)建 字體的屬性主要屬性有字樣、風(fēng)格和尺寸三個。字樣是字符書寫和顯示時表現(xiàn)出的特定模式。字體風(fēng)格主要表現(xiàn)為字體的粗細和是否傾斜等特點。字體尺寸是指定字符所占區(qū)域的大小。字體尺寸可以取毫米或英寸作為單位。系統(tǒng)定義一種“邏輯字體”,它是應(yīng)用程序?qū)τ诶硐胱煮w的一種描述方式。使用邏輯字體繪制文字時,系統(tǒng)會采用一種特定的算法把邏輯字體映射為最匹配的物理字體。邏輯字體的具體屬性可由LOG
48、FONT結(jié)構(gòu)來描述,這里僅列最常用到的結(jié)構(gòu)成員。typedef struct tagLOGFONT /lf LONG lfHeight;/字體的邏輯高度 LONG lfWidth;/字符的平均邏輯寬度 LONG lfEscapement;/傾角 LONG lfOrientation;/書寫方向 LONG lfWeight;/字體的粗細程度 BYTE lfItalic;/斜體標志 BYTE lfUnderline;/下劃線標志 BYTE lfStrikeOut;/刪除線標志 BYTE lfCharSet;/字符集,漢字必須為GB2312_CHARSET TCHAR lfFaceNameLF_FA
49、CESIZE;/字樣名稱/LOGFONT;8.4字體與文字處理字體與文字處理 lfHeight表示字符的邏輯高度。這里的高度是字符的純高度,當此值 0時,系統(tǒng)將此值映射為實際字體單元格的高度;當=0時,系統(tǒng)將使用默認的值;當SelectObject(&cf);pDC-TextOut(100,100,Hello);pDC-SelectObject(oldfont);/恢復(fù)設(shè)備環(huán)境原來的屬性cf.DeleteObject();/刪除字體對象 8.4字體與文字處理字體與文字處理使用字體對話框使用字體對話框 CFontDialog類提供了字體及其文本顏色選擇的通用對話框,如圖。它的構(gòu)造函數(shù)如下:CFo
50、ntDialog(LPLOGFONT lplfInitial=NULL,DWORD dwFlags=CF_EFFECTS|CF_SCREENFONTS,CDC*pdcPrinter=NULL,CWnd*pParentWnd=NULL);當字體對話框DoModal返回IDOK后,可使用下列的成員函數(shù):void GetCurrentFont(LPLOGFONT lplf);/返回用戶選擇的LOGFONT字體CString GetFaceName()const;/返回用戶選擇的字體名稱CString GetStyleName()const;/返回用戶選擇的字體樣式名稱int GetSize()con
51、st;/返回用戶選擇的字體大小COLORREF GetColor()const;/返回用戶選擇的文本顏色int GetWeight()const;/返回用戶選擇的字體粗細程度BOOL IsStrikeOut()const;/判斷是否有刪除線BOOL IsUnderline()const;/判斷是否有下劃線BOOL IsBold()const;/判斷是否是粗體BOOL IsItalic()const;/判斷是否是斜體。8.4字體與文字處理字體與文字處理 8.4.2常用文本輸出函數(shù)常用文本輸出函數(shù) CDC類提供了四個輸出文本的成員函數(shù):TextOut、ExtTextOut、TabbedTextOu
52、t和DrawText。對于這四個函數(shù),應(yīng)根據(jù)具體情況來選用。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ù)是用當前字體在指定位置(x,y)處顯示一個文本。參數(shù)中l(wèi)pszString和str指定即將顯示的文本,nCount表示文本的字節(jié)長度。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也是用當前字體在指定位置處顯示一個文本,它還根據(jù)指定的制表位(Tab)設(shè)置相應(yīng)字符位置,函數(shù)成功時返回輸出文本的大小。nTabPositions表示lpnTabStopPositions數(shù)組的大小,lpnTabStopPositions表示多個遞增的制表位的數(shù)組,nTabOrigin表示制表位x方向的起始點(邏輯坐標)。如果nTabPositions為0,且lpnTabStopPositions為NULL,則使用默認的制表位,即一個Tab相當于8個字符。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ù)是當前字體在指定矩形中對文本進行格式化繪制。lpRect指定文本繪制時的參考矩形,本身不顯示;nFormat表示文本的格式,可以是常用值之一或“|”組合:DT_BOTTOM 下對齊文本,該值還必須與DT_SINGLELINE組合
56、DT_CENTER 水平居中DT_END_ELLIPSIS 使用省略號取代文本末尾的字符DT_PATH_ELLIPSIS 使用省略號取代文本中間的字符DT_EXPANDTABS 使用制表位,默認的制表長度為8個字符DT_LEFT 左對齊DT_MODIFYSTRING 將文本調(diào)整為能顯示的字符串DT_NOCLIP 不裁剪DT_NOPREFIX 不支持“&”字符轉(zhuǎn)義DT_RIGHT 右對齊DT_SINGLELINE 指定文本的基準線為參考點DT_TABSTOP 設(shè)置停止位。nFormat的高位字節(jié)是每個制表位的數(shù)目DT_TOP 上對齊DT_VCENTER 垂直居中DT_WORDBREAK 自動換行
57、DT_NOCLIP及 DT_NOPREFIX等不能與 DT_TABSTOP組合。默認時,上述文本輸出函數(shù)既不使用也不更新“當前位置”。若要使用和更新“當前位置”,必須調(diào)用SetTextAlign,并將參數(shù)nFlags設(shè)置為TA_UPDATECP。使用時,最好在文本輸出前用MoveTo將當前位置移動至指定位置后,再調(diào)用文本輸出函數(shù);這樣,文本輸出函數(shù)參數(shù)中x,y或指定的矩形的左邊才會被忽略。8.4字體與文字處理字體與文字處理(1)(1)用MFC AppWizard創(chuàng)建一個默認的單文檔應(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;/將一個Tab位的值指定為10個邏輯單位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);/使用默認的停止位 8.4字體與文字處理字體與文字處理(3)(3)編譯運行,如圖。8.4字體與文字處理字體與文字處理 8.4.3文本格式化屬性文本格式化屬性 通常包括文本顏色、對齊方式、字符間隔以
60、及文本調(diào)整等。在CDC類中,SetTextColor、SetBkColor和SetBkMode函數(shù)分別設(shè)置文本顏色、文本背景色和背景模式,GetTextColor、GetBkcolor和GetBkMode函數(shù)分別獲取這三項屬性的。原型: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;文本對齊方式的設(shè)置和獲取是由CDC函數(shù)SetTextAlign和GetTextAlign決定的。原型:UINT UINT SetTextAlignSetTextAlign(UINT(UINT nFlags););UINT Ge
62、tTextAlign()const;8.4字體與文字處理字體與文字處理 8.4.4計算字符的幾何尺寸計算字符的幾何尺寸 打印和顯示某段文本時,要了解字符的高度計算及字符的測量方式。在CDC類中,GetTextMetrics是獲得指定映射模式下相關(guān)設(shè)備環(huán)境的字符幾何尺寸及其它屬性的,其TEXTMETRIC結(jié)構(gòu)描述如下:typedef struct tagTEXTMETRIC /tm int tmHeight;/字符的高度(ascent+descent)int tmAscent;/高于基準線部分的值 int tmDescent;/低于基準線部分的值 int tmInternalLeading;/字
63、符內(nèi)標高 int tmExternalLeading;/字符外標高 int tmAveCharWidth;/字體中字符平均寬度 int tmMaxCharWidth;/字符的最大寬度/TEXTMETRIC;在CDC類中計算字符串的寬度和高度的函數(shù)主要兩個:GetTextExtent函數(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)建一個單文檔應(yīng)用程序Ex_Text,在創(chuàng)建的第6步將視圖的基類選擇為CScrollView。(2)(2)為CEx_TextDoc類添加CStringArray類型的成員變量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類添加LOGFONT類型的成員變量m_lfText,用來保存當前所使用的邏輯字體。8.4字體與文字處理字體與文字處理 (5)(5)在CEx_TextView類構(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類添加WM_LBUTTONDBLCLK(雙擊鼠標)的消息映射函數(shù),并增加下列代碼:void CEx_TextView:OnLButtonDbl
- 溫馨提示:
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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 市教育局冬季運動會安全工作預(yù)案
- 2024年秋季《思想道德與法治》大作業(yè)及答案3套試卷
- 2024年教師年度考核表個人工作總結(jié)(可編輯)
- 2024年xx村兩委涉案資金退還保證書
- 2024年憲法宣傳周活動總結(jié)+在機關(guān)“弘揚憲法精神推動發(fā)改工作高質(zhì)量發(fā)展”專題宣講報告會上的講話
- 2024年XX村合作社年報總結(jié)
- 2024-2025年秋季第一學(xué)期初中歷史上冊教研組工作總結(jié)
- 2024年小學(xué)高級教師年終工作總結(jié)匯報
- 2024-2025年秋季第一學(xué)期初中物理上冊教研組工作總結(jié)
- 2024年xx鎮(zhèn)交通年度總結(jié)
- 2024-2025年秋季第一學(xué)期小學(xué)語文教師工作總結(jié)
- 2024年XX村陳規(guī)陋習(xí)整治報告
- 2025年學(xué)校元旦迎新盛典活動策劃方案
- 2024年學(xué)校周邊安全隱患自查報告
- 2024年XX鎮(zhèn)農(nóng)村規(guī)劃管控述職報告