第二章Visual C++60繪圖基礎(chǔ)_第1頁(yè)
第二章Visual C++60繪圖基礎(chǔ)_第2頁(yè)
第二章Visual C++60繪圖基礎(chǔ)_第3頁(yè)
第二章Visual C++60繪圖基礎(chǔ)_第4頁(yè)
第二章Visual C++60繪圖基礎(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩76頁(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)介

1、第二章第二章 2.1 2.1 面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)面向?qū)ο蟪绦蛟O(shè)計(jì)基礎(chǔ)2.2 MFC2.2 MFC上機(jī)操作步驟上機(jī)操作步驟2.3 MFC2.3 MFC基本繪圖函數(shù)基本繪圖函數(shù)2.4 2.4 本章小結(jié)本章小結(jié)習(xí)題習(xí)題2 2Turbo CTurbo C:n控制臺(tái)程序,不支持交互操作。控制臺(tái)程序,不支持交互操作。n只能顯示只能顯示1616色,不能開(kāi)發(fā)光照和帶陰影的程序。色,不能開(kāi)發(fā)光照和帶陰影的程序。Turbo C 繪制的Menger海綿Visual C+:n可以顯示真彩色,有1678萬(wàn)色。n支持交互式繪圖。Visual C+ 繪制的Menger海綿2.1.3對(duì)象的動(dòng)態(tài)建立與釋放對(duì)象的動(dòng)態(tài)建立與釋放

2、n類(lèi)名 *指針變量名=new 類(lèi)名(初始化式)ndelete 指向該對(duì)象的指針變量名n類(lèi)名 *指針變量名=new 類(lèi)名 下標(biāo)表達(dá)式ndelete 指向該對(duì)象的指針變量名n類(lèi)名 *指針變量名=new 類(lèi)名*行下標(biāo)表達(dá)式nfor(int i=0;i行下標(biāo)表達(dá)式;i+) 指針變量名i=new類(lèi)名列下標(biāo)表達(dá)式;nnfor(int i=0;iEllipse(100,70,900,570);void CTestView:OnPaint() /繪制矩形CPaintDC dc(this); / device context for painting/ TODO: Add your message handle

3、r code heredc.Rectangle(100,70,900,570);/ Do not call CView:OnPaint() for painting messagesOnPaint() OnPaint() 屏蔽了屏蔽了OnDraw()OnDraw()函數(shù)函數(shù), ,不繪制橢不繪制橢圓。如果刪除此函數(shù),則繪制結(jié)果為橢圓。圓。如果刪除此函數(shù),則繪制結(jié)果為橢圓。整個(gè)屏幕區(qū)域的顯示器設(shè)備上下文類(lèi)。包括客戶區(qū)整個(gè)屏幕區(qū)域的顯示器設(shè)備上下文類(lèi)。包括客戶區(qū)(工具欄、狀態(tài)欄和視圖窗口的客戶區(qū))和非客戶區(qū)(工具欄、狀態(tài)欄和視圖窗口的客戶區(qū))和非客戶區(qū)(標(biāo)題欄和菜單欄)。(標(biāo)題欄和菜單欄)。CWin

4、dowDCCWindowDC允許在整個(gè)屏幕區(qū)域內(nèi)進(jìn)行繪圖,其構(gòu)造函允許在整個(gè)屏幕區(qū)域內(nèi)進(jìn)行繪圖,其構(gòu)造函數(shù)自動(dòng)調(diào)用數(shù)自動(dòng)調(diào)用GetWindowDC()GetWindowDC(),析構(gòu)函數(shù)自動(dòng)調(diào)用,析構(gòu)函數(shù)自動(dòng)調(diào)用ReleaseDC()ReleaseDC()函數(shù)。函數(shù)。CWindowDCCWindowDC中點(diǎn)(中點(diǎn)(0 0,0 0)在屏幕的左上角,而)在屏幕的左上角,而CClientDCCClientDC和和CPaintDCCPaintDC中點(diǎn)(中點(diǎn)(0 0,0 0)是屏幕客戶區(qū)的左)是屏幕客戶區(qū)的左上角。上角。如果在如果在CTestViewCTestView類(lèi)中使用類(lèi)中使用CWindowDCC

5、WindowDC類(lèi)對(duì)象進(jìn)行繪圖,類(lèi)對(duì)象進(jìn)行繪圖,只有在使用只有在使用GetParent()GetParent()函數(shù)獲得函數(shù)獲得CWndCWnd指針后,才能在指針后,才能在整個(gè)屏幕區(qū)域內(nèi)繪圖。整個(gè)屏幕區(qū)域內(nèi)繪圖。簡(jiǎn)單數(shù)據(jù)類(lèi)型 nCPointCPoint類(lèi):存放點(diǎn)坐標(biāo)(類(lèi):存放點(diǎn)坐標(biāo)(x x,y y)。)。n構(gòu)造函數(shù):構(gòu)造函數(shù):CPointCPoint(int initX,int initYint initX,int initY); ; CPoint(POINT initPt); CPoint(POINT initPt);nCRectCRect類(lèi):存放矩形左上角頂點(diǎn)和右下角頂點(diǎn)的坐標(biāo)(類(lèi):存放矩

6、形左上角頂點(diǎn)和右下角頂點(diǎn)的坐標(biāo)(toptop,leftleft,rightright,bottombottom)n構(gòu)造函數(shù):構(gòu)造函數(shù):CRect(int l,int t,int r,int b);CRect(int l,int t,int r,int b);n CRect(const RECT& srcRect); CRect(const RECT& srcRect);n CRect(LPCRECT lpSrcRect); CRect(LPCRECT lpSrcRect);n CRect(POINT point,SIZE size); CRect(POINT point,SIZ

7、E size);n CRect(POINT topLeft,POINT bottomRight); CRect(POINT topLeft,POINT bottomRight); nCSizeCSize類(lèi):存放矩形的寬度和高度的坐標(biāo)(類(lèi):存放矩形的寬度和高度的坐標(biāo)(cxcx,cycy),其中),其中cxcx為矩形的寬度,為矩形的寬度,cycy為矩形的高度。為矩形的高度。n構(gòu)造函數(shù):構(gòu)造函數(shù):CSize(int initCX,int initCY);CSize(int initCX,int initCY);n CSize(SIZE initSize); CSize(SIZE initSize);

8、繪圖工具類(lèi) nCGdiObjectCGdiObject類(lèi):類(lèi):GDIGDI繪圖工具的基類(lèi),一般不能直接繪圖工具的基類(lèi),一般不能直接使用。使用。nCBitmapCBitmap:封裝了一個(gè):封裝了一個(gè)GDIGDI位圖,提供位圖操作的接位圖,提供位圖操作的接口???。nCBrushCBrush類(lèi):封裝了類(lèi):封裝了GDIGDI畫(huà)刷,可以選作設(shè)備上下文的畫(huà)刷,可以選作設(shè)備上下文的當(dāng)前畫(huà)刷。畫(huà)刷用于填充圖形內(nèi)部。當(dāng)前畫(huà)刷。畫(huà)刷用于填充圖形內(nèi)部。nCFontCFont:封裝了:封裝了GDIGDI字體,可以選作設(shè)備上下文中的字體,可以選作設(shè)備上下文中的當(dāng)前字體。當(dāng)前字體。nCPalletteCPallette:

9、封裝了:封裝了GDIGDI調(diào)色板,提供應(yīng)用程序和顯調(diào)色板,提供應(yīng)用程序和顯示器之間的顏色接口。示器之間的顏色接口。nCPenCPen:封裝了:封裝了GDIGDI畫(huà)筆,可以選作設(shè)備上下文的當(dāng)前畫(huà)筆,可以選作設(shè)備上下文的當(dāng)前畫(huà)筆。畫(huà)筆用于繪制圖形邊界線。畫(huà)筆。畫(huà)筆用于繪制圖形邊界線。在選擇在選擇GDIGDI對(duì)象進(jìn)行繪圖時(shí),需要遵循以下步驟:對(duì)象進(jìn)行繪圖時(shí),需要遵循以下步驟:n繪圖開(kāi)始前,創(chuàng)建一個(gè)繪圖開(kāi)始前,創(chuàng)建一個(gè)GDIGDI對(duì)象,并選入當(dāng)前設(shè)備上對(duì)象,并選入當(dāng)前設(shè)備上下文,同時(shí)保存原下文,同時(shí)保存原GDIGDI對(duì)象指針。對(duì)象指針。n使用新使用新GDIGDI對(duì)象繪圖。對(duì)象繪圖。n繪圖結(jié)束后,使用已

10、保存的原繪圖結(jié)束后,使用已保存的原GDIGDI對(duì)象指針將設(shè)備上對(duì)象指針將設(shè)備上下文恢復(fù)原狀。下文恢復(fù)原狀。n把圖形顯示在屏幕坐標(biāo)系中的過(guò)程稱為映射把圖形顯示在屏幕坐標(biāo)系中的過(guò)程稱為映射n根據(jù)映射模式的不同可以分為根據(jù)映射模式的不同可以分為n 邏輯坐標(biāo)邏輯坐標(biāo)n 設(shè)備坐標(biāo)設(shè)備坐標(biāo)n邏輯坐標(biāo)的單位是米制尺度或其它與字體相關(guān)的尺度邏輯坐標(biāo)的單位是米制尺度或其它與字體相關(guān)的尺度n設(shè)備坐標(biāo)的單位是像素設(shè)備坐標(biāo)的單位是像素模式代碼模式代碼坐標(biāo)單位坐標(biāo)單位坐標(biāo)系特征坐標(biāo)系特征MM_TEXT一個(gè)像素一個(gè)像素設(shè)備坐標(biāo)。屏幕左上角為坐標(biāo)原設(shè)備坐標(biāo)。屏幕左上角為坐標(biāo)原點(diǎn),點(diǎn),X軸向右,軸向右,Y軸向下。軸向下。MM

11、_LOMETRIC0.1mm邏輯坐標(biāo)。坐標(biāo)原點(diǎn)位置可以自邏輯坐標(biāo)。坐標(biāo)原點(diǎn)位置可以自由設(shè)置,由設(shè)置,X軸向右,軸向右,Y軸向上。軸向上。MM_HIMETRIC0.01mm邏輯坐標(biāo)。坐標(biāo)原點(diǎn)位置可以自邏輯坐標(biāo)。坐標(biāo)原點(diǎn)位置可以自由設(shè)置,由設(shè)置,X軸向右,軸向右,Y軸向上。軸向上。MM_LOENGLISH0.01inch邏輯坐標(biāo)。坐標(biāo)原點(diǎn)位置可以自邏輯坐標(biāo)。坐標(biāo)原點(diǎn)位置可以自由設(shè)置,由設(shè)置,X軸向右,軸向右,Y軸向上。軸向上。MM_HIENGLISH0.001inch邏輯坐標(biāo)。坐標(biāo)原點(diǎn)位置可以自邏輯坐標(biāo)。坐標(biāo)原點(diǎn)位置可以自由設(shè)置,由設(shè)置,X軸向右,軸向右,Y軸向上。軸向上。模式代碼模式代碼坐標(biāo)單位

12、坐標(biāo)單位坐標(biāo)系特征坐標(biāo)系特征MM_TWIPS1/1440inch或或1/20點(diǎn)點(diǎn)邏輯坐標(biāo)。坐標(biāo)原點(diǎn)位置可邏輯坐標(biāo)。坐標(biāo)原點(diǎn)位置可以自由設(shè)置,以自由設(shè)置,X軸向右,軸向右,Y軸軸向上。向上。MM_ISOTROPIC用戶自定義,用戶自定義,X軸和軸和Y軸比軸比例相等例相等邏輯坐標(biāo)。坐標(biāo)原點(diǎn)位置可邏輯坐標(biāo)。坐標(biāo)原點(diǎn)位置可以自由設(shè)置,以自由設(shè)置,X軸和軸和Y軸方向軸方向自定義。自定義。MM_ANISOTROPIC用戶自定義,用戶自定義,X軸和軸和Y軸比軸比例獨(dú)立設(shè)置例獨(dú)立設(shè)置邏輯坐標(biāo)。坐標(biāo)原點(diǎn)位置可邏輯坐標(biāo)。坐標(biāo)原點(diǎn)位置可以自由設(shè)置,以自由設(shè)置,X軸和軸和Y軸方向軸方向自定義。自定義。 例例2-5 2

13、-5 使用用戶自定義映射模式,設(shè)置窗口大小和使用用戶自定義映射模式,設(shè)置窗口大小和視區(qū)大小相等的二維坐標(biāo)系。視區(qū)中視區(qū)大小相等的二維坐標(biāo)系。視區(qū)中x x軸水平向右為正,軸水平向右為正,y y軸垂直向上為正,原點(diǎn)位于客戶區(qū)中心。軸垂直向上為正,原點(diǎn)位于客戶區(qū)中心。 void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here CRect rect; GetClientRect(&rect); pDC-Se

14、tMapMode(MM_ANISOTROPIC pDC-SetWindowExt(rect.Width(),rect.Height pDC-SetViewportExt(rect.Width(),-rect.Height pDC-SetViewportOrg(rect.Width()/2,rect.Height()/2BOOL CreatePen(int nPenStyle,int nWidth,COLORREF cfColor);畫(huà)筆樣式畫(huà)筆樣式線型線型寬度寬度顏色顏色PS_SOLID實(shí)線實(shí)線任意指定任意指定純色純色PS_DASH虛線虛線1或者更小或者更小純色純色PS_DOT點(diǎn)線點(diǎn)線1或者更

15、小或者更小純色純色PS_DASHDOT點(diǎn)劃線點(diǎn)劃線1或者更小或者更小純色純色PS_DASHDOTDOT雙點(diǎn)劃線雙點(diǎn)劃線1或者更小或者更小純色純色PS_NULL不可見(jiàn)線不可見(jiàn)線任意指定任意指定純色純色PS_INSIDEFRAME 內(nèi)框架線內(nèi)框架線任意指定任意指定純色純色(1)創(chuàng)建實(shí)體畫(huà)刷函數(shù)BOOL CreateSolidBrush(COLORREF crColor);(2)創(chuàng)建陰影畫(huà)刷函數(shù)BOOL CreateHatchBrush(int nIndex,ColoRREF crColor);陰影樣式陰影樣式含義含義HS_BDIAGONAL45下降陰影線(從左到右)下降陰影線(從左到右)HS_CR

16、OSS水平和垂直交叉陰影線水平和垂直交叉陰影線HS_DIAGCROSS45十字交叉陰影線十字交叉陰影線HS_FDIAGONAL45上升陰影線(從左到右)上升陰影線(從左到右)HS_HORIZONTAL水平陰影線水平陰影線HS_VERTICAL垂直陰影線垂直陰影線CPen* SelectObject(CPen* pPen);CBrush* SelectObject(CBrush* pBrush);CBitmap* SelectObject(CBitmap* pBitmap);將設(shè)備上下文中的原將設(shè)備上下文中的原GDI對(duì)象換為新對(duì)象,同時(shí)對(duì)象換為新對(duì)象,同時(shí)返回指向原對(duì)象的指針?lè)祷刂赶蛟瓕?duì)象的指針

17、BOOl DeleteObject();virtual CGdiObject *SelectStockObject(int nIndex);n參數(shù)參數(shù)x x,y y是像素點(diǎn)的邏輯坐標(biāo)。是像素點(diǎn)的邏輯坐標(biāo)。nCOLORREFCOLORREF是是3232位顏色類(lèi)型,位顏色類(lèi)型,crColorcrColor是像素點(diǎn)的顏色是像素點(diǎn)的顏色值,值,COLORREFCOLORREF型變量可以利用型變量可以利用RGBRGB(bRedbRed,bGreenbGreen,bBluebBlue)來(lái)指定相應(yīng)的顏色值,每種顏色用一個(gè)字節(jié))來(lái)指定相應(yīng)的顏色值,每種顏色用一個(gè)字節(jié)表示,可以被設(shè)定為表示,可以被設(shè)定為0255

18、0255之間的任意值,之間的任意值,0 0代表無(wú)色,代表無(wú)色,255255代表全色。代表全色。nSetPixelV()SetPixelV()函數(shù)不需要返回所繪制像素點(diǎn)的函數(shù)不需要返回所繪制像素點(diǎn)的RGBRGB值,值,執(zhí)行速度比執(zhí)行速度比SetPixel()SetPixel()快得多。在真實(shí)感圖形學(xué)中,快得多。在真實(shí)感圖形學(xué)中,物體表面模型使用像素點(diǎn)模擬光照顏色。提高像素點(diǎn)物體表面模型使用像素點(diǎn)模擬光照顏色。提高像素點(diǎn)的繪制速度可以有效提高圖形生成速度。推薦使用的繪制速度可以有效提高圖形生成速度。推薦使用SetPixelV()SetPixelV()函數(shù)繪制像素點(diǎn)。函數(shù)繪制像素點(diǎn)。 COLORRE

19、F SetPixel(int x,int y,COLORREF crColor );BOOL SetPixelV(int x, int y, COLORREF crColor);n返回值:指定像素的返回值:指定像素的RGBRGB值。值。n參數(shù)說(shuō)明:得到指定像素的參數(shù)說(shuō)明:得到指定像素的RGBRGB顏色值。顏色值。n本函數(shù)是常成員函數(shù)本函數(shù)是常成員函數(shù) 。COLORREF GetPixel(int x,int y)const;例例2-62-6在屏幕上使用SetPixelV()函數(shù)將crColor參數(shù)設(shè)置為隨機(jī)顏色,用像素點(diǎn)在x軸負(fù)向畫(huà)出對(duì)角點(diǎn)為(-150,-50)和(-50,50)的正方形。然后

20、使用GetPixel()函數(shù)依次讀出該正方形內(nèi)各像素點(diǎn)的顏色,在x軸正向的對(duì)稱位置上重新繪制該正方形。 void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCOLORREF crColor;int x,y;for(y=-50;y50;y+)for(x=-150;x-50;x+) pDC-SetPixelV(x,y,RGB(rand()%255,rand()%255, rand()%255);for(y=

21、-50;y50;y+)for(x=-150;xGetPixel(x,y); pDC-SetPixelV(-x,y,crColor); void CTestView:OnDraw(CDC* pDC) CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native data here CPoint p0(-100,-50),p1(100,50); CPen NewPen,*pOldPen; NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255); pOldPen=pD

22、C-SelectObject(&NewPen); pDC-MoveTo(p0); pDC-LineTo(p1); pDC-SelectObject(pOldPen); BOOL Rectangle( int x1, int y1, int x2, int y2 );nx1x1、y1y1是直角矩形的左上角點(diǎn)坐標(biāo);是直角矩形的左上角點(diǎn)坐標(biāo);nx2x2、y2y2是直角矩形的右下角點(diǎn)坐標(biāo);是直角矩形的右下角點(diǎn)坐標(biāo); (1)繪制直角矩形(2)繪制圓角矩形BOOL RoundRect( int x1, int y1, int x2, int y2, int x3, int y3 );nx1、y1是

23、圓角矩形的左上角點(diǎn)坐標(biāo);nx2、y2是圓角矩形的右下角點(diǎn)坐標(biāo);nx3、y3是圓角橢圓的寬度和高度; void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);rect.DeflateRect(100,100);CPen NewPen,*pOldPen; NewPen.CreatePen(PS_SOLID,1,

24、RGB(0,0,255); pOldPen=pDC-SelectObject(&NewPen); CBrush NewBrush,*pOldBrush;NewBrush.CreateSolidBrush(RGB(255,0,0);pOldBrush=pDC-SelectObject(&NewBrush); pDC-Rectangle(rect);pDC-RoundRect(rect,CPoint(50,50);pDC-SelectObject(pOldPen);pDC-SelectObject(pOldBrush);BOOL Ellipse( int x1, int y1, i

25、nt x2, int y2 );nx1x1,y1y1是限定橢圓范圍的外接矩形左上角點(diǎn)的坐標(biāo);是限定橢圓范圍的外接矩形左上角點(diǎn)的坐標(biāo);nx2x2,y2y2是限定橢圓范圍的外接矩形右下角點(diǎn)的坐標(biāo);是限定橢圓范圍的外接矩形右下角點(diǎn)的坐標(biāo);nEllipse()Ellipse()函數(shù)使用當(dāng)前畫(huà)刷填充橢圓內(nèi)部,并使用函數(shù)使用當(dāng)前畫(huà)刷填充橢圓內(nèi)部,并使用當(dāng)前畫(huà)筆繪制橢圓邊界線;當(dāng)前畫(huà)筆繪制橢圓邊界線;nVC+VC+中沒(méi)有專(zhuān)門(mén)的畫(huà)圓函數(shù),只是把圓繪制為長(zhǎng)半軸中沒(méi)有專(zhuān)門(mén)的畫(huà)圓函數(shù),只是把圓繪制為長(zhǎng)半軸和短半軸相等的橢圓;和短半軸相等的橢圓;例例2-102-10 將客戶區(qū)矩形左右邊界各收縮100個(gè)像素,分別繪制矩

26、形、矩形內(nèi)切圓和矩形內(nèi)切橢圓。繪制過(guò)程按圓、橢圓和矩形順序完成。設(shè)定圓、橢圓和矩形的邊界線為1像素寬黑色實(shí)線,內(nèi)部全部使用透明畫(huà)刷填充。void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCRect rect;rect.OffsetRect(-rect.Width()/2,-rect.Height()/2);rect.DeflateRect(100,100);CBrush NewBrush,*pOldB

27、rush;pOldBrush=(CBrush*)pDC- SelectStockObject(NULL_BRUSH); /選擇透明畫(huà)刷 int r=rect.Height()/2;/定義圓的半徑CRect rect1(CPoint(-r,-r),CPoint(r,rpDC-Ellipse(rect1);/繪制圓pDC-Ellipse(rect);/繪制橢圓pDC-Rectangle(rect);/繪制外接矩形pDC-SelectObject(pOldBrush);BOOL Arc( int x1, int y1, int x2, int y2, int x3, int y3, int x4,

28、int y4 );nx1x1,y1y1是外接矩形左上角點(diǎn)坐標(biāo);是外接矩形左上角點(diǎn)坐標(biāo);nx2x2,y2y2是外接矩形右下角點(diǎn)坐標(biāo);是外接矩形右下角點(diǎn)坐標(biāo);nx3x3,y3y3為橢圓弧起點(diǎn)坐標(biāo),該參數(shù)不一定嚴(yán)格位于圓為橢圓弧起點(diǎn)坐標(biāo),該參數(shù)不一定嚴(yán)格位于圓弧上;弧上;nx4x4,y4y4為橢圓弧終點(diǎn)坐標(biāo),該參數(shù)也不一定嚴(yán)格位于為橢圓弧終點(diǎn)坐標(biāo),該參數(shù)也不一定嚴(yán)格位于橢圓弧上;橢圓弧上;n橢圓弧的真實(shí)起點(diǎn)是外接矩形中心點(diǎn)與(橢圓弧的真實(shí)起點(diǎn)是外接矩形中心點(diǎn)與(x3,y3x3,y3)點(diǎn)點(diǎn)所構(gòu)成的射線與橢圓的交點(diǎn);所構(gòu)成的射線與橢圓的交點(diǎn);n橢橢圓弧的真實(shí)終點(diǎn)是外接矩形中心點(diǎn)與(圓弧的真實(shí)終點(diǎn)是外接矩

29、形中心點(diǎn)與(x4,y4x4,y4)點(diǎn)點(diǎn)所構(gòu)成的射線與橢圓的交點(diǎn);所構(gòu)成的射線與橢圓的交點(diǎn);n默認(rèn)的橢圓弧繪制方向是逆時(shí)針,可以通過(guò)調(diào)用默認(rèn)的橢圓弧繪制方向是逆時(shí)針,可以通過(guò)調(diào)用SetArcDirection()SetArcDirection()函數(shù)將繪制方向設(shè)為順時(shí)針。函數(shù)將繪制方向設(shè)為順時(shí)針。 int SetArcDirection( int nArcDirection );n參數(shù)nArcDirection可以是AD_COUNTERCLOCKWISE(逆時(shí)針)和AD_CLOCKWISE(順時(shí)針); nArc()函數(shù)使用當(dāng)前畫(huà)筆繪制橢圓弧邊界線。由于橢圓弧可能不封閉,因此不對(duì)橢圓弧進(jìn)行填充。例

30、例2-11 2-11 在客戶區(qū)內(nèi)從12點(diǎn)到3點(diǎn)逆時(shí)針繪制黑色點(diǎn)劃線橢圓弧,從12點(diǎn)到3點(diǎn)順時(shí)針繪制藍(lán)色實(shí)線橢圓弧。 void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hererect.OffsetRect(-rect.Width()/2,-rect.Height()/2);CPoint Twelve(0,rect.bottom),Three(rect.right,0);CPen penBlack,penBlu

31、e,*pOldPen;penBlue.CreatePen(PS_SOLID,1,RGB(0,0,255);penBlack.CreatePen(PS_DASHDOT,1,RGB(0,0,0);pDC-SetArcDirection(AD_CLOCKWISE);pOldPen=pDC-SelectObject(&penBlue);pDC-Arc(rect,Twelve,Three);pDC-SetArcDirection(AD_COUNTERCLOCKWISE);pOldPen=pDC-SelectObject(&penBlack);pDC-Arc(rect,Twelve,Thr

32、ee);pDC-SelectObject(pOldPen);BOOL Pie( int x1, int y1, int x2, int y2, int x3, int y3, int x4, int y4 );n所有參數(shù)與圓弧函數(shù)相同; n扇形從起點(diǎn)到終點(diǎn)逆時(shí)針?lè)较蚶L制;n扇形中心位置坐標(biāo)是外接矩形的中心;n扇形使用直線連接扇形中心和扇形的起點(diǎn)和終點(diǎn);nPie()函數(shù)使用當(dāng)前畫(huà)刷填充扇形內(nèi)部,并用當(dāng)前畫(huà)筆繪制扇形邊界線;n扇形不包括右邊界坐標(biāo)和下邊界坐標(biāo),即扇形寬度為x2-x1,高度為y2-y1。例2-12 繪制兩個(gè)扇形構(gòu)成扇子形狀,使用位圖畫(huà)刷填充扇子內(nèi)部。 void CTestView:O

33、nDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCBitmap Bitmap;Bitmap.LoadBitmap(IDB_INSTITUTE);CBrush Brush,*pOldBrush;Brush.CreatePatternBrush(&Bitmap);pOldBrush=pDC-SelectObject(&Brush);CPen NewPen,*pOldPen;pOldPen=(CPen*)pDC-Sele

34、ctStockObject(NULL_PEN); CPoint dl,tr,sp,ep;/左下角點(diǎn)、右上角的、起點(diǎn)和終點(diǎn)dl=CPoint(-400,-600),tr=CPoint(400,200); /注意起點(diǎn)與終點(diǎn)坐標(biāo)的順序sp=CPoint(400,0),ep=CPoint(-400,0);pDC-Pie(CRect(dl,tr),sp,ep);pDC-SelectObject(pOldBrush);NewPen.DeleteObject();Bitmap.DeleteObject();dl=CPoint(-80,-280),tr=CPoint(80,-120);sp=CPoint(40

35、0,0),ep=CPoint(-400,0);pDC-Pie(CRect(dl,tr),sp,ep);pDC-SelectObject(pOldPen);BOOL Polygon(LPPOINT lpPoints,int nCount);nlpPoints指定多邊形頂點(diǎn)數(shù)組中每一個(gè)頂點(diǎn)對(duì),是一個(gè)POINT結(jié)構(gòu)或CPoint對(duì)象;nnCount指定多邊形數(shù)組中的頂點(diǎn)個(gè)數(shù);nPolygon()函數(shù)使用當(dāng)前畫(huà)筆繪制多邊形邊界線,使用當(dāng)前畫(huà)刷填充多邊形內(nèi)部;n多邊形自動(dòng)閉合。例2-13 以正五邊形的5個(gè)頂點(diǎn)為基礎(chǔ),隔點(diǎn)存儲(chǔ)構(gòu)成五角星,p0p4為正五邊形的5個(gè)頂點(diǎn),v0v4為五角星的5個(gè)頂點(diǎn)。填充模式采

36、用WINDING。五角星邊界線為5個(gè)像素寬的藍(lán)色實(shí)線,內(nèi)部使用紅色填充。左下角點(diǎn)p0p1p2p3p4v0v3v1v4v2 (a)WINDING (b)ALTERNATEvoid CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCPen penBlue(PS_SOLID,5,RGB(0,0,255CPen *pOldPen=pDC-SelectObject(&penBlue);CBrush brushR

37、ed(RGB(255,0,0);/定義紅色畫(huà)刷CBrush *pOldBrush=pDC-SelectObject(&brushRed);pDC-SetPolyFillMode(WINDING);/設(shè)置填充模式int r=200;/正五邊形外接圓半徑 CPoint p5;/定義正五邊形頂點(diǎn)數(shù)組double Alpha=2*PI/5;/定義每條邊的圓心角 for(int i=0;iPolygon(v,5);/繪制五角星pDC-SelectObject(pOldPen);/恢復(fù)畫(huà)筆pDC-SelectObject(pOldBrush);/恢復(fù)畫(huà)刷打開(kāi)路徑層BOOL BeginPath();

38、關(guān)閉路徑圖層BOOL EndPath();填充路徑層BOOL FillPath();(4)繪制并填充路徑層BOOL StrokeAndFillPath();例例2-142-14 使用直線函數(shù)繪制p0(-160,20)、p1(-240,100)、p2(-280,0)、p3(-240,-100)、p4(-180,-40)、p5(-140,-100)、p6(-60,40)左側(cè)多邊形,水平右移360個(gè)像素繪制右側(cè)同樣形狀的多邊形,分別使用FillPath()函數(shù)填充左側(cè)多邊形,StrokeAndFillPath()函數(shù)填充右側(cè)多邊形。多邊形邊界線顏色保持默認(rèn)黑色,內(nèi)部填充為紅色,試觀察填充效果。 vo

39、id CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCPoint p7; /定義頂點(diǎn)數(shù)組p0=CPoint(-160,20);p1=CPoint(-240,100);p2=CPoint(-280,0);p3=CPoint(-240,-100);p4=CPoint(-180,-40);p5=CPoint(-140,-100); p6=CPoint(-60,40);CBrush NewBrush;NewBrus

40、h.CreateSolidBrush(RGB(255,0,0);CBrush *pOldBrush=pDC-SelectObject(&NewBrush);pDC-BeginPath();pDC-MoveTo(p0);/繪制左側(cè)多邊形for(int i=0;iLineTo(pi);pDC-LineTo(p0);pDC-EndPath();pDC-FillPath();/FillPath填充路徑層 p0=CPoint(200,20);p1=CPoint(120,100);p2=CPoint(80,0);p3=CPoint(120,-100);p4=CPoint(180,-40);p5=C

41、Point(220,-100); p6=CPoint(300,40);pDC-BeginPath();pDC-MoveTo(p0);for(i=0;iLineTo(pi);pDC-LineTo(p0);pDC-EndPath();pDC-StrokeAndFillPath();/StrokeAndFillPath填充路徑層pDC-SelectObject(pOldBrush);NewBrush.DeleteObject();StrokeAndFillPath填充FillPath填充 BOOL PolyBezier(const POINT* lpPoints, int nCount );nlpP

42、oints是曲線的控制點(diǎn)組成的POINT結(jié)構(gòu)數(shù)組指針;nnCount表示lpPoints數(shù)組中的數(shù)組元素個(gè)數(shù) ;n每段貝賽爾曲線要求2個(gè)中間控制點(diǎn)和1個(gè)終止控制點(diǎn)。第一段Bezier曲線還要求1個(gè)起始控制點(diǎn)。nPolyBezier()函數(shù)可以繪制一段或多段Bezier曲線。繪制多段Bezier曲線時(shí),除第一段曲線使用4個(gè)控制點(diǎn)外,其余各段曲線僅使用3個(gè)控制點(diǎn),因?yàn)楹竺嬉欢吻€總把前一段曲線的終止控制點(diǎn)作為自己的起始控制點(diǎn)。只繪制一段Bezier曲線時(shí),參數(shù)lpPoints應(yīng)為4。繪制n段Bezier曲線時(shí),參數(shù)lpPoints應(yīng)為n31。nBezier曲線使用當(dāng)前畫(huà)筆繪制曲線,并且一般不閉合,

43、因此不填充內(nèi)部。nPolyBezier()函數(shù)不更新當(dāng)前點(diǎn)位置。n繪制兩段Bezier曲線時(shí),存在第二段Bezier曲線和第一段Bezier曲線的連接問(wèn)題,稱為Bezier曲線的拼接。拼接兩段Bezier曲線時(shí),需要滿足一定的連續(xù)條件。如果第二段Bezier曲線任意給定,那么兩段Bezier曲線之間只能在拼接點(diǎn)處滿足端點(diǎn)連續(xù),兩段Bezier曲線不能光滑過(guò)渡;如果需要滿足光滑過(guò)渡,則要求第一段Beizer曲線的最后兩個(gè)控制點(diǎn)和第二段Bezier曲線的第1個(gè)控制點(diǎn)共線。例2-15給定圖2-47所示7個(gè)控制點(diǎn)p0(-350,-100)、p1(-250,100)、p2(0,130)、p3(50,-5

44、0)、p5(350,-20)、p6(250,130)。使用黑色畫(huà)筆繪制控制多邊形,使用藍(lán)色畫(huà)筆繪制兩段Bezier曲線。要求兩段Bezier曲線光滑連接,也就是說(shuō)p4控制點(diǎn)與p2、p3控制點(diǎn)共線。設(shè)p4點(diǎn)的x坐標(biāo)為90,請(qǐng)根據(jù)直線方程計(jì)算p4點(diǎn)的y坐標(biāo)并繪制光滑拼接的兩段Bezier曲線。void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCPoint p7;p0=CPoint(-350,-100);p

45、1=CPoint(-250,100);p2=CPoint(0,130);p3=CPoint(50,-50);double k=(p3.y-p2.y)/(p3.x-p2.x);double x=90,y=k*(x-p3.x)+p3.y;p4=CPoint(Round(x),Round(y);p5=CPoint(350,-20);p6=CPoint(250,130); for(int i=0;iMoveTo(pi);elsepDC-LineTo(pi);pDC-Ellipse(pi.x-5,pi.y-5,pi.x+5,pi.y+5);CPen NewPen,*pOldPen; NewPen.Cre

46、atePen(PS_SOLID,1,RGB(0,0,255);pOldPen=pDC-SelectObject(&NewPen);pDC-PolyBezier(p,7);/繪制Bezier曲線pDC-SelectObject(pOldPen);(1 1)創(chuàng)建位圖函數(shù))創(chuàng)建位圖函數(shù)BOOL CreateCompatibleBitmap( CDCBOOL CreateCompatibleBitmap( CDC* * pDC, int nWidth, pDC, int nWidth, int nHeight );int nHeight ); npDC是顯示設(shè)備上下文指針,nWidth是位圖寬

47、度,nHeight是位圖高度。 nCreateCompatibleBitmap()函數(shù)為指定的顯示設(shè)備上下文創(chuàng)建一個(gè)指定寬度和高度的兼容位圖,該位圖可以選為與指定的顯示設(shè)備上下文兼容的內(nèi)存設(shè)備上下文的當(dāng)前位圖。n本函數(shù)創(chuàng)建的是黑色單色位圖,可以使用FillSolidRect()函數(shù)將其填充為白色。(2)導(dǎo)入位圖函數(shù)BOOL LoadBitmap( UINT nIDResource );nnIDResource是資源的ID編號(hào) 。n本函數(shù)可以將一幅彩色DIB位圖導(dǎo)入資源中。如果圖片的是256色,可以直接顯示在MFC的位圖編輯器中。如果是24位真彩色位圖,不能在MFC的位圖編輯器中顯示,但仍可以正

48、常使用。(3)創(chuàng)建與指定設(shè)備兼容的內(nèi)存設(shè)備上下文函數(shù) virtual BOOL CreateCompatibleDC( CDC* pDC );n顯示設(shè)備上下文支持光柵操作。內(nèi)存設(shè)備上下文環(huán)境是一塊內(nèi)存區(qū)域,用于準(zhǔn)備圖像。在向顯示器拷貝圖像之前,內(nèi)存設(shè)備上下文必須與顯示設(shè)備上下文兼容。n當(dāng)內(nèi)存設(shè)備上下文被創(chuàng)建時(shí),是標(biāo)準(zhǔn)的11個(gè)單色像素位圖。在使用內(nèi)存設(shè)備上下文之前,必須先創(chuàng)建或選入一個(gè)高和寬都正確的位圖。(4)傳送位圖函數(shù) BOOL BitBlt( int x, int y, int nWidth, int Height, CDC* pSrcDC, int xSrc, int ySrc, DWO

49、RD dwRop );nx,y是目標(biāo)矩形區(qū)域的左上角點(diǎn)坐標(biāo),nWidth和nHeight是目標(biāo)區(qū)域和源圖像的寬度和高度,pSrcDC是源設(shè)備上下文的指針,xSrc和ySrc是源位圖的左上角點(diǎn)坐標(biāo), dwRop是光柵操作碼,光柵操作碼有多種,最常用的是SRCCOPY,表示將源位圖直接拷貝到目標(biāo)設(shè)備上下文中。nBitBlt ()函數(shù)對(duì)指定的源設(shè)備上下文區(qū)域中的像素進(jìn)行位塊轉(zhuǎn)換,以傳送到目標(biāo)設(shè)備上下文中。例2-16 在屏幕客戶區(qū)顯示圖2-48所示的about.bmp(300225)。在1024768的分辨率下,屏幕客戶區(qū)的大小為(1020628)。使用自定義坐標(biāo)系,該位圖顯示在屏幕的左下角。將窗口的

50、顯示狀態(tài)設(shè)為極大化顯示,程序運(yùn)行效果如圖2-49所示。void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCRect rect;GetClientRect(&rect);pDC-SetMapMode(MM_ANISOTROPICpDC-SetWindowExt(rect.Width(),rect.Height();pDC-SetViewportExt(rect.Width(),-rect.Hei

51、ght();pDC-SetViewportOrg(rect.Width()/2,rect.Height()/2);CDC MemDC;/定義一個(gè)內(nèi)存設(shè)備上下文CBitmap NewBitmap,*pOldBitmap; NewBitmap.LoadBitmap(IDB_ABOUT);/about.bmpBITMAP bmp;NewBitmap.GetBitmap(&bmp);MemDC.CreateCompatibleDC(pDC);pOldBitmap=MemDC.SelectObject(&NewBitmap);MemDC.SetMapMode(MM_ANISOTROPIC

52、);MemDC.SetWindowExt(bmp.bmWidth,bmp.bmHeight);MemDC.SetViewportExt(bmp.bmWidth,-bmp.bmHeight);MemDC.SetViewportOrg(bmp.bmWidth/2,bmp.bmHeight/2);pDC-BitBlt(-rect.Width()/2,-rect.Height()/2,rect.Width(), rect.Height(), &MemDC,-bmp.bmWidth/2,-bmp.bmHeight/2,SRCCOPY); MemDC.SelectObject(pOldBitmap

53、);(1)(1)設(shè)置文本顏色函數(shù)設(shè)置文本顏色函數(shù)virtual COLORREF SetTextColor(COLORREF crColor);virtual COLORREF SetTextColor(COLORREF crColor);(2)(2)設(shè)置文本背景模式函數(shù)設(shè)置文本背景模式函數(shù)int SetBkMode( int nBkMode );int SetBkMode( int nBkMode );nOPAQUEOPAQUE文本背景用當(dāng)前背景顏色填充,這是默認(rèn)的文文本背景用當(dāng)前背景顏色填充,這是默認(rèn)的文本背景模式;本背景模式;nTRANSPARENTTRANSPARENT文本背景透明。文

54、本背景透明。 (3)(3)設(shè)置文本背景顏色函數(shù)設(shè)置文本背景顏色函數(shù)virtual COLORREF SetBkColor(COLORREF crColor);virtual COLORREF SetBkColor(COLORREF crColor);(4)(4)輸出文本函數(shù)輸出文本函數(shù) BOOL TextOut( int x, int y, const CString& str );BOOL TextOut( int x, int y, const CString& str );nx x,y y是文本的起點(diǎn)邏輯坐標(biāo)是文本的起點(diǎn)邏輯坐標(biāo); ;nstrstr是是CStringCSt

55、ring對(duì)象。對(duì)象。12.圖形文本函數(shù)(5)設(shè)置文本格式函數(shù)void Format( LPCTSTR lpszFormat, . );式;nlpszFormat是格式控制字符串,如d、f、c等 。nCString類(lèi)的Forma()成員函數(shù)可將任意數(shù)據(jù)類(lèi)型轉(zhuǎn)換為CString字符串,常用于輸出數(shù)值型數(shù)據(jù)。 例2-17 使用默認(rèn)的文本背景模式在點(diǎn)(-200,20)處輸出黃底紅字“Compute Graphics Based on VC+!”;在(50,20)處輸出黃底紅字“BoChuang Research Institute”;使用透明文本背景模式在(-200,-20)處輸出黑色整數(shù)5和8;在(

56、0,-20)處輸出黑色雙精度小數(shù)5.2和8.3。 void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data here/自定義坐標(biāo)系pDC-SetTextColor(RGB(255,0,0);pDC-SetBkColor(RGB(255,255,0);pDC-TextOut(-200,20,Compute Graphics Based on VC+!);/輸出文本1CString data,str=BoChuang R

57、esearch Institute;data.Format(%s,str);/輸出文本2pDC-TextOut(50,20,data);pDC-SetTextColor(RGB(0,0,0);pDC-SetBkMode(TRANSPARENT);int i1=5,i2=8;double d1=5.2,d2=8.3;data.Format(%d,%d,i1,i2);/輸出整數(shù)pDC-TextOut(-200,-20,data);data.Format(%f,%f,d1,d2);/輸出小數(shù)pDC-TextOut(0,-20,data); 雙緩沖是一種基本的動(dòng)畫(huà)技術(shù)。創(chuàng)建一個(gè)與屏幕顯示設(shè)備上下文區(qū)域

58、一致的內(nèi)存設(shè)備上下文,將圖像先繪制到內(nèi)存設(shè)備上下文中,然后調(diào)用BitBlt()函數(shù)將內(nèi)存圖像復(fù)制到屏幕上,同時(shí)禁止背景刷新,可實(shí)現(xiàn)平滑動(dòng)畫(huà),而且消除了屏幕閃爍現(xiàn)象。例2-18 使用雙緩沖機(jī)制繪制旋轉(zhuǎn)的“陰陽(yáng)魚(yú)太極圖”。void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCRect rect;GetClientRect(&rect);pDC-SetMapMode(MM_ANISOTROPIC);p

59、DC-SetWindowExt(rect.Width(),rect.Height();pDC-SetViewportExt(rect.Width(),-rect.Height();pDC-SetViewportOrg(rect.Width()/2,rect.Height()/2);CDC MemDC;/內(nèi)存DCCBitmap NewBitmap,*pOldBitmap;/內(nèi)存中承載的臨時(shí)位圖 /建立與屏幕pDC兼容的MemDCMemDC.CreateCompatibleDC(pDC);NewBitmap.CreateCompatibleBitmap(pDC,rect. Width(),rect

60、.Height();/創(chuàng)建兼容位圖 /將兼容位圖選入MemDC pOldBitmap=MemDC.SelectObject(&NewBitmap); /按原來(lái)背景填充客戶區(qū),否則是黑色MemDC.FillSolidRect(&rect,pDC-GetBkColor();MemDC.SetMapMode(MM_ANISOTROPIC);/MemDC自定義坐標(biāo)系MemDC.SetWindowExt(rect.Width(),rect.Height();MemDC.SetViewportExt(rect.Width(),-rect.Height();MemDC.SetViewportOrg(rect.Width()/2,rect.Height()/2);DrawObject(&MemDC); /將內(nèi)存位圖拷貝到屏幕pDC-BitBlt(-rect.Width()/2,

溫馨提示

  • 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)論