




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
本文格式為Word版,下載可任意編輯——VC第5章圖形繪制第5章圖形繪制
在VisualC++6.0中,把握圖形程序設(shè)計方法是十分重要的。由于圖形在任何一個可視化工程項目中都是不可缺少的。CDC(設(shè)備環(huán)境)類封裝了圖形繪制所需要的各種操作。本章我們將通過實際例子和較詳細的闡述,來了解和把握如何使用設(shè)備環(huán)境類
(CDC)及圖形設(shè)備接口(GDI)進行圖形繪制。
5.1設(shè)備環(huán)境與設(shè)備環(huán)境類(CDC)
5.1.1設(shè)備環(huán)境
設(shè)備環(huán)境也稱設(shè)備上下文(DeviceContext,簡稱DC),是計算機物理設(shè)備的代表,也是圖形設(shè)備接口的主要組成部分。
由于Windows是一個與設(shè)備無關(guān)的操作系統(tǒng),即Windows不允許直接訪問硬件,假使用戶想將文本和圖形繪制到顯示器或其它設(shè)備中去,必需通過“設(shè)備環(huán)境〞這個抽象層與硬件進行通信,設(shè)備上下文對象的作用就是實現(xiàn)Windows的設(shè)備無關(guān)性,任何向屏幕上進行輸出的功能都要間接地通過它來完成。
設(shè)備上下文是Windows的一種數(shù)據(jù)結(jié)構(gòu),它包含了有關(guān)如顯示器或打印機等設(shè)備的繪圖屬性信息。所有繪畫都是通過設(shè)備上下文對象來實現(xiàn)的,該對象封裝了Windows的畫線、圖形和文本的API函數(shù)。設(shè)備上下文允許在Windows下獨立于設(shè)備的繪畫。設(shè)備上下文不僅能夠被用來在屏幕上繪畫,它也可以將繪畫輸出到打印機和圖元文件中。
5.1.2設(shè)備環(huán)境類
設(shè)備環(huán)境類CDC直接繼承于CObject類,該類定義了一類設(shè)備對象。CDC對象提供了十分多的成員函數(shù),與設(shè)備環(huán)境的顯示器、打印機等一起工作。例如,假使要在顯示器等設(shè)備上繪制圖形,我們可以用MFC提供的設(shè)備環(huán)境類CDC類,由于CDC類中包含了繪圖所需要的所有成員函數(shù)。同時。MFC還提供了以下幾個CDC的派生類:1、CPaintDC類
此類比較特別,它的構(gòu)造函數(shù)和析構(gòu)函數(shù)都是針對OnPaint進行的。用戶一旦獲得相關(guān)的CDC指針,就可以將它當做任何設(shè)備環(huán)境(包括屏幕、打印機)指針來使用,CPaintDC類的構(gòu)造函數(shù)會自動調(diào)用BeginPaint,而它的析構(gòu)函數(shù)則會自動調(diào)用EndPaint。2、CClientDC和CWindowDC類
CClientDC只能在窗口的客戶區(qū)(不包括邊框、工具條、標題欄、滾動條、菜單欄以及狀態(tài)欄)進行繪圖,點(0,0)尋常指的是客戶區(qū)的左上角。其構(gòu)造函數(shù)調(diào)用GetDC,析構(gòu)函數(shù)調(diào)用ReleaseDC函數(shù)。
CWindowDC允許在窗口的任意位置中進行繪圖,點(0,0)指整個窗口的左上角。其構(gòu)造函數(shù)調(diào)用GetWindowDC,析構(gòu)函數(shù)調(diào)用ReleaseDC函數(shù)。3、CMetaFileDC類
封裝了在一個Windows圖元文件中繪圖的方法。圖元文件是一系列與設(shè)備無關(guān)的圖片的集合,由于它對圖像的保存比像素更確切,因而往往在要求較高的場合下使用,例如:AutoCAD的圖像保存等。目前的Windows已使用加強格式(enhanced-format)的32
1
位圖元文件來進行操作。設(shè)備環(huán)境類CDC及其派生類如圖5.1.1所示。CDCCClientDCCPaintDCCWindowDC
圖5.1.1CDC與其子類繼承圖
5.2繪圖程序
5.2.1CDC基類
CDC類是其它DC類的基類,CDC類封裝了使用設(shè)備環(huán)境的各種圖形設(shè)備接口(GDI)函數(shù),它用于定義一個設(shè)備環(huán)境對象,并提供了在顯示器、打印機和窗口的客戶區(qū)域上畫圖的方法。
1、在視圖類的OnDraw()函數(shù)中繪圖
在視圖類的OnDraw函數(shù)中繪圖時,直接使用OnDraw()函數(shù)中的CDC形參指針pDC,調(diào)用它的函數(shù)進行繪圖:
例5.1繪制矩形與文本
(1)創(chuàng)立一個單文檔應(yīng)用程序,名為:顯示繪圖
(2)在視圖類的實現(xiàn)文件“顯示繪圖
View.cpp〞的OnDraw函數(shù)中加如下代碼:voidCMyView::OnDraw(CDC*pDC){CMyDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);圖5.2.1繪制矩形和文本//選擇畫刷,淺灰色畫刷,見表5.2
pDC->SelectStockObject(LTGRAY_BRUSH);
CRectrect(10,10,200,70);//定義一個矩形pDC->Rectangle(rect);//繪制一個矩形pDC->TextOut(20,80,\我們會編制圖形程序了!\//繪制文本pDC->TextOut(20,100,〞努力學好VisualC++!〞);}
3)編譯運行,結(jié)果如圖5.2.1所示。
說明:SelectStockObject()該函數(shù)檢索預(yù)定義的備用筆、刷子、字體或者調(diào)色板的句柄。參數(shù):LTGRAY_BRUSH:亮灰色畫筆;BLACK_BRUSH黑色畫筆;NULL_BRUSH:空畫筆(相當于HOLLOW_BRUSH);WHITE_BRUSH:白色畫筆;BLACK_PEN:黑色鋼筆;
2、在視圖類的一般函數(shù)中繪圖
2
例5.2在鼠標放下函數(shù)WM_LBUTTONDOWN函數(shù)中繪圖(1)創(chuàng)立一個單文檔應(yīng)用程序,名為:一般函數(shù)繪圖
(2)利用MFCClassWizard將鼠標放下WM_LBUTTONDOWN消息映射到視圖類CMyView中,并添加代碼:
voidCMyView::OnLButtonDown(UINTnFlags,CPointpoint){//定義一個矩形
CRectrect(0,0,100,100);
//GetDC檢索整個屏幕的設(shè)備上下文環(huán)境
CDC*pDC=GetDC();
pDC->Rectangle(rect);//繪制矩形ReleaseDC(pDC);//釋放pDC空間
CView::OnLButtonDown(nFlags,point);}
(3)編譯運行,鼠標點擊窗口,出現(xiàn)圖5.2.2在OnLButtonDown函數(shù)中繪圖圖5.2.2所示的矩形。
5.2.2CPaintDC類
CPaintDC對象代表了一個窗口的繪圖畫面,主要用來繪圖。它可以用來處理來自Windows的WM_PAINT消息。改變窗口大小或移動覆蓋在窗上的窗口或?qū)υ捒驎r,Windows會發(fā)送WM_PAINT消息以通知客戶區(qū)的變動,而WM_PAINT消息的處理是在OnPaint()消息處理函數(shù)中進行的。
例5.3在WM_PAINT消息函數(shù)中繪圖
(1)創(chuàng)立一個單文檔的應(yīng)用程序,名為:繪圖
(2)利用MFCClassWizard將WM_PAINT消息映射到視圖類(View)中,并添加代碼:voidCMyView::OnPaint(){//CPaintDCdc(this);
//調(diào)用MoveTo函數(shù),定點到點(10,10)dc.MoveTo(10,10);
//調(diào)用LineTo函數(shù),畫線到點(100,100)dc.LineTo(100,100);//畫線
//調(diào)用畫橢圓函數(shù)Ellipse畫橢圓
dc.Ellipse(120,120,160,160);}
(3)編譯運行,結(jié)果見5.2.3所示畫直線圖5.2.3運行結(jié)果
5.2.3CClientDC類
CClientDC對象用來自動處理對描述窗口的客戶程序區(qū)域的設(shè)備環(huán)境進行調(diào)用和釋放。在CClientDC對象創(chuàng)立時自動調(diào)用GetDC(),在撤銷時將自動調(diào)用ReleaseDC()。
3
例5.4在客戶區(qū)畫一條直線
(1)創(chuàng)立一個單文檔的應(yīng)用程序,名為:畫直線(2)利用MFCClassWizard將鼠標放下WM_LBUTTONDOWN消息映射到視圖類CMyView中,并添加代碼:
voidCMyView::OnLButtonDown(UINTnFlags,CPointpoint){CClientDCdc(this);
CRectrect;//定義一個矩形。//取得客戶區(qū)矩形區(qū)域GetClientRect(
//調(diào)用MoveTo,定點到客戶區(qū)的左上角
dc.MoveTo(rect.left,rect.top);
//調(diào)用LineTo函數(shù),畫線到客戶區(qū)的右下角
dc.LineTo(rect.right,rect.bottom);圖5.2.4繪制一條直線}
(3)編譯運行,鼠標左鍵點擊窗口任一點,便在窗口上畫一條直線,如圖5.2.4所示。
5.3圖形設(shè)備接口(GDI)對象
GDI(GraphicDeviceInterface)對象與設(shè)備環(huán)境對象的關(guān)系,類似于筆和紙的關(guān)系。也就是說,GDI提供了用于在DC上畫圖的繪圖工具。MFC的GDI中包含了各種繪圖類并提供各類的繪圖函數(shù)即定義了若干種對于Windows的繪圖工具的對象,該類的繼承關(guān)系如圖5.3.1所示;GDI中包含的各種繪圖類有一個共同的抽象基類CGdiObject,具體如表5.1所示:CGdiObjectCBitmapCBrushCFontCPaletteCPenCRgn圖5.3.1MFC的GDI類繼承圖
1、使用GDI對象
選擇GDI對象進行繪圖時,一般要遵循以下步驟:
(1)定義一個GDI對象(如CPen、CBrush對象),然后用相應(yīng)的函數(shù)(如CreatePen、CreateSolidBrush)創(chuàng)立此GDI對象。但要注意;有些GDI派生類的構(gòu)造函數(shù)允許用戶提供足夠的信息,從而一步即可完成對象的創(chuàng)立任務(wù),這些類有CPen、CBrush。
(2)將構(gòu)造的GDI對象選入當前設(shè)備壞境中,但不要忘掉將原來的GDI對象保存起來。(3)繪圖終止后,恢復(fù)當前設(shè)備環(huán)境中原來的GDI對象。2、庫存的GDI對象
除了自定義的GDI對象外,Windows還包含了一些預(yù)定義的庫存GDI對象。由于它們是Windows系統(tǒng)的一部分,因此用戶用不著刪除它們。CDC的成員函數(shù)
4
SelectStockObject可以把一個庫存對象選入當前設(shè)備環(huán)境中,并返回原先被選中的對象指針,同時使原先被選中的對象從設(shè)備環(huán)境中分開出來。
函數(shù)SelectStockObject可選用的庫存GDI對象類型可以是表5.2所示值之一。
表5.1MFC的GDI類
類名說明CBitmap“位圖〞是一種位矩陣,每一個顯示像素都對應(yīng)于其中的一個或多個位,用戶可以
利用位圖來表示圖象,也可以利用它來創(chuàng)立畫刷
CBrush“畫刷〞定義了一種位圖形式的像素,利用它可對區(qū)域內(nèi)部填充顏色或樣式CFont“字體〞是一種具有某種風格和尺寸的所有字符的完整集合,它往往
被當做資源存于磁盤中,其中有一些還依靠于某種設(shè)備
CPalette“調(diào)色板〞是一種顏色映射接口,它允許應(yīng)用程序在不干擾其它應(yīng)用
程序的前提下,充分利用輸出設(shè)備的顏色描繪能力
CPen“畫筆〞是一種用于畫線及繪制有形邊框的工具,用戶可以指定它的
顏色及寬度,并且可以指定它實線、點線或虛線等
CRgn“區(qū)域〞是由多邊形、橢圓或二者組合形成的一種范圍,可以利用它
來進行填充、裁剪以及鼠標點中測試等
表5.2函數(shù)SelectStockObject可選用的庫存GDI對象類型值類型值含義
BLACK_BRUSH黑色畫刷
DKGRAY_BRUSH深灰色畫刷GRAY_BRUSH灰色畫刷HOLLOW_BRUSH中空畫刷LTGRAY_BRUSH淺灰色畫刷NULL_BRUSH空畫刷WHITE_BRUSH白色畫刷BLACK_PEN黑色畫筆NULL_PEN空畫筆
WHITE_PEN白色畫筆DEVICE_DEFAULT_FONT設(shè)備默認字體SYSTEM_FONT系統(tǒng)字體
5.3.1畫筆CPen類
CPen類封裝了一個WindowsGDI畫筆,并且提供了用于操作CPen對象的若干方法。CPen類用來決定畫線的風格和顏色。在使用畫筆之前,首先必需構(gòu)造畫筆對象,有2種方法:
(1)構(gòu)造和初始化對象都在帶參數(shù)的構(gòu)造函數(shù)中一步完成,如:生成顏色為綠色,寬度為2個像素的實心畫筆:CPennewPen(PS_SOLID,2,RGB(0,255,0));
5
TypedefstructtagSIZE
{intcx;//水平大小(表示矩形的寬度)intcy;//垂直大小(表示矩形的高度)}SIZE;
typedefstructtagRECT
{LONGleft;//矩形左上角點的x坐標LONGtop;//矩形左上角點的y坐標LONGright;//矩形右下角點的x坐標LONGbottom;//矩形右下角點的y坐標}RECT;
1、CPoint,CSize和CRect類的構(gòu)造函數(shù)
CPoint類帶參數(shù)的常用構(gòu)造函數(shù)原型如下:
CPoint(intinitX,intinitY);
CPoint(POINTinitPt);
參數(shù):
initX和initY分別用于指定CPoint的成員x和y的值。
initPt用于指定一個POINT結(jié)構(gòu)或CPoint對象來初始化CPoint的成員。
CSize類帶參數(shù)的常用構(gòu)造函數(shù)原型如下:
CSize(intinitCX,intinitCY);CSize(SIZEinitSize);
參數(shù):
initCX和initCY用于分別設(shè)置CSize的cx和cy成員。
initSize用于指定一個SIZE結(jié)構(gòu)或CSize對象來初始化CSize的成員。
CRect類帶參數(shù)的常用構(gòu)造函數(shù)原型如下:
CRect(intl,intt,intr,intb);CRect(constRECTCRect(LPCRECTlpSrcRect);CRect(POINTpoint,SIZEsize);
CRect(POINTtopLeft,POINTbottomRight);
參數(shù):
l,t,r,b分別用于指定CRect的left,top,right和bottom成員的值。
srcRect、lpSrcRect分別用一個RECT結(jié)構(gòu)或指針來初始化CRect的成員。Point用于指定矩形的左上角位置。Size用于指定矩形的長度和寬度。topLeft和bottomRight分別用于指定CRect的左上角和右下角的位置。
2、CRect類的常用操作
由于一個CRect類對象包含用于定義矩形左上角和右下角點的成員變量,因此在傳遞LPRECT、LPCRECT或RECT結(jié)構(gòu)作為參數(shù)的任何地方,都可以使用CRect對象來代替。當構(gòu)造一個CRect時,要使它符合規(guī)范。也就是說,使其left小于right,top小于bottom;例如,若左上角為(20,20),而右下角為(10,10),那么定義的這個矩形就
11
不符合規(guī)范。一個不符合規(guī)范的矩形,CRect的大量成員函數(shù)都不會有正確的結(jié)果。因此,往往使用CRect::NormalizeRect函數(shù)使一個不符合規(guī)范的矩形貼合規(guī)范。CRect類的操作函數(shù)有好多,這里只介紹矩形的擴大、縮小以及2個矩形的“并〞和“交〞操作,更多的常用的成員函數(shù)如表5.6所示:
表5.6CRect類常用的成員函數(shù)
成員函數(shù)功能說明intWidth()const;返回矩形的寬度intHeight()const;返回矩形的高度CSizeSize()const;返回矩形左下角的點坐標CPoint假使一個矩形的上、左、下和右邊的值都等于0,則返回TRUEBOOLPtInRect(POINTpoint)const;假使點point位于矩形中(包括點在矩形的邊上)則返回TRUE
voidSetRect(intx1,inty1,intx2,inty2);將矩形的各邊設(shè)為指定的值,左上角點為(x1,y1),
右下角點為(x2,y2)
voidSetRectEmpty();將矩形的所有坐標設(shè)置為0
voidNormalizeRect();使矩形符合規(guī)范如:左上角為(10,10),右下角為(20,20)
是規(guī)范的。而左上角為(20,20),右下角為(10,10)是不規(guī)范的。
voidOffsetRect(intx,inty);移動矩形,水平和垂直移動量分別由x、y或point、size的2個
成員來指定
voidOffsetRect(POINTpoint);voidOffsetRect(SIZEsize);
成員函數(shù)InflateRect和DeflateRect用于擴大和縮小一個矩形。由于他們的操作是相互的,也就是說,若指定InflateRect函數(shù)的參數(shù)為負值,那么操作的結(jié)果是縮小矩形,因此以下只給出InflateRect函數(shù)的原型:voidInflateRect(intx,inty);voidInflateRect(SIZEsize);
voidInflateRect(LPCRECTlpRect);voidInflateRect(intl,intt,intr,intb);
說明:
1、x用于指定擴大CRect左、右邊的數(shù)值2、y用于指定擴大CRect上、下邊的數(shù)值
3、size中的cx成員指定擴大左、右邊的數(shù)值,cy成員指定擴大上、下邊的數(shù)值4、lpRect的各個成員用于指定擴大每一邊的數(shù)值
12
5、l,t,r,b分別用于指定擴大CRect左、上、右、下邊的數(shù)值
由于InflateRect是通過將CRect的邊向遠離其中心的方向移動來擴大的,因此對于前2個重載函數(shù)來說,CRect的總寬度被增加了2倍的x或cx,總高度被增加了2倍的y或cy。
成員函數(shù)IntersectRect和UnionRect分別用于將2個矩形進行相交和合并,當結(jié)果為空時返回FALSE,否則返回TRUE。他們的原型如下:BOOLIntersectRect(LPCRECTlpRect1,LPCRECTlpRect2);BOOLUnionRect(LPCRECTlpRect1,LPCRECTlpRect2);參數(shù):lpRect和lpRect2用于指定操作的2個矩形,例如:
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));
例5.8改變窗口大小時,窗口會以三種不同的顏色顯示窗口背景。1)建一個單文檔SDI應(yīng)用程序,名為:顯示背景顏色
2)在視圖的頭文件View.h的public下定義矩形窗口對象:CRectr;3)在視圖的執(zhí)行文件View.cpp前面加顏色預(yù)定義:……….
#endif
#defineREDRGB(255,0,0)//紅色#defineGREENRGB(0,255,0)//綠色#defineBLUERGB(0,0,255)//蘭色#defineBLACKRGB(0,0,0)//黑色值
///////////////////////////////////////////////////////////////////////////////CMyView
IMPLEMENT_DYNCREATE(CMyView,CView)BEGIN_MESSAGE_MAP(CMyView,CView)……….
4)在OnDraw()函數(shù)添加如下代碼:voidCMyView::OnDraw(CDC*pDC){CMyDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);
GetClientRect(r);//獲取窗口大小
if(r.right>750//充填窗口背景紅色elseif(r.right>500//充填窗口背景綠色else
if(r.rightFillSolidRect(r,BLUE);//充填窗口背景藍色)else
pDC->FillSolidRect(r,BLACK);//充填窗口背景黑色}
5)運行后出現(xiàn)的窗口是紅色,最小是藍色,中間是綠色。
5.6顏色和顏色對話框
一個彩色像素的顯示需要顏色空間支持,MFC中的CDC類使用的是RGB顏色空間,即選用紅(R)、綠(G)、藍(B)3種基色分量,通過對這3種基色不同比例的混合,可以得到不同彩色效果。在MFC中使用COLORREF數(shù)據(jù)類型來表示一個32位的RGB顏色,它可以用16進制表示:OxOObbggrr。其中:rr,gg,bb分別表示紅、綠、藍各種顏色分量的16進制值,最大為Oxff。在具體操作RGB顏色時,還可使用以下宏操作:
GetBValue獲得32位RGB顏色值中的藍色分量GetGValue獲得32位RGB顏色值中的綠色分量GetRValue獲得32位RGB顏色值中的紅色分量
RGB將指定的R,G,B分量值轉(zhuǎn)換成一個32位的RGB顏色值
MFC的CColorDialog類為應(yīng)用程序提供了“顏色選擇通用〞對話框,如圖5.6.1所示。CColorDialog類具有以下的構(gòu)造函數(shù):CColorDialog(COLORREFclrInit=0,
DWORDdwFlags=0,
CWnd*pParentWnd=NULL);
參數(shù):
clrInit用于指定選擇的默認顏色值,若此值沒有指定,
則為RGB(0,0,0)(黑色)
pParentWnd用于指定對話框的父窗口指針
dwFlags用于表示定制對話框外觀和功能的系列標志
參數(shù),它可以是以下值之一或“|〞組合:CC_ANYCOLOR在基本顏色單元中列出所有可得
到的顏色
CC_FULLOOEN顯示所有的顏色對話框界面。圖5.6.1“顏色選擇通用〞對話框(調(diào)色板)
若此標志沒有被設(shè)定,則用
戶單擊“規(guī)定自定義顏色〞按鈕才能顯示出定制顏色界面
CC_PREVENTFULLOPEN禁用“規(guī)定自定義顏色〞按鈕CC_SHOWHELP在對話框中顯示“幫助〞按鈕
CC_SOLIDCOLOR在基本顏色單元中只列出所得到的純色。
當對話框“OK〞退出(即DoModal返回IDOK)時,可調(diào)用以下成員獲得相應(yīng)的顏色:COLORREFGetColor()const;//返回用戶選擇的顏色
14
voidSetCurrentColor(COLORREFclr);//強制使用clr作為當前選擇的顏色staticCOLORREF*GetSavedCustomColors();//返回用戶自己定義的顏色
例5.9使用顏色對話框,可在窗口中隨意畫圖、更改顏色及畫筆寬度、填充顏色等。如何進行顏色選取,MFC為我們封裝了一個名為CColorDialog的類,這個類將使我們輕松地完成顏色選取,彈出顏色對話框,“自定義顏色〞等。(1)建一個單文檔SDI應(yīng)用程序,名為:工具條繪圖
(2)在查看的下面建菜單:ID為:ID_COLORS_MENU,標題為:畫筆((6)在視圖執(zhí)行文件(View.cpp)消息映射開始處加:
//位圖按鈕消息映射函數(shù)
ON_COMMAND_RANGE(ID_BUTTONRED,ID_BUTTON_PENWILD,OnPenChioce)(7)在視圖Wiew.h頭文件的public:下加成員變量和函數(shù):CPointStartPt,EndPt;//用于記錄畫筆的起始位置和終點位置CPenPen;//畫筆對象COLORREFm_colors;//顏色對象
CRectRect;//矩形對象即窗口大小intPenStarte;//畫筆狀態(tài)
DWORDPenStyle;//用于存儲畫筆風格
15
intMyPenWild;//用于設(shè)置畫筆的寬度
voidFillMyRect();//充填顏色
voidMyColorsDlg();//用以完成顏色選取對話框的實現(xiàn)
voidWildDlg();//用于完成選擇畫筆寬度對話框的初始化(8)在視圖View.cpp的開頭部分加:#endif
#defineREDRGB(255,0,0)#defineGREENRGB(0,255,0)#defineBLUERGB(0,0,255)在下面的構(gòu)造函數(shù)里這樣加:CMyView::CMyView()
:PenStarte(0)//此處的“:〞表示其后面列表稱為成員初始化列表。畫筆狀態(tài)初始為0{MyPenWild=1;//用于設(shè)置畫筆的寬度,初始寬度為1
PenStyle=PS_SOLID;//用于存儲畫筆風格,初始風格為實線,見表5.3}
(9)在MainFrm.h的public:里加:
CToolBar*m_pColorToolbar;//定義顏色工具條類指針(10)在MainFrm.cpp里的構(gòu)造函數(shù)里這樣加:
CMainFrame::CMainFrame():m_pColorToolbar(0)
{//TODO:addmemberinitializationcodehere}
說明
“:〞表示其后面列表稱為成員初始化列表。這里表示:顏色工具條類指針對象初始狀態(tài)為0
(11)為該項目增加一對話框:Insert?Resource(或Ctrl+R)?Dialog?New1)將對話框本身的ID改為:IDD_DIALOG_WILD2)拖過來EditBox改ID為:ID_EDIT_WILD
注意:屬性General里置好Visible和TabStop
3)拖來一個Spin旋轉(zhuǎn)按鈕控件放在EDIT右邊;改ID為:IDC_SPIN_WILD同樣置好Visible和TabStop,在Styles下:Orientation(控件放置方向)欄置Vertical(垂直),在Alignment(控件在伙伴窗口的位置安排)欄置好Right(右邊),右邊置好Autobuddy(自動選擇前一個窗口作為伙伴窗口)和Setbuddyinteger(使控件設(shè)置伙伴窗口,數(shù)值可十進制或十六進制)及Arrowkeys(當按下向上和向下方向鍵時,也能增加或減少)(12)給對話框加類
View?ClassWizard?AddClass(或你雙擊對話框,問你要加新類嗎,回復(fù):“是〞就行了)。在出現(xiàn)的對話框的Name欄寫:CPENWILDDLG,基類:CDialog;下面保證是IDD_DIALOG_WILD。
為對話框類上的控件加成員變量:
IDC_EDIT_WILDintm_penwild//整型IDC_EDIT_WILDCEditm_cpenwild//編輯類型
IDC_SPIN_WILDCSpinButtonCtrlm_cwildspin//旋轉(zhuǎn)按鈕
16
注:可在對話框類PENWILDDLG.cpp的DDX下面加:DDV_MinMaxInt(pDX,m_penwild,1,100);
在視圖頭文件View.h里加:#include“PENWILDDLG.h〞
(13)加映射消息及代碼:
1)將菜單項消息映射ID_COLORS_MENU映射在CMainFrame主框架中并加代碼:voidCMainFrame::OnColorsMenu()
{if(0==m_pColorToolbar)
{m_pColorToolbar=newCToolBar;//為顏色工具條開拓一片單元
m_pColorToolbar->Create(this);//建一個Windows工具條并將其連接到此CTollBar中m_pColorToolbar->LoadToolBar(IDR_MYTOOLBAR);//加載由資源編輯器創(chuàng)立的工具
//條資源,我們建好的這個工具條
m_pColorToolbar->EnableDocking(CBRS_ALIGN_ANY);DockControlBar(m_pColorToolbar);}}
說明:
EnableDocking(CBRS_ALIGN_ANY):可使控制條停靠在父窗口的任何一邊
參數(shù):指定框架窗口的哪一邊可用做控制條的??奎c,可以是以下值中一個或多個:
CBRS_ALIGN_TOP允許??吭诳蛻魠^(qū)的頂部CBRS_ALIGN_BOTTOM允許??吭诳蛻魠^(qū)的底部CBRS_ALIGN_LEFT允許??吭诳蛻魠^(qū)的左邊CBRS_ALIGN_RIGHT允許??吭诳蛻魠^(qū)的右邊CBRS_ALIGN_ANY允許??吭诳蛻魠^(qū)的任何一邊
CBRS_ALIGN_MULTI允許一個小框架窗口中存在多個浮動控制條
2)在主框架為ID_COLORS_MENU加映射消息UPDATE_COMMAND_UI(命令屬性)voidCMainFrame::OnUpdateColorsMenu(CCmdUI*pCmdUI){if(0==m_pColorToolbar)pCmdUI->SetCheck(FALSE);elseif(m_pColorToolbar->IsWindowVisible()==TRUE)pCmdUI->SetCheck(TRUE);else}
pCmdUI->SetCheck(FALSE);
說明:
1、SetCheck:設(shè)置命令用戶界面元素為恰選中擇狀態(tài),可用于工具條按鈕(不確定狀態(tài))和菜單項。參數(shù):0:即FALSE設(shè)置為不選擇;1:即TRUE設(shè)置為選擇;2:設(shè)置為不確定2、IsWindowVisible:獲得給定窗口的可視狀態(tài)。函數(shù)原型:BOOLIsWindowVisible(HWNDhWnd);參數(shù);hWnd:被測試窗口的句柄。
3、CCmdUI:僅用于ON_UPDATE_COMMAND(不是命令)處理函數(shù)中,一般用來設(shè)置特性等用。
17
如:pCmdUI->Enable(false);是屏蔽菜單
3)為鼠標按下消息(視圖類中View)加代碼:
voidCMyView::OnLButtonDown(UINTnFlags,CPointpoint){CRectr;
if(PenStarte==0)
{StartPt.x=point.x;//起始位置的x坐標StartPt.y=point.y;//起始位置的y坐標}
elseif(PenStarte==1){Rect.left=point.x;//窗口左x坐標
Rect.top=point.y;//窗口頂y坐標}
else{}
CView::OnLButtonDown(nFlags,point);}
4)為鼠標抬起消息(視圖類中View)加代碼:
voidCMyView::OnLButtonUp(UINTnFlags,CPointpoint){if(PenStarte==0)//畫筆狀態(tài)為0StartPt.x=-1;//起始位置xelseif(PenStarte==1)//畫筆狀態(tài)為1
{
Rect.right=point.x;Rect.bottom=point.y;CDC*pDC=GetDC();
CPenRectPen(PS_DASH,1,m_colors);
pDC->SelectObject(//選擇一個GDI繪圖對象pDC->MoveTo(Rect.left,Rect.top);pDC->LineTo(Rect.right,Rect.top);pDC->LineTo(Rect.right,Rect.bottom);pDC->LineTo(Rect.left,Rect.bottom);pDC->LineTo(Rect.left,Rect.top);
ReleaseDC(pDC);PenStarte=0;//畫筆狀態(tài)置0}
CView::OnLButtonUp(nFlags,point);}
說明:
1、GetDC:檢索一指定窗口的客戶區(qū)域或整個屏幕的顯示設(shè)備上下文的句柄;以后可以在GDI函數(shù)中用該句柄繪圖。函數(shù)原型為:GetDC(HWNDhWnd);
18
參數(shù):hWnd為檢索的窗口的句柄,若為NULL,則檢索整個屏幕的設(shè)備上下文環(huán)境。2、CPenRectPen(PS_DASH,1,m_colors):定義畫筆對象;虛線、寬度為1、含有顏色值。函數(shù)原型為:CPen(intnPenStyle,intnWidth,COLORREFcrColor)參數(shù):nPenSyle指定畫筆風格;
nWidth指定畫筆的寬度;crColor包含畫筆的RGB顏色值;
3、SelectObject:將一個對象選入設(shè)備環(huán)境中,新選對象竟替代同一類型的從前對象,函數(shù)原型為:CPen*SelectObjiect(CPen*pPen)
參數(shù):pPen指向一個要選擇的CPen對象的指針
4、MoveTo:將當前位置移動到x和y參數(shù)(或point參數(shù)MoveTo(POINTpoint))指定的點,函數(shù)原型為:MoveTo(intx,inty)
參數(shù):x新位置的規(guī)律x坐標;
y新位置的規(guī)律y坐標;
5、LineTo:從當前位置到由x和y(或point)指定的端點(但不包括此端點)畫線,函數(shù)原型為:BOOLLineTo(intx,inty)
參數(shù):x線段端點的規(guī)律x坐標;
y線段端點的規(guī)律y坐標;
6、ReleaseDC:釋放設(shè)備上下文環(huán)境(DC)供其他應(yīng)用程序使用。函數(shù)的效果與設(shè)備上下文環(huán)境類型有關(guān)。它只釋放公用的和設(shè)備上下文環(huán)境,對于類或私有的則無效,函數(shù)原型為:intReleaseDC(HWNDhWnd,HDChdc);參數(shù):
hWnd:指向要釋放的設(shè)備上下文環(huán)境所在的窗口的句柄。hdc:指向要釋放的設(shè)備上下文環(huán)境的句柄。
5)為鼠標移動消息(視圖類中View)加代碼:
voidCMyView::OnMouseMove(UINTnFlags,CPointpoint){CClientDCdc(this);dc.SelectObject(
EndPt.x=point.x;//終點x坐標EndPt.y=point.y;//終點y坐標
if(StartPt.x>=0)//起始x坐標大于0
{dc.MoveTo(StartPt.x,StartPt.y);//從起點畫線}
dc.LineTo(EndPt);//到指定的端點畫線StartPt.x=EndPt.x;//端點x再當起點xStartPt.y=EndPt.y;//端點y再當起點y}
CView::OnMouseMove(nFlags,point);
說明:
CClientDCdc(this):構(gòu)造CClientDC對象,則設(shè)備環(huán)境的映射區(qū)域限于客戶區(qū)域,不能在客戶區(qū)域外繪圖。原點(0,0)在客戶區(qū)左上角。this是一個指向CMyView對象的指針。假使創(chuàng)立
19
CWindowDC對象,則設(shè)備環(huán)境的映射區(qū)域為整個窗口(包括標題欄、狀態(tài)欄、窗口邊框等)。原點(0,0)在整個窗口的左上角。注意:
1、視圖窗口沒有非客戶區(qū)域2、視圖窗口覆蓋在框架窗口之上
6)完成自定義充填函數(shù)(View)加代碼(全用手寫):voidCMyView::FillMyRect(){CDC*pDC=GetDC();CBrushBrush;//畫刷
Brush.CreateSolidBrush(m_colors);//用指定實顏色初始化畫刷。參數(shù):畫刷顏色pDC->FillRect(}
ReleaseDC(pDC);//釋放設(shè)備上下文環(huán)境(DC)供其他應(yīng)用程序使用
說明:
FillRect(//顏色對話框類對象if(IDOK==dlg.DoModal()){m_colors=dlg.GetColor();
Pen.DeleteObject();//刪除GDI對象,對象使用的所有系統(tǒng)資源都會被釋放Pen.CreatePen(PenStyle,1,m_colors);}}
說明:
1、GetColor:在調(diào)用DoModal之后調(diào)用,用以獲取用戶選中顏色的信息。返回值:一個COLORREF值,其中包括顏色對話框中選中的顏色的RGB信息。
2、CreatePen(PenStyle,1,m_colors):用指定風格、寬度和顏色初始化一支畫筆,函數(shù)原型為:BOOLCreatePen(intnPenStyle,intnWidth,COLORREFcrColor);
8)完成自定義選擇畫筆寬度對話框的初始化(View)函數(shù)代碼(全用手寫):voidCMyView::WildDlg(){CPENWILDDLGDlg;if(IDOK==Dlg.DoModal())MyPenWild=Dlg.m_penwild;}
9)完成自定義按鈕的消息映射(View)函數(shù)加代碼(全用手寫):
20
voidCMyView::OnPenChioce(UINTnID){switch(nID)
{caseID_BUTTONRED:m_colors=RED;break;
caseID_BUTTONGREEN:m_colors=GREEN;break;caseID_BUTTONBLUE:m_colors=BLUE;break;caseID_BUTTONDASH:PenStyle=PS_DASH;break;caseID_BUTTONSOLID:PenStyle=PS_SOLID;break;caseID_BUTTONRECT:PenStarte=1;break;caseID_BUTTONFILL:FillMyRect();break;
caseID_BUTTON_PENCOLORS:MyColorsDlg();break;caseID_BUTTON_PENWILD:WildDlg();break;}
Pen.DeleteObject();
Pen.CreatePen(PenStyle,MyPenWild,m_colors);}
(14)編譯運行,如圖5.6.3和5.6.4所示。
圖5.6.3畫線和填充色、彈出調(diào)色板設(shè)置顏色
圖5.6.4畫筆寬度為20繪制的粗線
21
5.7多種圖形的繪制
在實際工作中,經(jīng)常要遇到繪制各種不同圖形的狀況,無論繪制什么圖形,尋常都需要創(chuàng)立畫筆和畫刷,然后調(diào)用CDC類中的繪圖函數(shù)。這些繪圖函數(shù)包括畫點、線、矩形、多邊形、圓弧、橢圓、扇形、曲線等。下面我們只通過3個實例,了解它們的繪制方法。
例5.10繪制2個不同填充形式的五角星(1)建一個單文檔的應(yīng)用程序,名為:五角星
(2)在視圖類的實現(xiàn)文件(View.cpp)Draw函數(shù)中加以下代碼:voidCMyView::OnDraw(CDC*pDC){
CMyDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);
POINTpt[5]={{47,10},{30,90},{90,35},{10,30},{75,85}};//五角星的五個點CBrushbrush(HS_FDIAGONAL,RGB(255,0,0));//向上點斜線,紅色CBrush*oldbrush=pDC->SelectObject(pDC->SetPolyFillMode(ALTERNATE);pDC->Polygon(pt,5);for(inti=0;iSetPolyFillMode(WINDING);
pDC->Polygon(pt,5);
pDC->SelectObject(oldbrush);brush.DeleteObject();}
(3)編譯運行,見圖5.7.1所示。圖5.7.1繪制五角星及填充色
說明:
SetPolyFillMode(ALTERNATE):是CDC類的一個成員函數(shù),用于設(shè)置填充模式,它的參數(shù)可以是ALTERNATE和WINDING。對於ALTERNATE方式,可以設(shè)想從一個無窮大的封閉區(qū)域內(nèi)部的點畫線,只有假想的線穿過了奇數(shù)條邊界限時,才填入封閉區(qū)域。這就是填入了星的角而中心沒被填入的原因。五角星的例子使得WINDING方式看起來比實際上更簡單一些。在繪制單個的多邊形時,大多數(shù)狀況下,WINDING方式會填入所有封閉的區(qū)域。但是也有例外。在WINDING方式下要確定一個封閉區(qū)域是否被填入,仍舊可以設(shè)想從那個無窮大的區(qū)域畫線。假使假想的線穿過了奇數(shù)條邊界限,區(qū)域就被填入,這和ALTERNATE方式一樣。假使假想的線穿過了偶數(shù)條邊界限,則區(qū)域可能被填入也可能不被填入。假使一個方向的邊界限數(shù)不相等,就填入?yún)^(qū)域。
例5.11繪制一條由點連起的曲線1、建一個單文檔的應(yīng)用程序,繪曲線
2、在Viwe.cpp的OnDraw(CDC*pDC)函數(shù)里加如下代碼:voidCMyView::OnDraw(CDC*pDC)
22
{CMyDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);
intdata[20]={19,21,32,40,41,39,42,35,33,23,21,20,24,11,9,19,22,32,40,42};CRectrc;
GetClientRect(rc);//是取得客戶區(qū)矩形區(qū)域
//下面是通過朝它的中心移動邊,以縮小CRect。函數(shù)原型是voidDeflateRect(intx,inty)。//參數(shù)x指定要向左或向右移動CRect邊的數(shù)量,y指向要向上或向下移動CRect邊的數(shù)量。
rc.DeflateRect(50,50);
intgridXnums=10;//定義網(wǎng)格變量x是10intgridYnums=8;//定義網(wǎng)格變量y是8intdx=rc.Width()/gridXnums;//寬度/xintdy=rc.Height()/gridYnums;//高度/y
//下面這條語句是矩形構(gòu)造函數(shù)CRect::CRect(intl,intt,intr,intb)
//參數(shù):l指定CRect的左邊位置,t指定CRect的上邊位置,r指定CRect的右邊位置,//b指定CRect的底邊位置。這里是:左邊位置,上邊位置,右邊位置(左邊位置+寬度*//網(wǎng)格變量10),底邊位置(上邊位置+高度*網(wǎng)格變量8),實際是畫筆行走范圍。
CRectgridRect(rc.left,rc.top,rc.left+dx*gridXnums,rc.top+dy*gridYnums);
//下面這條語句是定義畫筆對象CPen::Cpen(intnPenStyle,intnWidth,COLORREFcrColor)//參數(shù):nPenStyle指定畫筆風格;nWidth指定畫筆寬度;crColor包含畫筆的RGB顏色值
CPengridPen(0,0,RGB(0,100,200));
CPen*oldPen=pDC->SelectObject(for(inti=0;iMoveTo(gridRect.left+i*dx,gridRect.bottom);//x方向開始畫pDC->LineTo(gridRect.left+i*dx,gridRect.top);//到端點}
for(intj=0;jMoveTo(gridRect.left,gridRect.top+j*dy);//y方向開始畫pDC->LineTo(gridRect.right,gridRect.top+j*dy);//到端點}
pDC->SelectObject(oldPen);gridPen.Detach();
gridPen.CreatePen(0,0,RGB(0,0,200));pDC->SelectObject(CBrushgridBrush(RGB(255,0,0));
CBrush*oldBrush=pDC->SelectObject(
POINTptRect[4]={{-3,-3},{-3,3},{3,3},{3,-3}},ptDraw[4];intdeta;
POINTpt[256];intnCount=20;
deta=gridRect.Width()/nCount;
23
for(i=0;iPolygon(ptDraw,4);}
pDC->Polyline(pt,nCount);
pDC->SelectObject(oldPen);pDC->SelectObject(oldBrush);}
(3)編譯運行,見圖5.7.2所示。
圖5.7.2運行結(jié)果
例5.12課程成績分布直方圖
表示一個班級某門課程的成績分布,用一個直方圖來反映90的5個分數(shù)段的人數(shù),它需要繪制5個矩形,相鄰矩形的填充樣式還要有所區(qū)別,并且還需要顯示各分數(shù)段的人數(shù)。1、建一個單文檔的應(yīng)用程序名為:直方圖
2、為視圖類添加一個自定義的void類型成員函數(shù)(ClassView->右鍵單擊CMyView->…):DrawScore(CDC*pDC,float*fScore,intnNum)并加如下代碼:voidCMyView::DrawScore(CDC*pDC,float*fScore,intnNum)//pDC是CDC類指針,fScore是成績數(shù)組指針,nNum是學生人數(shù){intnScoreNum[]={0,0,0,0,0};//各成績段的人數(shù)的初始值//下面是統(tǒng)計各分數(shù)段的人數(shù)
24
for(inti=0;i90分數(shù)段
nScoreNum[nSeg-5]++;//各分數(shù)段計算
}
intnSegNum=sizeof(nScoreNum)/sizeof(int);//計算有多少個分數(shù)段intnNumMax=nScoreNum[0];
for(i=1;iSelectObject(//將brush1選入設(shè)備環(huán)境CPen*oldPen=pDC->SelectObject(//將pen選入設(shè)備環(huán)境CRectrcSeg(rc);
rcSeg.right=rcSeg.left+nSegWidth;//左加寬賦給右CStringstrSeg[]={\CRectrcStr;
for(i=0;iSelectObject(elsepDC->SelectObject(
rcSeg.top=rcSeg.bottom-nScoreNum[i]*nSegHeight-2;//計算每段矩形的高度pDC->Rectangle(rcSeg);if(nScoreNum[i]>0){CStringstr;str.Format(\人\pDC->DrawText(str,rcSeg,DT_CENTER|DT_VCENTER|DT_SINGLELINE);}
rcStr=rcSeg;
25
rcStr.top=rcStr.bottom+2;rcStr.bottom+=20;
pDC->DrawText(strSeg[i],rcStr,DT_CENTER|DT_VCENTER|DT_SINGLELINE);rcSeg.OffsetRect(nSegWidth,0);//右移矩形}
pDC->SelectObject(oldBrush);//恢復(fù)原來的畫刷屬性pDC->SelectObject(oldPen);//恢復(fù)原來的畫筆屬性}
3、在OnDraw(CDC*pDC)函數(shù)中添加以下代碼:voidCMyView::OnDraw(CDC*pDC){CMyDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
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));}
(4)編譯運行,結(jié)果見圖5.7.3所示。
5.8字體CFont類
CFont對象封裝了一種WindowsGDI
字體,并且提供了用于操作CFont對象的若干方法。CFont類用來決定繪圖文本的字體,必需先創(chuàng)立字體,然后將其選進要
進行文本輸出的DC,就可以利用文本輸
出函數(shù)顯示該字體形式的文本內(nèi)容了。圖5.7.3課程成績分布直方圖創(chuàng)立字體由2步完成:
(1)定義一個CFont類的對象,應(yīng)用程序框架會調(diào)用構(gòu)造函數(shù),如:CFontmyFont;(2)調(diào)用CFont類,創(chuàng)立字體函數(shù),從而將CFont對象與Windows的某種字體相關(guān)聯(lián)。
例5.13字體顯示
(1)創(chuàng)立一個單文檔應(yīng)用程序,名為:字體顯示
(2)在視圖類的實現(xiàn)文件(View.cpp)的OnDraw函數(shù)中,添加以下代碼:voidCMyView::OnDraw(CDC*pDC){CMyDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);
pDC->SetBkColor(RGB(240,240,250));//設(shè)置背景顏色pDC->SetTextColor(RGB(255,0,0));//設(shè)置文本顏色intny=260;intndl=40;
26
for(inti=32;i>=20;i-=4){FontOut(pDC,ny,i,ndl);
ndl+=300;}}
(3)添加自定義函數(shù)FontOut()
點擊ClassView開啟項目工作區(qū)->用右鍵單擊CMyView->選擇AddMemberFunction添加一個類型為void名為:FontOut(CDC*pDC,int//定義文本結(jié)構(gòu)TEXTMETRIC變量CFontfont;//定義CFont類對象CStringstr;//創(chuàng)立字體
font.CreateFont(-nPoints,0,dline,0,400,FALSE,
FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,
CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,
DEFAULT_PITCH|
FF_SWISS,\宋體\
//將創(chuàng)立的字體選入內(nèi)存DC,同時暫時擠出并保
//存原字體
CFont*poldfont=(CFont*)pDC->圖5.8.1字體顯示程序運行結(jié)果
SelectObject(
pDC->GetTextMetrics(//獲取文本信息str.Format(\這是%d點陣宋體字\pDC->TextOut(20,nHeight,str);
nHeight-=textM.tmHeight+textM.tmExternalLeading;pDC->SelectObject(poldfont);//恢復(fù)內(nèi)存DC中原有的字體
}
(5)編譯運行,結(jié)果見圖5.8.1所示。
1、字體的屬性和創(chuàng)立
字體的屬性有好多,但其主要屬性有3個:字樣、風格、尺寸。
字樣:是字符書寫和顯示時表現(xiàn)出的特定模式,如:漢字的宋體、楷體、仿宋、黑體、
隸書、幼圓等多種字樣。
風格:主要表現(xiàn)為字體粗細和是否傾斜等特點。
尺寸:是用于指定字符所占區(qū)域的大小,尋常用字符高度來描述,可以取mm或英寸作為
27
單位,但為了直觀起見,也往往采用一種稱為“點〞的單位,一點約折合為1/72英寸。
為了便利用戶創(chuàng)立字體,系統(tǒng)定義一種“規(guī)律字體〞,它是應(yīng)用程序?qū)τ诶硐胱煮w的一種描述方式。在使用規(guī)律字體繪制文字時,系統(tǒng)會采用一種特定的算法把規(guī)律字體映射為最匹配的物理字體(實際安裝在操作系統(tǒng)中的字體)。規(guī)律字體的具體屬性可由LOGFONT結(jié)構(gòu)來描述,下面僅列出最常用到的結(jié)構(gòu)成員。
typedefstructtagLOGFONT
{LONGlfHeight,//字體的規(guī)律高度LONGlfWidth,//字符的平均規(guī)律寬度LONGlfEscapement,//文本行角度LONGlfOrientation,//字符的角度LONGlfWeight,//字體的粗細度BYTElfItalic,//斜體標志BYTElfUnderline,//下劃線標志BYTElfStrikeOut,//刪除線標志
BYTElfCharSet,//字符集,漢字必需為GB2312_CHARSETBYTEnOutPrecision,//字體輸出的結(jié)果和要求的匹配程度BYTEnClipPrecision,//如何剪裁落于剪裁區(qū)之外的字符BYTEnOuality,//字體屬性匹配的確切度BYTEnPitchAndFamily,//字體間距和字體族TCHARlfFaceName[LF_FACESIZE],//字樣名稱//…….}LOGFONT;說明:
在結(jié)構(gòu)成員中:lfHeight表示字符的規(guī)律高度,這里的高度是字符的純高度,當此值>0時,系統(tǒng)將此值映射為實際字體單元格的高度;當=0時,系統(tǒng)將使用默認的值;當SelectObject(position+=cHeight;
29
}
pDC->TextOut(20,position,\時代先鋒\pDC->SelectObject(oldFont);
}
(3)編譯運行,結(jié)果見圖5.8.2所示。
圖5.8.2設(shè)計不同大小字體圖5.8.3字體對話框
2、使用字體對話框
CFontDialog類為我們提供了字體及其文本顏色選擇的通用字體對話框,如圖5.8.3所示。它的構(gòu)造函數(shù)如下:
CFontDialog(LPLOGFONTlplfInitial=NULL,DWORDdwFlags=CF_EFFECTS|
CF_SCREENFONTS,CDC*pdcPrinter=NULL,CWnd*pParentWndNULL);
參數(shù):
lplfInitial:是一個LOGFONT結(jié)構(gòu)指針,用于設(shè)置對話框最初的字體特性;dwFlags:指定選擇字
體的標志;
pdcPrinter:用于表示打印設(shè)備環(huán)境指針;
pParentWnd:用于表示對窗口的父窗口指針。當字體對話框DoModal返回IDOK后,可使用以下的
成員函數(shù):
voidGetCurrentFont(LPLOGFONTlplf);//返回用戶選擇的LOGFONT字體CStringGetFaceName()const;//返回用戶選擇的字體名稱CStringGetStyleName()const;//返回用戶選擇的字體樣式名稱intGetSize()const;//返回用戶選擇的字體大小COLORREFGetColor()const;//返回用戶選擇的文本顏色intGetWeight()const;//返回用戶選擇的字體粗細程度BOOLIsStrikeOut()const;//判斷是否有刪除線BOOLIsUnderline()const;//判斷是否有下畫線B
溫馨提示
- 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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 湖南省常德市澧縣2024-2025學年七年級上學期期末生物學試題(含答案)
- 新時代農(nóng)業(yè)現(xiàn)代化智能種植技術(shù)的創(chuàng)新與發(fā)展戰(zhàn)略
- 新材料研發(fā)及產(chǎn)業(yè)化應(yīng)用合作協(xié)議
- 云計算服務(wù)與安全策略解析
- 《先秦諸子哲學思想比較:大三哲學文化課教案》
- 養(yǎng)殖業(yè)合作飼養(yǎng)及利潤分配協(xié)議
- 電力工程設(shè)計與安裝施工合同
- 智能基金投資管理及銷售協(xié)議
- 烏江自刎的英雄故事征文
- 中小學生科普讀物讀后感
- 西門子S7-1200 PLC應(yīng)用技術(shù)項目教程(第3版) 課件 1.認識S7-1200PLC寬屏-(LAD+SCL)
- 《稅法》(第六版)全書教案電子講義
- 翻斗車司機安全培訓(xùn)
- 計算機軟件配置管理計劃規(guī)范
- 《勞動保障監(jiān)察條例》課件
- 中華人民共和國學前教育法
- 辯論英文課件教學課件
- 2021年廣東省公務(wù)員錄用考試《行測》題(鄉(xiāng)鎮(zhèn)卷)【原卷版】
- 2020年全國中學生生物學競賽聯(lián)賽試題真題(含答案解析)
- 足浴技師與店內(nèi)禁止黃賭毒協(xié)議書范文
- 鐵路專業(yè)基礎(chǔ)知識考試題及答案
評論
0/150
提交評論