《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),通常用在對繪圖有較高要求的場合。修飾畫筆通常用在簡單的直線和曲線等場合。一個修飾畫筆通常具有寬度、風格和顏色三種屬性。畫筆的寬度用來確定所畫的線條寬度,它是用設(shè)備單位表示的。默認的畫筆寬度是一個像素單位。畫筆的顏色確定了所畫的線條顏色。畫筆的風格確定了所繪圖形的線型,它通常有實線、虛線、點線、點劃線、雙點劃線、不可見線和內(nèi)框線等七種風格。如表。8.2圖形設(shè)備接口圖形設(shè)備接口創(chuàng)建一個修飾畫筆,可以使用CPen
18、類的CreatePen函數(shù),其原型如下:BOOL BOOL CreatePenCreatePen(intint nPenStyle,intint nWidth,COLORREF,COLORREF crColor););參數(shù)nPenStyle、nWidth、crColor指定畫筆的風格、寬度和顏色。此外,還有一個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;/畫筆風格 POINT lopnWidth;/POINT結(jié)構(gòu)的y不起作用,而用x表示畫筆寬度 COLORREF lopnColor;/畫筆顏色 LOGPEN;注意:l修 飾 畫 筆 的 寬 度 大 于 1個 像 素 時,畫 筆 的 風 格 只 能 取 PS_NULL、PS_SOLID或 PS_INSIDEFRAME,定義為其他風格不會起作用。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;/風格 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)單擊導入,將文件類型選擇為“所有文件(*.*)”,從外部文件中選定一個位圖文件,單擊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)建 字體的屬性主要屬性有字樣、風格和尺寸三個。字樣是字符書寫和顯示時表現(xiàn)出的特定模式。字體風格主要表現(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)容負責。
6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 市教育局冬季運動會安全工作預(yù)案
- 2024年秋季《思想道德與法治》大作業(yè)及答案3套試卷
- 2024年教師年度考核表個人工作總結(jié)(可編輯)
- 2024年xx村兩委涉案資金退還保證書
- 2024年憲法宣傳周活動總結(jié)+在機關(guān)“弘揚憲法精神推動發(fā)改工作高質(zhì)量發(fā)展”專題宣講報告會上的講話
- 2024年XX村合作社年報總結(jié)
- 2024-2025年秋季第一學期初中歷史上冊教研組工作總結(jié)
- 2024年小學高級教師年終工作總結(jié)匯報
- 2024-2025年秋季第一學期初中物理上冊教研組工作總結(jié)
- 2024年xx鎮(zhèn)交通年度總結(jié)
- 2024-2025年秋季第一學期小學語文教師工作總結(jié)
- 2024年XX村陳規(guī)陋習整治報告
- 2025年學校元旦迎新盛典活動策劃方案
- 2024年學校周邊安全隱患自查報告
- 2024年XX鎮(zhèn)農(nóng)村規(guī)劃管控述職報告