用VisualC++生成基本圖形_第1頁
用VisualC++生成基本圖形_第2頁
用VisualC++生成基本圖形_第3頁
用VisualC++生成基本圖形_第4頁
用VisualC++生成基本圖形_第5頁
已閱讀5頁,還剩30頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

3.5用VisualC++生成基本圖形VC++程序需要在屏幕或打印機(jī)上繪圖時,都要調(diào)用GDI(圖形設(shè)備接口)函數(shù)。3.5.1圖形設(shè)備接口(GDI)GDI的工作原理大致如下:首先,Windows提供各種顯示卡及打印機(jī)的驅(qū)動程序;其次,各種GDI函數(shù)會自動參考被稱為設(shè)備環(huán)境的數(shù)據(jù)結(jié)構(gòu),而Windows則自動將設(shè)備環(huán)境結(jié)構(gòu)映射到相應(yīng)的物理設(shè)備,并且提供正確的輸入/輸出指令。GDI在處理速度上幾乎和直接進(jìn)行視頻訪問一樣快,并且它還允許Windows的不同應(yīng)用程序共享顯示器。GDI包含了可用于繪制點(diǎn)、線、矩形、多邊形、橢圓、位圖以及文本的功能函數(shù)。為了方便使用,在VC++中對其進(jìn)行了封裝,形成了GDI對象類。所有GDI對象類的抽象基類都是CGdiObject,而所有實際使用的GDI對象則是從CGdiObject派生出來的,以下是GDI對象類的列表:nCFont—字體,它是一種具有某種風(fēng)格和尺寸的所有字符的完整集合,常常被當(dāng)作資源存于磁盤中,其中有一些還要依賴某種設(shè)備。nCPen—畫筆,它是用來畫線和繪制有形邊框的。具體使用時,可以指定其顏色和寬度,也可以指定其線型,例如:實線、虛線或點(diǎn)線。n

CBrush—畫刷,通過定義一種位圖矩陣,用它可以對區(qū)域內(nèi)部進(jìn)行填充。nCRgn—區(qū)域,它是由多邊形、橢圓或者二者組合形成的一種范圍,可以利用它來進(jìn)行填充、裁剪以及鼠標(biāo)點(diǎn)中測試。n

CBitmap—位圖,它是一種位圖矩陣,每一個顯示像素都對應(yīng)于其中的一個或多個位。位圖可以用來表示圖像,也可以用來創(chuàng)建刷子。n

CPalette—調(diào)色板,它是一種顏色映射接口,允許一個應(yīng)用程序在不干擾其他應(yīng)用程序的前提下,充分利用輸出設(shè)備的顏色繪制能力。注意:調(diào)色板一般只在顏色數(shù)為256種或更少的情況下才使用。3.5.2VC++繪圖方法用計算機(jī)繪圖與普通的手工繪圖類似,在OnDraw等函數(shù)中繪制圖形時,必須首先選擇好畫筆和畫刷等繪圖工具,確定好繪圖坐標(biāo)及比例尺,然后根據(jù)需要選用適當(dāng)?shù)睦L圖函數(shù)繪出圖形。因此,與繪圖有關(guān)的圖形程序庫可以分為以下五類:繪圖工具選擇函數(shù)、坐標(biāo)系統(tǒng)設(shè)置與轉(zhuǎn)換函數(shù)、繪圖模式與背景設(shè)置函數(shù)、繪圖函數(shù)區(qū)域填充函數(shù)。繪圖工具選擇函數(shù)選擇庫存繪圖工具函數(shù)原型是:virtualCGdiObject*SelectStockObject(int

nIndex);nIndex是所要選入設(shè)備文本對象的庫存對象代碼,對于畫刷和畫筆,其值如表3-1所示。例如,可以使用以下代碼選擇白色畫筆和黑色畫刷:pDC->SelectStockObject(WHITE_PEN);pDC->SelectStockObject(BLACK_BRUSH);宏代碼庫存對象宏代碼庫存對象BLACK_BRUSH黑色畫刷NULL_BRUSH空畫刷(內(nèi)部不填充)DKGRAY_BRUSH深灰色畫刷WHITE_BRUSH白色畫刷GRAY_BRUSH灰色畫刷BLACK_PEN黑色畫刷HOLLOW_BRUSH透明窗口畫刷NULL_PEN空畫筆(什么也不畫)LTGRAY_BRUSH淺灰色畫刷WHITE_PEN白色畫筆表3-1畫刷和畫筆的顏色代碼1.可以先構(gòu)造畫筆對象,然后用函數(shù)CreatePen初始化。函數(shù)原型為:BOOLCreatePen(intnPenStyle,intnWidth,COLORREFcrColor);其中,nPenStyle:畫筆風(fēng)格,其值如表3-2。nWidth:畫筆的寬度(邏輯單位),crColor:畫筆的顏色。2.畫筆對象初始化后,就可以調(diào)用CDC的成員函數(shù)SelectObject將畫筆選入設(shè)備文本對象。對于畫筆,SelectObject的原型為:CPen*SelectObject(CPen*pPen);其中,參數(shù)pPen是指向畫筆對象的指針。定制畫筆畫筆風(fēng)格含義畫筆風(fēng)格含義PS_DASH劃線,即為虛線PS_INSIDEFRAME在邊界區(qū)域內(nèi)實筆畫線PS_DASHDOT點(diǎn)劃線PS_NULL空畫筆PS_DASHDOTDOT雙點(diǎn)劃線PS_SOLID實線PS_DOT點(diǎn)線

表3-2畫筆風(fēng)格與含義畫刷風(fēng)格:實心,網(wǎng)格,模式,空四種風(fēng)格除空畫刷,其余畫刷先構(gòu)造,再按下面方法之一初始化:(1)純色填充圖形的內(nèi)部。函數(shù)原型為:BOOLCreateSolidBrush(COLORREFcrColor);//crColor畫刷顏色(2)影線模式來填充圖形的內(nèi)部。函數(shù)原型為BOOLCreateHatchBrush(intnIndex,COLORREFcrColor);其中,參數(shù)nIndex用于指定影線模式,其值如表3-3。定制畫刷陰影模式含義陰影模式含義HS_BDIAGONAL反斜線HS_FDIAGONAL斜線HS_CROSS十字線HS_HORIZONAL水平線HS_DIAGCROSS斜十字線HS_VERTICAL豎線表3-3影線模式(3)圖案模式來填充圖形的內(nèi)部。函數(shù)原型為:BOOLCreatePatternBrush(CBitmap*pBitmap);其中,參數(shù)pBitmap是指向位圖對象的指針。當(dāng)用畫刷填充圖形時,圖形內(nèi)部將用位圖一個接一個地填充。初始化完畫刷對象之后,就可以調(diào)用CDC的成員函數(shù)SelectObject將畫刷選入設(shè)備文本對象。對于畫刷,SelectObject的原型為:CBrush*SelectObject(CBrush*pBrush);其中,參數(shù)pBrush是指向畫刷對象的指針。SelectObject返回一個指向原先已選入設(shè)備文本對象的畫刷對象的指針。如果在此之前沒有選擇過畫刷對象,則使用缺省畫刷。使用VisualC++在Windows下進(jìn)行圖形程序設(shè)計的基本步驟是:(1)在繪制之前,創(chuàng)建繪圖工具并設(shè)置相關(guān)的顏色、線型、線寬等屬性;(2)調(diào)用相關(guān)的繪圖函數(shù)選擇繪圖工具并進(jìn)行繪圖;(3)在繪制之后,恢復(fù)原有的繪圖工具。

例(畫筆,畫刷的使用 ): CBrushbrush; brush.CreateHatchBrush(HS_BDIAGONAL,RGB(255,0,0)); CBrush*pOldBrush; CPen*pOldPen; pOldBrush=(CBrush*)pDC->SelectObject(&brush); pOldPen=(CPen*)pDC->SelectStockObject(NULL_PEN); pDC->Ellipse(CRect(50,50,250,250)); pDC->SelectObject(pOldBrush); pDC->SelectObject(pOldPen);

坐標(biāo)系統(tǒng)設(shè)置和轉(zhuǎn)換函數(shù)

邏輯坐標(biāo)是指用戶使用CDC繪圖函數(shù)繪制圖形的坐標(biāo);設(shè)備坐標(biāo)是指計算機(jī)系統(tǒng)使用輸出設(shè)備(顯示器或打印機(jī))來繪出圖形的坐標(biāo)。設(shè)備坐標(biāo)是用戶不能改變的。設(shè)備坐標(biāo)的原點(diǎn)總是在左上角。改變邏輯坐標(biāo)與設(shè)備坐標(biāo)的關(guān)系使用CDC的映射模式設(shè)置函數(shù)。映射模式映射模式用于定義邏輯坐標(biāo)的單位與設(shè)備坐標(biāo)間的關(guān)系。在缺省的映射模式下,邏輯坐標(biāo)與設(shè)備坐標(biāo)相同,坐標(biāo)原點(diǎn)也在窗口左上角,以像素為單位,橫坐標(biāo)隨光標(biāo)向右移動而增加,縱坐標(biāo)隨光標(biāo)向下移動而增加。Windows包含八種不同的映射模式(見表3-4),每種映射模式在應(yīng)用程序中都有特定的用途。映射模式邏輯單位設(shè)備單位軸向MM_HIENGLISH10001英寸

X軸向右,Y軸向上MM_HIMETRIC1001毫米MM_LOENGLISH1001英寸MM_LOMETRIC101毫米MM_TWIPS14401英寸MM_TEXT1設(shè)備像素X軸向右,Y軸向下MM_ANISOTROPIC

X和Y的比例可以不一致MM_ISOTROPIC

X和Y的比例一致表3-4Windows包含的八種映射模式設(shè)置映射模式:函數(shù)原型為virtualintSetMapMode(intnMapMode);參數(shù)nMapMode為前面列出的八種映射模式之一。設(shè)備坐標(biāo)轉(zhuǎn)換為邏輯坐標(biāo),函數(shù)原型為:voidDPtoLP(LPPOINTlpPoints,intnCount=1);voidDPtoLP(LPRECTlpRect);voidDPtoLP(LPSIZElpsize);參數(shù)lpPoints是指向POINT結(jié)構(gòu)或CPoint對象的數(shù)組,nCount表示數(shù)組中的點(diǎn)數(shù)。lpRect指向RECT結(jié)構(gòu)或CRect對象,使用這個參數(shù)表示將矩形區(qū)域的設(shè)備點(diǎn)轉(zhuǎn)換為邏輯點(diǎn)。lpsize指向SIZE結(jié)構(gòu)或CSize對象。邏輯坐標(biāo)轉(zhuǎn)換為設(shè)備坐標(biāo),函數(shù)原型為:voidLPtoDP(LPPOINTlpPoints,intnCount=1);voidLPtoDP(LPRECTlpRect);voidLPtoDP(LPSIZElpsize);繪圖模式與背景設(shè)置函數(shù)設(shè)置繪圖模式

繪圖模式指定Windows如何組合畫筆和顯示設(shè)備上的當(dāng)前顏色的方式。線的繪制除了由畫筆的顏色和寬度決定外,也受當(dāng)前繪圖模式的影響改變繪圖模式的函數(shù)原型為:intSetROP2(intnDrawMode);參數(shù)nDrawMode指定所要求的繪圖模式,其值如下表:繪圖描述R2_BLACK像素總為黑色R2_WHITE像素總為白色R2_NOP像素保持不變R2_NOT像素為顯示顏色的反轉(zhuǎn)色R2_COPYPEN

缺省繪圖模式,像素為畫筆顏色R2_NOTCOPYPEN像素為畫筆顏色的反轉(zhuǎn)色R2_MASKPEN像素為顯示顏色與畫筆顏色的公共顏色的組合R2_NOTMASKPEN像素為R2_MASKPEN顏色反轉(zhuǎn)色R2_XORPEN像素為畫筆顏色與顯示顏色的組合,但不同時為這兩種顏色R2_NOTXOPEN像素為R2_XORPEN顏色反轉(zhuǎn)色…………CPenpen(PS_SOLID,5,RGB(0,255,255));CPen*pOldPen=pDC->SelectObject(&pen);pDC->SetROP2(R2_XORPEN);pDC->MoveTo(100,100);pDC->LineTo(200,200);//pDC->MoveTo(100,100);//pDC->LineTo(200,200);pDC->SelectObject(pOldPen);背景顏色設(shè)置函數(shù)原型為:virtualCOLORREFSetBkColor(COLORREFcrColor);

背景模式設(shè)置函數(shù)原型為:intSetBkMode(intnBkMode);參數(shù)nBkMode指定背景模式,其值可以為:OPAQUE:圖形背景為SetBkColor設(shè)置的當(dāng)前背景顏色TRANSPARENT:圖形背景為當(dāng)前顯示設(shè)備上的顏色

pDC->SetBkColor(RGB(255,0,0));pDC->SetBkMode(OPAQUE);pDC->TextOut(300,300,"hello");繪圖函數(shù)(1)

設(shè)置像素(畫點(diǎn))函數(shù)原型為:COLORREFSetPixel(intx,inty,COLORREF

crColor);COLORREFSetPixel(POINTpoint,COLORREF

crColor);像素點(diǎn)的位置由參數(shù)x和y或者point指定,crColor指定顏色。(2)

畫直線MoveTo函數(shù)的原型為:CPointMoveTo(intx,inty);//當(dāng)前位置由參數(shù)x和y指定CPointMoveTo(POINTpoint);//當(dāng)前位置由point指定繪制直線函數(shù)原型為:BOOLLineTo(intx,inty);BOOLLineTo(POINTpoint);可以調(diào)用Polyline函數(shù)畫一系列直線。函數(shù)原型為:BOOLPolyline(LPPOINTlpPoints,intnCount);lpPoints指定包含線段頂點(diǎn)的POINT結(jié)構(gòu)數(shù)組,nCount指定數(shù)組中的點(diǎn)數(shù)。pDC->MoveTo(5,5);pDC->LineTo(50,50);CPointp[3]={CPoint(20,20),CPoint(150,200),CPoint(100,200)};pDC->Polyline(p,3);(3)

畫矩形畫矩形有兩個CDC成員函數(shù):Rectangle和RoundRect。函數(shù)Rectangle畫的是方角矩形函數(shù)RoundRect畫的是圓角矩形函數(shù)Rectangle的原型為:BOOLRectangle(intx1,inty1,intx2,inty2)

;BOOLRectangle(LPCRECTlpRect)

;矩形區(qū)域由參數(shù)(x1,y1)和(x2,y2)或者lpRect指定。左上角坐標(biāo)為(x1,y1),右下角坐標(biāo)為(x2,y2)。函數(shù)RoundRect的原型為:BOOLRoundRect(intx1,inty1,intx2,inty2,intx3,inty3)

;BOOLRoundRect(LPCRECTlpRect,POINTpoint)

;矩形區(qū)域由參數(shù)(x1,y1)和(x2,y2)或者lpRect指定。左上角坐標(biāo)為(x1,y1),右下角坐標(biāo)為(x2,y2)。矩形區(qū)域的圓角由(x3,y3)或者point確定,x3和y3分別指定圓角曲線的寬度和高度。

(4)

畫弧畫弧函數(shù)用邊界矩形來定義弧的大小。邊界矩形是隱藏的,用于描述弧的位置和大小。函數(shù)原型為:BOOLArc(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4)

;BOOLArc(LPCRECTlpRect,POINTptStart,POINTptEnd);邊界矩形由參數(shù)(x1,y1)和(x2,y2)或者lpRect定義(x1,y1)是邊界矩形的左上角坐標(biāo),(x2,y2)是邊界矩形的右下角坐標(biāo)。(x3,y3)或者ptStart是弧的起始點(diǎn)。(x4,y4)或者ptEnd是弧的終止點(diǎn)。此外,畫弧還可以使用CDC的成員函數(shù)ArcTo,函數(shù)原型為:BOOLArcTo(intx1,inty1,intx2,inty2,intx3,inty3,intx4,inty4)

;BOOLArcTo(LPCRECTlpRect,POINTptStart,

POINTptEnd);函數(shù)ArcTo與Arc基本相同,不同之處在于ArcTo函數(shù)將當(dāng)前位置更新為弧的終止點(diǎn)。(5)

畫橢圓和圓函數(shù)原型為:BOOLEllipse(intx1,inty1,intx2,inty2)

;BOOLEllipse(LPCRECTlpRect)

;參數(shù)(x1,y1)和(x2,y2)或者lpRect定義的是與橢圓相切的邊界矩形,矩形的左上角坐標(biāo)是(x1,y1),右下角坐標(biāo)是(x2,y2)。如果要畫圓而非橢圓,可以指定正方形為外切邊界矩形,此時x2-x1等于y2-y1。畫出一個半徑為5像素的圓并以黑色填充之,得到一個比較大的點(diǎn):voidCDrowDotView::OnDraw(CDC*pDC){pDC->SelectStockObject(BLACK_BRUSH);//畫出的點(diǎn)為黑色

pDC->Ellipse(CRect(5,10,10,15));

//畫一個小圓}一個畫圓的例子程序,這個圓的外接矩形左上角坐標(biāo)是(20,20),右下角坐標(biāo)是(120,120):voidCDrawEllipseView::OnDraw(CDC*pDC){pDC->Ellipse(20,20,120,

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論