Visual C++教程(Visual Studio版)(第6版)(含視頻分析提高) 課件第8章 圖形和文本_第1頁(yè)
Visual C++教程(Visual Studio版)(第6版)(含視頻分析提高) 課件第8章 圖形和文本_第2頁(yè)
Visual C++教程(Visual Studio版)(第6版)(含視頻分析提高) 課件第8章 圖形和文本_第3頁(yè)
Visual C++教程(Visual Studio版)(第6版)(含視頻分析提高) 課件第8章 圖形和文本_第4頁(yè)
Visual C++教程(Visual Studio版)(第6版)(含視頻分析提高) 課件第8章 圖形和文本_第5頁(yè)
已閱讀5頁(yè),還剩65頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第8章

圖形和文本——概

述01設(shè)備環(huán)境類設(shè)備環(huán)境類為了能使用一些特殊的設(shè)備環(huán)境,CDC還派生了CPaintDC、CClientDC、CWindowDC和CMetaFileDC類。CPaintDC比較特殊,它的構(gòu)造函數(shù)和析構(gòu)函數(shù)都是針對(duì)OnPaint進(jìn)行的,但一旦獲得相關(guān)的CDC指針,就可以將它當(dāng)成任何設(shè)備環(huán)境(包括屏幕、打印機(jī))指針來(lái)使用。CPaintDC類的構(gòu)造函數(shù)會(huì)自動(dòng)調(diào)用BeginPaint,而它的析構(gòu)函數(shù)則會(huì)自動(dòng)調(diào)用EndPaint。(1)CClientDC只能在窗口的客戶區(qū)中進(jìn)行繪圖,原點(diǎn)(0,0)通常指的是客戶區(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ù)。(2)(3)CMetaFileDC封裝了在一個(gè)Windows圖元文件中繪圖的方法。圖元文件是一系列與設(shè)備無(wú)關(guān)的圖片的集合,由于它對(duì)圖像的保存比像素更精確,因而往往在要求較高的場(chǎng)合下使用,例如AutoCAD的圖形保存等。目前的Windows已使用增強(qiáng)格式(Enhanced-Format)的32位圖元文件來(lái)進(jìn)行操作。02坐標(biāo)映射pDC->Rectangle(CRect(0,0,200,200));坐標(biāo)映射在討論坐標(biāo)映射之前,先來(lái)看看下列語(yǔ)句:它是在某設(shè)備環(huán)境中繪制出一個(gè)高為200個(gè)像素,寬也為200個(gè)像素的方塊。由于默認(rèn)的映射模式是MM_TEXT,其邏輯坐標(biāo)(在映射模式下的坐標(biāo))和設(shè)備坐標(biāo)(顯示設(shè)備或打印設(shè)備坐標(biāo)系下的坐標(biāo))相等。因此這個(gè)方塊在1024×768的顯示器上看起來(lái)要比在640×480的顯示器上顯得小一些,而且若將它打印在600dpi精度的激光打印機(jī)上,這個(gè)方塊就會(huì)顯得更小了。為了保證打印的結(jié)果不受設(shè)備的影響,Windows定義了一些映射模式,這些映射模式?jīng)Q定了設(shè)備坐標(biāo)和邏輯坐標(biāo)之間的關(guān)系,如表8.1所示。映射模式含

義MM_TEXT每個(gè)邏輯單位等于一個(gè)設(shè)備像素,x向右為正,y向上為正MM_HIENGLISH每個(gè)邏輯單位為0.001英寸,x向右為正,y向上為正MM_LOENGLISH每個(gè)邏輯單位為0.01英寸,x向右為正,y向上為正MM_HIMETRIC每個(gè)邏輯單位為0.01毫米,x向右為正,y向上為正MM_LOMETRIC每個(gè)邏輯單位為0.1毫米,x向右為正,y向上為正

MM_TWIPS每個(gè)邏輯單位為一個(gè)點(diǎn)的1/20(一個(gè)點(diǎn)是1/72英寸),x向右為正,y向上為正MM_ANISOTROPICx,y可變比例MM_ISOTROPICx,y等比例坐標(biāo)映射需要說(shuō)明的是:(1)在MM_ISOTROPIC映射模式下,縱橫比總是1:1,換句話說(shuō),無(wú)論比例因子如何變化,圓看上去總是圓的;但在MM_ANISOTROPIC映射模式下,x和y的比例因子可以獨(dú)立地變化,即圓可以被拉扁成橢圓形狀。(2)在映射模式MM_ANISOTROPIC和MM_ISOTROPIC中,常常可以調(diào)用CDC類的成員函數(shù)SetWindowExt(設(shè)置窗口大小)和SetViewportExt(設(shè)置視口大小)來(lái)設(shè)置所需要的比例因子。這里的“窗口”和“視口”的概念往往不易理解。所謂“窗口”,可以理解成一種邏輯坐標(biāo)下的窗口,而“視口”是實(shí)際看到的那個(gè)窗口,也就是設(shè)備坐標(biāo)下的窗口。根據(jù)“窗口”和“視口”的大小就可以確定x和y的比例因子。坐標(biāo)映射【例Ex_Scale】通過(guò)設(shè)置窗口和視口大小來(lái)改變顯示的比例①用“MFC應(yīng)用程序向?qū)А眲?chuàng)建一個(gè)精簡(jiǎn)的單文檔應(yīng)用程序Ex_Scale。②在CEx_ScaleView::OnDraw函數(shù)中添加下列代碼:voidCEx_ScaleView::OnDraw(CDC*pDC){ CEx_ScaleDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); if(!pDoc) return; CRectrectClient; GetClientRect(rectClient); //獲得當(dāng)前窗口的客戶區(qū)大小 pDC->SetMapMode(MM_ANISOTROPIC); //設(shè)置MM_ANISOTROPIC映射模式 pDC->SetWindowExt(1000,1000); //設(shè)置窗口范圍 int nViewLength=rectClient.Width()/2; //一半寬度 int nViewHeight=rectClient.Height()/2; //一半高度 pDC->SetViewportExt(nViewLength,nViewHeight); //設(shè)置視口范圍 pDC->SetViewportOrg(nViewLength,nViewHeight); //設(shè)置視口原點(diǎn) pDC->Ellipse(CRect(-500,-500,500,500)); //數(shù)據(jù)單位總是為邏輯坐標(biāo)}坐標(biāo)映射③編譯運(yùn)行,結(jié)果如圖8.1所示。nViewHeight視口長(zhǎng)度nViewLength視口原點(diǎn)(nViewLength,nViewHeight)03CPoint、CSize和CRect1.CPoint、CSize和CRect類的構(gòu)造函數(shù)2.CRect類的常用操作CPoint、CSize和CRect在圖形繪制操作中,常常需要使用MFC中的CPoint、CSize和CRect等簡(jiǎn)單數(shù)據(jù)類。由于CPoint(點(diǎn))、CSize(大小)和CRect(矩形)是對(duì)Windows的POINT、SIZE和RECT結(jié)構(gòu)的封裝,因此它們可以直接使用各自結(jié)構(gòu)的數(shù)據(jù)成員,如下所示:typedefstructtagPOINT{ LONGx; //點(diǎn)的x坐標(biāo) LONGy; //點(diǎn)的y坐標(biāo)}POINT;typedefstructtagSIZE{ intcx; //水平大小 intcy; //垂直大小}SIZE;typedefstructtagRECT{LONGleft; //矩形左上角點(diǎn)的x坐標(biāo)LONGtop; //矩形左上角點(diǎn)的y坐標(biāo)LONGright; //矩形右下角點(diǎn)的x坐標(biāo)LONGbottom; //矩形右下角點(diǎn)的y坐標(biāo)}RECT;CPoint、CSize和CRect1.CPoint、CSize和CRect類的構(gòu)造函數(shù)CPoint類帶參數(shù)的常用構(gòu)造函數(shù)原型如下:CPoint(int

initX,intinitY

);CPoint(POINT

initPt

);其中,initX和initY分別用來(lái)指定CPoint的成員x和y的值。initPt用來(lái)指定一個(gè)POINT結(jié)構(gòu)或CPoint對(duì)象來(lái)初始化CPoint的成員。CSize類帶參數(shù)的常用構(gòu)造函數(shù)原型如下:CSize(int

initCX,int

initCY

);CSize(SIZE

initSize

);其中,initCX和initCY分別用來(lái)設(shè)置CSize的cx和cy成員。initSize用來(lái)指定一個(gè)SIZE結(jié)構(gòu)或CSize對(duì)象來(lái)初始化CSize的成員。CRect類帶參數(shù)的常用構(gòu)造函數(shù)原型如下:CRect(int

l,int

t,int

r,intb

);CRect(const

RECT&

srcRect

);CRect(LPCRECT

lpSrcRect

);CRect(POINT

point,SIZE

size

);CRect(POINTtopLeft,POINT

bottomRight

);CPoint、CSize和CRect2.CRect類的常用操作由于一個(gè)CRect類對(duì)象包含用于定義矩形的左上角和右下角點(diǎn)的成員變量,因此在傳遞LPRECT、LPCRECT或RECT結(jié)構(gòu)作為參數(shù)的任何地方,都可以使用CRect類相應(yīng)的對(duì)象來(lái)代替。需要說(shuō)明的是,當(dāng)構(gòu)造一個(gè)CRect時(shí),還應(yīng)使它符合規(guī)范。也就是說(shuō),使其left小于right,top小于bottom。例如,若左上角為(20,20),而右下角為(10,10),那么定義的這個(gè)矩形就不符合規(guī)范。一個(gè)不符合規(guī)范的矩形,CRect的許多成員函數(shù)都不會(huì)有正確的結(jié)果。基于此種原因,常常需要使用CRect::NormalizeRect函數(shù)使一個(gè)不符合規(guī)范的矩形合乎規(guī)范。CPoint、CSize和CRectCRect類的操作函數(shù)有很多,這里只介紹矩形的擴(kuò)大、縮小以及兩個(gè)矩形的“并”和“交”操作,更多的常用操作如表8.2所示。成員函數(shù)功能說(shuō)明intWidth()const;返回矩形的寬度intHeight()const;返回矩形的高度CSizeSize()const;返回矩形的大小,CSize中的cx和cy成員分別表示矩形的寬度和高度CPoint&TopLeft();返回矩形左下角的點(diǎn)坐標(biāo)CPoint&BottomRight();返回矩形右下角的點(diǎn)坐標(biāo)CPointCenterPoint()const;返回CRect的中點(diǎn)坐標(biāo)BOOLIsRectEmpty()const;如果一個(gè)矩形的寬度或高度是0或負(fù)值,則稱這個(gè)矩形為空,返回TRUEBOOLIsRectNull()const;如果一個(gè)矩形的上、左、下和右邊的值都等于0,則返回TRUEBOOLPtInRect(POINTpoint)const;如果點(diǎn)point位于矩形中(包括點(diǎn)在矩形的邊上),則返回TRUEvoidSetRect(intx1,inty1,intx2,inty2);將矩形的各邊設(shè)為指定的值,左上角點(diǎn)為(x1,y1),右下角點(diǎn)為(x2,y2)voidSetRectEmpty();將矩形的所有坐標(biāo)設(shè)置為零voidNormalizeRect();使矩形符合規(guī)范voidOffsetRect(intx,inty);voidOffsetRect(POINTpoint);voidOffsetRect(SIZEsize);移動(dòng)矩形,水平和垂直移動(dòng)量分別由x、y或point、size的兩個(gè)成員來(lái)指定CPoint、CSize和CRect成員函數(shù)InflateRect和DeflateRect用來(lái)擴(kuò)大和縮小一個(gè)矩形。由于它們的操作是相互的,也就是說(shuō),若指定InflateRect函數(shù)的參數(shù)為負(fù)值,那么操作的結(jié)果是縮小矩形,因此下面只給出InflateRect函數(shù)的原型:voidInflateRect(int

x,int

y

);voidInflateRect(SIZE

size

);voidInflateRect(LPCRECT

lpRect

);voidInflateRect(intl,int

t,int

r,int

b

);其中,x用來(lái)指定擴(kuò)大CRect左、右邊的數(shù)值。y用來(lái)指定擴(kuò)大CRect上、下邊的數(shù)值。size中的cx成員指定擴(kuò)大左、右邊的數(shù)值,cy指定擴(kuò)大上、下邊的數(shù)值。lpRect的各個(gè)成員用來(lái)指定擴(kuò)大每一邊的數(shù)值。l、t、r和b分別用來(lái)指定擴(kuò)大CRect左、上、右和下邊的數(shù)值。CPoint、CSize和CRect成員函數(shù)IntersectRect和UnionRect分別用來(lái)將兩個(gè)矩形進(jìn)行相交和合并,當(dāng)結(jié)果為空時(shí)返回FALSE,否則返回TRUE。它們的原型如下:BOOLIntersectRect(LPCRECT

lpRect1,LPCRECT

lpRect2

);BOOLUnionRect(LPCRECT

lpRect1,LPCRECT

lpRect2

);其中,lpRect1和lpRect2用來(lái)指定操作的兩個(gè)矩形。例如:CRectrectOne(125,0,150, 200);CRectrectTwo(0,75,350, 95);CRectrectInter;rectInter.IntersectRect(rectOne,rectTwo); //結(jié)果為(125,75,150,95)ASSERT(rectInter==CRect(125,75,150,95));rectInter.UnionRect(rectOne,rectTwo); //結(jié)果為(0,0,350,200)ASSERT(rectInter==CRect(0,0,350,200));04顏色和顏色對(duì)話框顏色和顏色對(duì)話框在MFC中,CDC使用的是RGB顏色空間,并使用COLORREF數(shù)據(jù)類型來(lái)表示一個(gè)32位的RGB顏色,它也可以用下列的十六進(jìn)制表示:0x00bbggrr此形式的rr、gg、bb分別表示紅、綠、藍(lán)三個(gè)顏色分量的16進(jìn)制值,最大為0xff。在具體操作RGB顏色時(shí),還可使用下列的宏操作:GetBValue 獲得32位RGB顏色值中的藍(lán)色分量GetGValue 獲得32位RGB顏色值中的綠色分量GetRValue 獲得32位RGB顏色值中的紅色分量RGB 將指定的R、G、B分量值轉(zhuǎn)換成一個(gè)32位的RGB顏色值。MFC的CColorDialog類為應(yīng)用程序提供了通用的“顏色”對(duì)話框,如圖8.2所示。它具有下列的構(gòu)造函數(shù):CColorDialog(COLORREF

clrInit

=0,DWORD

dwFlags

=0,CWnd*pParentWnd

=NULL);顏色和顏色對(duì)話框其中,clrInit用來(lái)指定初始的顏色值,若此值沒(méi)指定,則為RGB(0,0,0)(黑色)。pParentWnd用來(lái)指定對(duì)話框的父窗口指針。dwFlags表示用來(lái)定制對(duì)話框外觀和功能的系列標(biāo)志參數(shù),它可以是下列值之一或“|”組合:CC_ANYCOLOR 在基本顏色單元中列出所有可得到的顏色CC_FULLOPEN 顯示所有的顏色對(duì)話框界面。若此標(biāo)志沒(méi)有被設(shè)定,則用戶需

單擊“規(guī)定自定義顏色“按鈕才能顯示出定制顏色的界面CC_PREVENTFULLOPEN 禁用“規(guī)定自定義顏色”按鈕CC_SHOWHELP 在對(duì)話框中顯示“幫助”按鈕CC_SOLIDCOLOR 在基本顏色單元中只列出所得到的純色當(dāng)用戶在對(duì)話框中單擊“確定”按鈕退出后,可調(diào)用下列成員獲得相應(yīng)的顏色。COLORREFGetColor()const; //返回用戶選擇的顏色。voidSetCurrentColor(COLORREFclr); //強(qiáng)制使用clr作為當(dāng)前選擇的顏色staticCOLORREF*GetSavedCustomColors(); //返回用戶自己定義顏色第8章

圖形和文本——圖形設(shè)備接口圖形設(shè)備接口Windows為設(shè)備環(huán)境提供了各種各樣的繪圖工具,例如用于畫(huà)線的“畫(huà)筆”、填充區(qū)域的“畫(huà)刷”以及用于繪制文本的“字體”。MFC封裝了這些工具,并提供相應(yīng)的類來(lái)作為應(yīng)用程序的圖形設(shè)備接口GDI,這些類有一個(gè)共同的抽象基類CGdiObject,具體如表8.3所示。類

名說(shuō)

明CBitmap“位圖”是一種位矩陣,每一個(gè)顯示像素都對(duì)應(yīng)于其中的一個(gè)或多個(gè)位。用戶可以利用位圖來(lái)表示圖像,也可以利用它來(lái)創(chuàng)建畫(huà)刷CBrush“畫(huà)刷”定義了一種位圖形式的像素,利用它可對(duì)區(qū)域內(nèi)部填充顏色或樣式CFont“字體”是一種具有某種樣式和尺寸的所有字符的完整集合,它常常被當(dāng)作資源存于磁盤(pán)中,其中有一些還依賴于某種設(shè)備CPalette“調(diào)色板”是一種顏色映射接口,它允許應(yīng)用程序在不干擾其他應(yīng)用程序的前提下,可以充分利用輸出設(shè)備的顏色描繪能力CPen“畫(huà)筆”是一種用來(lái)畫(huà)線及繪制有形邊框的工具,用戶可以指定它的顏色及寬度,并且可以指定它畫(huà)實(shí)線、點(diǎn)線或虛線等CRgn“區(qū)域”是由多邊形、橢圓或二者組合形成的一種范圍,可以利用它來(lái)進(jìn)行填充、裁剪以及鼠標(biāo)點(diǎn)中測(cè)試等01使用GDI對(duì)象使用GDI對(duì)象在選擇GDI對(duì)象進(jìn)行繪圖時(shí),往往遵循著下列的步驟:①在堆棧中定義一個(gè)GDI對(duì)象(如CPen、CBrush對(duì)象),然后用相應(yīng)的函數(shù)(如CreatePen、CreateSolidBrush)創(chuàng)建此GDI對(duì)象。但要注意:有些GDI派生類的構(gòu)造函數(shù)允許用戶提供足夠的信息,從而一步即可完成對(duì)象的創(chuàng)建任務(wù),這些類有CPen、CBrush等。②將構(gòu)造的GDI對(duì)象選入當(dāng)前設(shè)備環(huán)境中,但不要忘記將原來(lái)的GDI對(duì)象保存起來(lái)。③繪圖結(jié)束后,恢復(fù)當(dāng)前設(shè)備環(huán)境中原來(lái)的GDI對(duì)象。④由于GDI對(duì)象在堆棧中創(chuàng)建,當(dāng)程序結(jié)束后,會(huì)自動(dòng)刪除程序創(chuàng)建的GDI對(duì)象。具體操作可參考下面的代碼過(guò)程:voidCMyView::OnDraw(CDC*pDC){ CPenpenBlack; //定義一個(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(...); //…其他繪圖函數(shù) pDC->SelectObject(pOldPen); //恢復(fù)設(shè)備環(huán)境中原來(lái)的畫(huà)筆}使用GDI對(duì)象除了自定義的GDI對(duì)象外,Windows還包含了一些預(yù)定義的庫(kù)存GDI對(duì)象。由于它們是Windows系統(tǒng)的一部分,因此用戶用不著刪除它們。CDC的成員函數(shù)SelectStockObject可以把一個(gè)庫(kù)存對(duì)象選入當(dāng)前設(shè)備環(huán)境中,并返回原先被選中的對(duì)象指針,同時(shí)使原先被選中的對(duì)象從設(shè)備環(huán)境中分離出來(lái)。如下面的代碼:voidCMyView::OnDraw(CDC*pDC){ CPennewPen(PS_SOLID,2,RGB(0,0,0))) pDC->SelectObject(&newPen); pDC->MoveTo(...); pDC->LineTo(...); //…其他繪圖函數(shù) pDC->SelectStockObject(BLACK_PEN); //newPen被分離出來(lái)}使用GDI對(duì)象函數(shù)SelectStockObject可選用的庫(kù)存GDI對(duì)象類型可以是下列值之一:BLACK_BRUSH 黑色畫(huà)刷DKGRAY_BRUSH 深灰色畫(huà)刷GRAY_BRUSH 灰色畫(huà)刷HOLLOW_BRUSH 中空畫(huà)刷LTGRAY_BRUSH 淺灰色畫(huà)刷NULL_BRUSH 空畫(huà)刷WHITE_BRUSH 白色畫(huà)刷BLACK_PEN 黑色畫(huà)筆NULL_PEN 空畫(huà)筆WHITE_PEN 白色畫(huà)筆DEVICE_DEFAULT_FONT 設(shè)備默認(rèn)字體SYSTEM_FONT 系統(tǒng)字體02畫(huà)

筆畫(huà)

筆一個(gè)修飾畫(huà)筆通常具有寬度、樣式和顏色三種屬性。畫(huà)筆的寬度用來(lái)確定所畫(huà)的線條寬度,它是用設(shè)備單位表示的。默認(rèn)的畫(huà)筆寬度是一個(gè)像素單位。畫(huà)筆的顏色確定了所畫(huà)的線條顏色。畫(huà)筆的樣式確定了所繪圖形的線型,它通常有實(shí)線、虛線、點(diǎn)線、點(diǎn)劃線、雙點(diǎn)劃線、不可見(jiàn)線和內(nèi)框線7種樣式。這些樣式在Windows中都是以PS_為前綴的預(yù)定義的標(biāo)識(shí),如表8.4所示。風(fēng)

格含

義圖

例PS_SOLID實(shí)線PS_DASH虛線

PS_DOT點(diǎn)線

PS_DASHDOT點(diǎn)劃線

PS_DASHDOTDOT雙點(diǎn)劃線

PS_NULL不可見(jiàn)線

PS_INSIDEFRAME內(nèi)框線畫(huà)

筆創(chuàng)建一個(gè)修飾畫(huà)筆,可以使用CPen類的CreatePen函數(shù),其原型如下:BOOLCreatePen(int

nPenStyle,intnWidth,COLORREFcrColor

);其中,參數(shù)nPenStyle、nWidth、crColor分別用來(lái)指定畫(huà)筆的樣式、寬度和顏色,若nWidth為0,則筆寬取默認(rèn)的1個(gè)像素。此外,還有一個(gè)CreatePenIndirect函數(shù)也是用來(lái)創(chuàng)建畫(huà)筆對(duì)象,它的作用與CreatePen函數(shù)是完全一樣的,只是畫(huà)筆的三個(gè)屬性不是直接出現(xiàn)在函數(shù)參數(shù)中,而是通過(guò)一個(gè)LOGPEN結(jié)構(gòu)間接地給出。BOOLCreatePenIndirect(LPLOGPENlpLogPen

);此函數(shù)用由LOGPEN結(jié)構(gòu)指針指定的相關(guān)參數(shù)創(chuàng)建畫(huà)筆,LOGPEN結(jié)構(gòu)如下:typedefstructtagLOGPEN{/*lgpn*/UINT lopnStyle; //畫(huà)筆樣式,同上POINT lopnWidth; //POINT結(jié)構(gòu)的y不起作用,而用x表示畫(huà)筆寬度COLORREF lopnColor; //畫(huà)筆顏色}LOGPEN;值得注意的是:(1)當(dāng)修飾畫(huà)筆的寬度大于1個(gè)像素時(shí),畫(huà)筆的樣式只能取PS_NULL、PS_SOLID或PS_INSIDEFRAME,定義為其他樣式不會(huì)起作用。(2)畫(huà)筆的創(chuàng)建也可在畫(huà)筆的構(gòu)造函數(shù)中進(jìn)行,它具有下列原型:CPen(intnPenStyle,int

nWidth,COLORREFcrColor

);03畫(huà)

刷畫(huà)

刷畫(huà)刷的屬性通常包括填充色、填充圖案和填充樣式三種。畫(huà)刷的填充色和畫(huà)筆顏色一樣,都是使用COLORREF顏色類型,畫(huà)刷的填充圖案通常是用戶定義的8×8位圖,而填充樣式往往是CDC內(nèi)部定義的一些特性,它們都是以HS_為前綴的標(biāo)識(shí),如圖8.3所示。CBrush類根據(jù)畫(huà)刷屬性提供了相應(yīng)的創(chuàng)建函數(shù),例如創(chuàng)建填充色畫(huà)刷和填充樣式畫(huà)刷的函數(shù)為CreateSolidBrush和CreateHatchBrush,它們的原型如下:BOOLCreateSolidBrush(COLORREF

crColor); //創(chuàng)建填充色畫(huà)刷BOOLCreateHatchBrush(int

nIndex,COLORREF

crColor

); //創(chuàng)建填充樣式畫(huà)刷其中,nIndex用來(lái)指定畫(huà)刷的內(nèi)部填充樣式,而crColor表示畫(huà)刷的填充色。畫(huà)

刷與畫(huà)筆相類似,也有一個(gè)LOGBRUSH邏輯結(jié)構(gòu)用于畫(huà)刷屬性的定義,并通過(guò)CBrush的成員函數(shù)CreateBrushIndirect來(lái)創(chuàng)建,其原型如下:BOOLCreateBrushIndirect(constLOGBRUSH*lpLogBrush);其中,LOGBRUSH邏輯結(jié)構(gòu)如下定義:typedefstructtagLOGBRUSH{ //lbUINT lbStyle; //樣式COLORREF lbColor; //填充色LONG lbHatch; //填充樣式}LOGBRUSH;另外,還需注意:(1)畫(huà)刷的創(chuàng)建也可在其構(gòu)造函數(shù)中進(jìn)行,它具有下列原型:CBrush(COLORREF

crColor

);CBrush(intnIndex,COLORREF

crColor

);CBrush(CBitmap*

pBitmap

);(2)畫(huà)刷也可用位圖來(lái)指定其填充圖案,但該位圖應(yīng)該是8×8像素,若位圖太大,Windows則只使用其左上角的8×8像素。(3)畫(huà)刷僅對(duì)繪圖函數(shù)Chord、Ellipse、FillRect、FrameRect、InvertRect、Pie、Polygon、PolyPolygon、Rectangle、RoundRect有效。04位

圖1.CBitmap類2.GDI位圖的顯示位

圖Windows的位圖有兩種類型:一種稱之為GDI位圖,另一種是DIB位圖。GDI位圖是由MFC中的CBitmap類來(lái)表示的,在CBitmap類的對(duì)象中,包含了一種和Windows的GDI模塊有關(guān)的Windows數(shù)據(jù)結(jié)構(gòu),該數(shù)據(jù)結(jié)構(gòu)與設(shè)備有關(guān),故此位圖又稱為DDB位圖(device-dependentbitmap,設(shè)備相關(guān)位圖)。當(dāng)用戶的程序取得位圖數(shù)據(jù)信息時(shí),其位圖顯示方式視顯卡而定。由于GDI位圖的這種設(shè)備依賴性,當(dāng)位圖通過(guò)網(wǎng)絡(luò)傳送到另一臺(tái)PC時(shí),可能就會(huì)出現(xiàn)問(wèn)題。DIB(device-independentbitmap,設(shè)備無(wú)關(guān)位圖)比GDI位圖有很多編程優(yōu)勢(shì),例如它自帶顏色信息,從而使調(diào)色板管理更加容易。且任何運(yùn)行Windows的機(jī)器都可以處理DIB,并通常以后綴為BMP的文件形式被保存在磁盤(pán)中或作為資源存在于程序的EXE或DLL文件中。位

圖1.CBitmap類CBitmap類封裝了Windows的GDI位圖操作所需的大部分函數(shù)。其中,LoadBitmap是位圖的初始化函數(shù),其函數(shù)原型如下:BOOLLoadBitmap(LPCTSTRlpszResourceName);BOOLLoadBitmap(UINT

nIDResource

);該函數(shù)從應(yīng)用程序中調(diào)入一個(gè)位圖資源(由nIDResource或lpszResourceName指定)。若用戶直接創(chuàng)建一個(gè)位圖對(duì)象,可使用CBitmap類中的CreateCompatibleBitmap、CreateBitmap、CreateBitmapIndirect等函數(shù),它們的原型如下。BOOLCreateCompatibleBitmap(CDC*

pDC,int

nWidth,int

nHeight

);該函數(shù)為某設(shè)備環(huán)境創(chuàng)建一個(gè)指定的寬度(nWidth)和高度(nHeight)的位圖對(duì)象。BOOLCreateBitmap(int

nWidth,int

nHeight,UINT

nPlanes,UINT

nBitcount,const

void*lpBits

);該函數(shù)用指定的寬度(nWidth)、高度(nHeight)和位模式創(chuàng)建一個(gè)位圖對(duì)象。其中,參數(shù)nPlanes表示位圖顏色的位面數(shù)目,nBitcount表示每個(gè)像素顏色的位數(shù),lpBits表示包含像素各位顏色值的短整型數(shù)組;若此數(shù)組為NULL,則位圖對(duì)象還未初始化。BOOLCreateBitmapIndirect(LPBITMAP

lpBitmap);該函數(shù)直接用BITMAP結(jié)構(gòu)來(lái)創(chuàng)建一個(gè)位圖對(duì)象。位

圖2.GDI位圖的顯示由于位圖不能直接顯示在實(shí)際設(shè)備中,因此對(duì)于GDI位圖的顯示則必須遵循下列步驟:①調(diào)用CBitmap類的CreateBitmap、CreateCompatibleBitmap以及CreateBitmapIndirect函數(shù)創(chuàng)建一個(gè)適當(dāng)?shù)奈粓D對(duì)象。②調(diào)用CDC::CreateCompatibleDC函數(shù)創(chuàng)建一個(gè)內(nèi)存設(shè)備環(huán)境,以便位圖在內(nèi)存中保存下來(lái),并與指定設(shè)備(窗口設(shè)備)環(huán)境相兼容;③調(diào)用CDC::SelectObject函數(shù)將位圖對(duì)象選入內(nèi)存設(shè)備環(huán)境中;④調(diào)用CDC::BitBlt或CDC::StretchBlt函數(shù)將位圖復(fù)制到實(shí)際設(shè)備環(huán)境中。⑤使用之后,恢復(fù)原來(lái)的內(nèi)存設(shè)備環(huán)境。位

圖【例Ex_BMP】在視圖中顯示位圖①用“MFC應(yīng)用程序向?qū)А眲?chuàng)建一個(gè)精簡(jiǎn)的單文檔應(yīng)用程序Ex_BMP。②選擇“項(xiàng)目”→“添加資源”菜單命令,打開(kāi)“添加資源”對(duì)話框,選擇Bitmap資源類型。單擊按鈕,出現(xiàn)“導(dǎo)入”對(duì)話框,從外部文件(如AutoCAD中的InventorServer\Textures\surfaces)中選定一個(gè)位圖文件,然后單擊按鈕,該位圖就被調(diào)入應(yīng)用程序中。保留默認(rèn)的位圖資源標(biāo)識(shí)IDB_BITMAP1。③在CEx_BMPView::OnDraw函數(shù)中添加下列代碼:voidCEx_BMPView::OnDraw(CDC*pDC){ CEx_BMPDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); if(!pDoc) return; CBitmapm_bmp; m_bmp.LoadBitmap(IDB_BITMAP1); //調(diào)入位圖資源 BITMAPbm; //定義一個(gè)BITMAP結(jié)構(gòu)變量 m_bmp.GetObject(sizeof(BITMAP),&bm); CDCdcMem; //定義并創(chuàng)建一個(gè)內(nèi)存設(shè)備環(huán)境 dcMem.CreateCompatibleDC(pDC); CBitmap*pOldbmp=dcMem.SelectObject(&m_bmp); //將位圖選入內(nèi)存設(shè)備環(huán)境中 pDC->BitBlt(0,0,bm.bmWidth,bm.bmHeight,&dcMem,0,0,SRCCOPY); //將位圖復(fù)制到實(shí)際的設(shè)備環(huán)境中 dcMem.SelectObject(pOldbmp); //恢復(fù)原來(lái)的內(nèi)存設(shè)備環(huán)境}位

圖④編譯并運(yùn)行,結(jié)果如圖8.4所示。位

圖通過(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的顯示更新速度較快。它們的原型如下:BOOLBitBlt(int

x,int

y,int

nWidth,intnHeight,CDC*pSrcDC,

intxSrc,int

ySrc,DWORD

dwRop

);BOOLStretchBlt(int

x,int

y,int

nWidth,intnHeight,CDC*pSrcDC,int

xSrc,

int

ySrc,int

nSrcWidth,int

nSrcHeight,DWORDdwRop

);其中,參數(shù)x、y表示位圖目標(biāo)方塊左上角的x、y邏輯坐標(biāo)值,nWidth、nHeight表示位圖目標(biāo)方塊的邏輯寬度和高度,pSrcDC表示源設(shè)備CDC指針,xSrc、ySrc表示位圖源方塊的左上角的x、y邏輯坐標(biāo)值,dwRop表示顯示位圖的光柵操作方式。光柵操作方式有很多種,但經(jīng)常使用的是SRCCOPY,用來(lái)直接將位圖復(fù)制到目標(biāo)環(huán)境中。StretchBlt函數(shù)還比BitBlt參數(shù)多兩個(gè):nSrcWidth、nSrcHeight,它們是用來(lái)表示位圖源方塊的邏輯寬度和高度。05圖形繪制1.畫(huà)點(diǎn)、線2.折線3.矩形和圓角矩形4.多邊形5.圓弧和橢圓6.在視圖中繪圖示例圖形繪制1.畫(huà)點(diǎn)、線如果繪圖函數(shù)中沒(méi)有畫(huà)點(diǎn)和畫(huà)線的功能,很難想象其他圖形是怎樣構(gòu)成的,因?yàn)辄c(diǎn)和線是一切圖形的基礎(chǔ)。畫(huà)點(diǎn)是最基本的繪圖操作之一,它是通過(guò)調(diào)用CDC::SetPixel或CDC::SetPixelV函數(shù)來(lái)實(shí)現(xiàn)的。這兩個(gè)函數(shù)都用來(lái)在指定的坐標(biāo)上設(shè)置指定的顏色,只不過(guò)SetPixelV函數(shù)不需要返回實(shí)際像素點(diǎn)的RGB值,正是因?yàn)檫@一點(diǎn),函數(shù)SetPixelV要比SetPixel快得多。COLORREFSetPixel(intx,inty,COLORREFcrColor);COLORREFSetPixel(POINTpoint,COLORREFcrColor);BOOLSetPixelV(intx,inty,COLORREFcrColor);BOOLSetPixelV(POINTpoint,COLORREFcrColor);與上述函數(shù)相對(duì)應(yīng)的GetPixel函數(shù)是用來(lái)獲取指定點(diǎn)的顏色。COLORREFGetPixel(intx,inty)const;COLORREFGetPixel(POINTpoint)const;畫(huà)線也是特別常用的繪圖操作之一。CDC的LineTo和MoveTo函數(shù)就是用來(lái)實(shí)現(xiàn)畫(huà)線功能的兩個(gè)函數(shù),通過(guò)這兩個(gè)函數(shù)的配合使用,可完成任何直線和折線的繪制操作。圖形繪制BOOLLineTo(intx,inty);BOOLLineTo(POINTpoint);LineTo函數(shù)是經(jīng)當(dāng)前位置所在點(diǎn)為直線起始點(diǎn),另指定直線終點(diǎn),畫(huà)出一段直線的。其原型如下:如果當(dāng)前要畫(huà)的直線并不與上一條直線的終點(diǎn)相接,那么應(yīng)該調(diào)用MoveTo函數(shù)來(lái)調(diào)整當(dāng)前位置。此函數(shù)不但可以用來(lái)更新當(dāng)前位置,而且還可用來(lái)返回更新前的當(dāng)前位置。其函數(shù)原型如下:CPointMoveTo(intx,inty);CPointMoveTo(POINTpoint);圖形繪制2.折線除了LineTo函數(shù)可用來(lái)畫(huà)線之外,CDC中還提供了一系列用于畫(huà)各種折線的函數(shù)。它們主要是Polyline、PolyPolyline和PolylineTo。這3個(gè)函數(shù)中,Polyline和PolyPolyline既不使用當(dāng)前位置,也不更新當(dāng)前位置;而PolylineTo總是把當(dāng)前位置作為起始點(diǎn),并且在折線畫(huà)完之后,還把折線終點(diǎn)所在位置設(shè)為新的當(dāng)前位置。BOOLPolyline(LPPOINTlpPoints,intnCount);BOOLPolylineTo(constPOINT*lpPoints,intnCount);這兩個(gè)函數(shù)用來(lái)畫(huà)一系列連續(xù)的折線。參數(shù)lpPoints是POINT或CPoint的頂點(diǎn)數(shù)組;nCount表示數(shù)組中頂點(diǎn)的個(gè)數(shù),它至少為2。BOOLPolyPolyline(constPOINT*lpPoints,constDWORD*lpPolyPoints,intnCount);此函數(shù)可用來(lái)繪制多條折線。其中l(wèi)pPoints同前定義,lpPolyPoints表示各條折線所需的頂點(diǎn)數(shù),nCount表示折線的數(shù)目。圖形繪制3.矩形和圓角矩形CDC提供的Rectangle和RoundRect函數(shù)分別用于矩形和圓角矩形的繪制,它們的原型如下:BOOLRectangle(intx1,inty1,intx2,inty2);BOOLRectangle(LPCRECTlpRect);BOOLRoundRect(intx1,inty1,intx2,inty2,intx3,inty3);BOOLRoundRect(LPCRECTlpRect,POINTpoint);參數(shù)lpRect的成員left,top,right,bottom分別對(duì)應(yīng)于參數(shù)x1,y1,x2,y2,point的成員x,y分別對(duì)應(yīng)于參數(shù)x3,y3;而x1,y1表示矩形的左上角坐標(biāo),x2,y2表示矩形的右上角坐標(biāo),x3,y3表示繪制圓角的橢圓大小。圖形繪制4.多邊形前面已經(jīng)介紹過(guò)折線的畫(huà)法,而多邊形可以說(shuō)就是由首尾相接的封閉折線所圍成的圖形。畫(huà)多邊形的函數(shù)Polygon原型如下:BOOLPolygon(LPPOINTlpPoints,intnCount);可以看出,Polygon函數(shù)的參數(shù)形式與Polyline函數(shù)是相同的,但也稍有差異。例如,要畫(huà)一個(gè)三角形,使用Polyline函數(shù),頂點(diǎn)數(shù)組中就得給出4個(gè)頂點(diǎn)(盡管始點(diǎn)和終點(diǎn)重復(fù)出現(xiàn)),而用Polygon函數(shù)則只需給出3個(gè)頂點(diǎn)。與PolyPolyline可畫(huà)多條折線一樣,使用PolyPolygon函數(shù),一次可畫(huà)出多個(gè)多邊形,這兩個(gè)函數(shù)的參數(shù)形式和含義也一樣。BOOLPolyPolygon(LPPOINTlpPoints,LPINTlpPolyCounts,intnCount);圖形繪制5.圓弧和橢圓通過(guò)調(diào)用CDC的Arc函數(shù)可以畫(huà)一條橢圓弧線或者整個(gè)橢圓。這個(gè)橢圓的大小是由其外接矩形(本身并不可見(jiàn))所決定的。Arc函數(shù)的原型如下:BOOLArc(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4);BOOLArc(LPCRECTlpRect,POINTptStart,POINTptEnd);這里,x1,y1,x2,y2或lpRect用來(lái)指定外接矩形的位置和大小,而橢圓中心與點(diǎn)(x3,y3)或ptStart所構(gòu)成的射線與橢圓的交點(diǎn)就成為橢圓弧線的起始點(diǎn),橢圓中心與點(diǎn)(x4,y4)或ptEnd所構(gòu)成的射線與橢圓的交點(diǎn)就成為橢圓弧線的終點(diǎn)。橢圓上弧線始點(diǎn)到終點(diǎn)的部分是要繪制的橢圓弧。需要說(shuō)明,要唯一地確定一條橢圓弧線,除了上述參數(shù)外,還有一個(gè)重要參數(shù),那就是弧線繪制的方向。默認(rèn)時(shí),這個(gè)方向?yàn)槟鏁r(shí)針,但可以通過(guò)調(diào)用SetArcDirection函數(shù)將繪制方向改設(shè)為順時(shí)針?lè)较颉ntSetArcDirection(intnArcDirection);該函數(shù)成功調(diào)用時(shí)返回以前的繪制方向,nArcDirection可以是AD_CLOCKWISE(順時(shí)針)或AD_COUNTERCLOCKWISE(逆時(shí)針)。此方向?qū)瘮?shù)Arc、Pie、ArcTo、Rectangle、Chord、RoundRect、Ellipse有效。圖形繪制另外,ArcTo也是一個(gè)畫(huà)圓弧的CDC成員函數(shù),它與Arc函數(shù)的唯一的區(qū)別是:ArcTo函數(shù)將圓弧的終點(diǎn)作為新的當(dāng)前位置,而Arc不會(huì)。BOOLArcTo(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4);BOOLArcTo(LPCRECTlpRect,POINTptStart,POINTptEnd);與上述函數(shù)相類似,調(diào)用CDC成員函數(shù)Ellipse可以用當(dāng)前畫(huà)刷繪制一個(gè)橢圓區(qū)域。BOOLEllipse(intx1,inty1,intx2,inty2);BOOLEllipse(LPCRECTlpRect);參數(shù)x1,y1,x2,y2或lpRect表示橢圓外接矩形的大小和位置。圖形繪制6.在視圖中繪圖示例下面的示例用來(lái)表示一個(gè)班級(jí)某門課程的成績(jī)分布,它是一個(gè)直方圖,反映<60、60~69、70~79、80~89以及>90五個(gè)分?jǐn)?shù)段的人數(shù),它需要繪制五個(gè)矩形,相鄰矩形的填充樣式還要有所區(qū)別,并且還需要顯示各分?jǐn)?shù)段的人數(shù)。其結(jié)果如圖8.5所示。圖形繪制【例Ex_Draw】課程的成績(jī)分布直方圖①用“MFC應(yīng)用程序向?qū)А眲?chuàng)建一個(gè)精簡(jiǎn)的單文檔應(yīng)用程序Ex_Draw。將項(xiàng)目“常規(guī)”配置中的“字符集”屬性改為“使用多字節(jié)字符集”,并將stdafx.h文件最后面內(nèi)容中的#ifdef_UNICODE行和最后一個(gè)#endif行刪除。②為CEx_DrawView類添加一個(gè)成員函數(shù)DrawScore,用來(lái)根據(jù)成績(jī)來(lái)繪制直方圖,該函數(shù)的代碼如下:③在CEx_DrawView::OnDraw函數(shù)中添加下列代碼:voidCEx_DrawView::OnDraw(CDC*pDC){ CEx_DrawDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); if(!pDoc) return; floatfScore[]={66,82,79,74,86,82,67,60,45,44,77,98,65,90,66,76,66, 62,83,84,97,43,67,57,60,60,71,74,60,72,81,69,79,91,69,71,81}; DrawScore(pDC,fScore,sizeof(fScore)/sizeof(float));}④編譯并運(yùn)行。第8章

圖形和文本——字體與文字處理01字體和字體對(duì)話框1.字體的屬性和創(chuàng)建2.使用字體對(duì)話框字體和字體對(duì)話框1.字體的屬性和創(chuàng)建字體的屬性有很多,但其主要屬性有字樣、樣式和尺寸三個(gè)。字樣是字符書(shū)寫(xiě)和顯示時(shí)表現(xiàn)出的特定模式,例如,對(duì)于漢字,通常有宋體、楷體、仿宋、黑體、隸書(shū)以及幼圓等多種字樣。字體樣式主要表現(xiàn)為字體的粗細(xì)和是否傾斜等特點(diǎn)。字體尺寸是用來(lái)指定字符所占區(qū)域的大小,通常用字符高度來(lái)描述。字體尺寸可以取毫米或英寸作為單位,但為了直觀起見(jiàn),也常常采用一種稱為“點(diǎn)”的單位,一點(diǎn)約折合為1/72英寸。為了方便用戶創(chuàng)建字體,系統(tǒng)定義一種“邏輯字體”,它是應(yīng)用程序?qū)τ诶硐胱煮w的一種描述方式。在使用邏輯字體繪制文字時(shí),系統(tǒng)會(huì)采用一種特定的算法把邏輯字體映射為最匹配的物理字體(實(shí)際安裝在操作系統(tǒng)中的字體)。邏輯字體的具體屬性可用LOGFONT結(jié)構(gòu)來(lái)描述,這里僅列最常用到的結(jié)構(gòu)成員。typedefstructtagLOGFONT{ LONG lfHeight; //字體的邏輯高度 LONG lfWidth; //字符的平均邏輯寬度 LONG lfEscapement; //傾角 LONG lfOrientation; //書(shū)寫(xiě)方向 LONG lfWeight; //字體的粗細(xì)程度 BYTE lfItalic; //斜體標(biāo)志 BYTE lfUnderline; //下劃線標(biāo)志

BYTE lfStrikeOut; //刪除線標(biāo)志 BYTE lfCharSet; //字符集,漢字必須為GB2312_CHARSET TCHAR lfFaceName[LF_FACESIZE]; //字樣名稱 //…}LOGFONT;字體和字體對(duì)話框lfEscapement表示字體的傾斜矢量與設(shè)備的x軸之間的夾角(以1/10度為計(jì)量單位),該傾斜矢量與文本的書(shū)寫(xiě)方向是平行的。lfOrientation表示字符基準(zhǔn)線與設(shè)備的x軸之間的夾角(以1/10度為計(jì)量單位)。lfWeight表示字體的粗細(xì)程度,取值范圍是從0到1000(字符筆劃從細(xì)到粗)。例如,400為常規(guī)情況,700為粗體。根據(jù)定義的邏輯字體,用戶就可以調(diào)用CFont類的CreateFontIndirect函數(shù)創(chuàng)建文本輸出所需要的字體,如下面的代碼:LOGFONT lf; //定義邏輯字體的結(jié)構(gòu)變量memset(&lf,0,sizeof(LOGFONT)); //將lf中的所有成員置0lf.lfHeight=-13;lf.lfCharSet=GB2312_CHARSET;strcpy((LPSTR)&(lf.lfFaceName),"黑體");CFont cf; cf.CreateFontIndirect(&lf); //用邏輯字體結(jié)構(gòu)創(chuàng)建字體//在設(shè)備環(huán)境中使用字體CFont*oldfont=pDC->SelectObject(&cf);pDC->TextOut(100,100,"Hello");pDC->SelectObject(oldfont); //恢復(fù)設(shè)備環(huán)境原來(lái)的屬性cf.DeleteObject(); //刪除字體對(duì)象字體和字體對(duì)話框2.使用字體對(duì)話框CFontDialog類提供了字體及其文本顏色選擇的通用對(duì)話框,如圖8.6所示。它的構(gòu)造函數(shù)如下:CFontDialog(LPLOGFONTlplfInitial=NULL,DWORDdwFlags=CF_EFFECTS|CF_SCREENFONTS,CDC*pdcPrinter=NULL,CWnd*pParentWnd=NULL);其中,參數(shù)lplfInitial是一個(gè)LOGFONT結(jié)構(gòu)指針,用來(lái)設(shè)置對(duì)話框最初的字體特性。dwFlags指定選擇字體的標(biāo)志。pdcPrinter用來(lái)表示打印設(shè)備環(huán)境指針。pParentWnd表示對(duì)話框的父窗口指針。字體和字體對(duì)話框當(dāng)字體對(duì)話框DoModal返回IDOK后,可使用下列的成員函數(shù):void GetCurrentFont(LPLOGFONTlplf); //返回用戶選擇的LOGFONT字體CString GetFaceName()const; //返回用戶選擇的字體名稱CString GetStyleName()const; //返回用戶選擇的字體樣式名稱int GetSize()const; //返回用戶選擇的字體大小COLORREF GetColor()const; //返回用戶選擇的文本顏色int GetWeight()const; //返回用戶選擇的字體粗細(xì)程度BOOL IsStrikeOut()const; //判斷是否有刪除線BOOL IsUnderline()const; //判斷是否有下劃線BOOL IsBold()const; //判斷是否是粗體BOOL IsItalic()const; //判斷是否是斜體。通過(guò)字體對(duì)話框可以創(chuàng)建一個(gè)字體,如下面的代碼:LOGFONTlf;CFont cf;memset(&lf,0,sizeof(LOGFONT)); //將lf中的所有成員置0CFontDialogdlg(&lf);if(dlg.DoModal()==IDOK){ dlg.GetCurrentFont(&lf); pDC->SetTextColor(dlg.GetColor()); cf.CreateFontIndirect(&lf); ...}02常用文本輸出函數(shù)常用文本輸出函數(shù)對(duì)于這四個(gè)函數(shù),用戶應(yīng)根據(jù)具體情況來(lái)選用。例如,如果想要繪制的文本是一個(gè)多列的列表形式,那么采用TabbedTextOut函數(shù),啟用制表位,可以使繪制出來(lái)的文本效果更佳;如果要在一個(gè)矩形區(qū)域內(nèi)繪制多行文本,那么采用DrawText函數(shù),會(huì)更有效率;如果文本和圖形結(jié)合緊密,字符間隔不等,并要求有背景顏色或矩形裁剪特性,那么ExtTextOut函數(shù)將是最好的選擇。如果沒(méi)有什么特殊要求,那使用TextOut函數(shù)就顯得簡(jiǎn)練了。下面介紹TextOut、TabbedTextOut和DrawText函數(shù)。virtualBOOLTextOut(intx,inty,LPCTSTRlpszString,intnCount);BOOLTextOut(intx,inty,constCString&str);TextOut函數(shù)是用當(dāng)前字體在指定位置(x,y)處顯示一個(gè)文本。參數(shù)中l(wèi)pszString和str指定即將顯示的文本,

nCount表示文本的字節(jié)長(zhǎng)度。若輸出成功,函數(shù)返回TRUE,否則返回FALSE。virtualCSizeTabbedTextOut(intx,inty,LPCTSTRlpszString,intnCount,

intnTabPositions,LPINTlpnTabStopPositions,intnTabOrigin);CSizeTabbedTextOut(intx,inty,constCString&str,

intnTabPositions,LPINTlpnTabStopPositions,intnTabOrigin);常用文本輸出函數(shù)virtualintDrawText(LPCTSTRlpszString,intnCount,LPRECTlpRect,UINTnFormat);intDrawText(constCString&str,LPRECTlpRect,UINTnFormat);TabbedTextOut也是用當(dāng)前字體在指定位置處顯示一個(gè)文本,但它還根據(jù)指定的制表位(Tab)設(shè)置相應(yīng)字符位置,函數(shù)成功時(shí)返回輸出文本的大小。參數(shù)中,nTabPositions表示lpnTabStopPositions數(shù)組的大小,lpnTabStopPositions表示多個(gè)遞增的制表位(邏輯坐標(biāo))的數(shù)組,nTabOrigin表示制表位x方向的起始點(diǎn)(邏輯坐標(biāo))。如果nTabPositions為0,且lpnTabStopPositions為NULL,則使用默認(rèn)的制表位,即一個(gè)Tab相當(dāng)于8個(gè)字符。常用文本輸出函數(shù)DrawText函數(shù)是當(dāng)前字體在指定矩形中對(duì)文本進(jìn)行格式化繪制。參數(shù)中,lpRect用來(lái)指定文本繪制時(shí)的參考矩形,它本身并不顯示;nFormat表示文本的格式,它可以是下列的常用值之一或“|”組合:DT_BOTTOM 下對(duì)齊文本,該值還必須與DT_SINGLELINE組合DT_CENTER 水平居中DT_END_ELLIPSIS 使用省略號(hào)取代文本末尾的字符DT_PATH_ELLIPSIS 使用省略號(hào)取代文本中間的字符DT_EXPANDTABS 使用制表位,缺省的制表長(zhǎng)度為8個(gè)字符DT_LEFT 左對(duì)齊DT_MODIFYSTRING 將文本調(diào)整為能顯示的字串DT_NOCLIP 不裁剪DT_NOPREFIX 不支持“&”字符轉(zhuǎn)義DT_RIGHT 右對(duì)齊DT_SINGLELINE 指定文本的基準(zhǔn)線為參考點(diǎn),單行文本DT_TABSTOP 設(shè)置停止位。nFormat的高位字節(jié)是每個(gè)制表位的數(shù)目DT_TOP 上對(duì)齊DT_VCENTER 垂直居中DT_WORDBREAK 自動(dòng)換行常用文本輸出函數(shù)需要說(shuō)明的是,默認(rèn)時(shí),上述文本輸出函數(shù)既不使用也不更新“當(dāng)前位置”。若要使用和更新“當(dāng)前位置”,則必須調(diào)用SetTextAlign,并將參數(shù)nFlags設(shè)置為TA_UPDATECP。使用時(shí),最好在文本輸出前用MoveTo將當(dāng)前位置移動(dòng)至指定位置后,再調(diào)用文本輸出函數(shù)。這樣,文本輸出函數(shù)參數(shù)中x,y或矩形的左邊才會(huì)被忽略。【例Ex_DrawText】繪制文本的簡(jiǎn)單示例①用“MFC應(yīng)用程序向?qū)А眲?chuàng)建一個(gè)精簡(jiǎn)的單文檔應(yīng)用程序Ex_DrawText。將項(xiàng)目“常規(guī)”配置中的“字符集”屬性改為“使用多字節(jié)字符集”,并將stdafx.h文件最后面內(nèi)容中的#ifdef_UNICODE行和最后一個(gè)#endif行刪除。常用文本輸出函數(shù)②在CEx_DrawTextView::OnDraw中添加下列代碼:voidCEx_DrawTextView::OnDraw(CDC*pDC){ CEx_DrawTextDoc*pDoc=GetDocument(); ASSERT_VALID(pDoc); if(!pDoc) return; CRectrc(10,10,200,140); pDC->Rectangle(rc); pDC->DrawText("單行文本居中",rc,DT_CENTER|DT_VCENTER|DT_SINGLELINE); rc.OffsetRect(200,0); //將矩形向右偏移200 pDC->Rectangle(rc); intnTab=40; //將一個(gè)Tab位的值指定為40個(gè)邏輯單位 pDC->TabbedTextOut(rc.left,rc.top,"繪制\tTab\t文本\t示例",1,&nTab,rc.left); //使用自定義的停止位(Tab) nTab=80; //將一個(gè)Tab位的值指定為80個(gè)邏輯單位 pDC->TabbedTextOut(rc.left,rc.top+20,"繪制\tTab\t文本\t示例",1,&nTab,rc.left); //使用自定義的停止位(Tab) pDC->TabbedTextOut(rc.left,rc.top+40,"繪制\tTab\t文本\t示例",0,NULL,0); //使用默認(rèn)的停止位}常用文本輸出函數(shù)③編譯并運(yùn)行,結(jié)果如圖8.7所示。03文本格式化屬性文本格式化屬性文本的格式化屬性通常包括文本顏色、對(duì)齊方式、字符間隔以及文本調(diào)整等。在繪圖設(shè)備環(huán)境中,默認(rèn)的文本顏色是黑色,而文本背景色為白色,且默認(rèn)的背景模式是不透明方式(OPAQUE)。在CDC類中,SetTextColor、SetBkColor和SetBkMode函數(shù)分別用來(lái)設(shè)置文本顏色、文本背景色和背景模式,而與之相對(duì)應(yīng)的GetTextColor、GetBkcolor和GetBkMode函數(shù)則是分別獲取這三項(xiàng)屬性的。它們的原型如下:virtualCOLORREFSetTextColor(COLORREFcrColor);COLORREFGetTextColor()const;virtualCOLORREFSetBkColor(COLORREFcrColor);COLORREFGetBkColor()const;intSetBkMode(intnBkMode);intGetBkMode()const;其中,nBkMode用來(lái)指定文本背景模式,它可以是OPAQUE或TRANSPARENT(透明)。文本格式化屬性文本對(duì)齊方式的設(shè)置和獲取是由CDC函數(shù)SetTextAlign和GetTextAlign決定的。它們的原型如下:UINTSetTextAlign(UINTnFlags);UINTGetTextAlign()const;上述兩個(gè)函數(shù)中所用到的文本對(duì)齊標(biāo)志如表8.5所示。對(duì)齊標(biāo)志含

義TA_BASELINE以字體的基準(zhǔn)線作為上下對(duì)齊方式TA_BOTTOM以文本外框矩形的底邊作為上下對(duì)齊方式TA_CENTER以文本外框矩形的中點(diǎn)作為左右對(duì)齊方式TA_LEF

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論