第二章Visual C++60繪圖基礎_第1頁
第二章Visual C++60繪圖基礎_第2頁
第二章Visual C++60繪圖基礎_第3頁
第二章Visual C++60繪圖基礎_第4頁
第二章Visual C++60繪圖基礎_第5頁
已閱讀5頁,還剩76頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第二章第二章 2.1 2.1 面向對象程序設計基礎面向對象程序設計基礎2.2 MFC2.2 MFC上機操作步驟上機操作步驟2.3 MFC2.3 MFC基本繪圖函數(shù)基本繪圖函數(shù)2.4 2.4 本章小結本章小結習題習題2 2Turbo CTurbo C:n控制臺程序,不支持交互操作??刂婆_程序,不支持交互操作。n只能顯示只能顯示1616色,不能開發(fā)光照和帶陰影的程序。色,不能開發(fā)光照和帶陰影的程序。Turbo C 繪制的Menger海綿Visual C+:n可以顯示真彩色,有1678萬色。n支持交互式繪圖。Visual C+ 繪制的Menger海綿2.1.3對象的動態(tài)建立與釋放對象的動態(tài)建立與釋放

2、n類名 *指針變量名=new 類名(初始化式)ndelete 指向該對象的指針變量名n類名 *指針變量名=new 類名 下標表達式ndelete 指向該對象的指針變量名n類名 *指針變量名=new 類名*行下標表達式nfor(int i=0;i行下標表達式;i+) 指針變量名i=new類名列下標表達式;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ù),則繪制結果為橢圓。圓。如果刪除此函數(shù),則繪制結果為橢圓。整個屏幕區(qū)域的顯示器設備上下文類。包括客戶區(qū)整個屏幕區(qū)域的顯示器設備上下文類。包括客戶區(qū)(工具欄、狀態(tài)欄和視圖窗口的客戶區(qū))和非客戶區(qū)(工具欄、狀態(tài)欄和視圖窗口的客戶區(qū))和非客戶區(qū)(標題欄和菜單欄)。(標題欄和菜單欄)。CWin

4、dowDCCWindowDC允許在整個屏幕區(qū)域內進行繪圖,其構造函允許在整個屏幕區(qū)域內進行繪圖,其構造函數(shù)自動調用數(shù)自動調用GetWindowDC()GetWindowDC(),析構函數(shù)自動調用,析構函數(shù)自動調用ReleaseDC()ReleaseDC()函數(shù)。函數(shù)。CWindowDCCWindowDC中點(中點(0 0,0 0)在屏幕的左上角,而)在屏幕的左上角,而CClientDCCClientDC和和CPaintDCCPaintDC中點(中點(0 0,0 0)是屏幕客戶區(qū)的左)是屏幕客戶區(qū)的左上角。上角。如果在如果在CTestViewCTestView類中使用類中使用CWindowDCC

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

6、形左上角頂點和右下角頂點的坐標(toptop,leftleft,rightright,bottombottom)n構造函數(shù):構造函數(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類:存放矩形的寬度和高度的坐標(類:存放矩形的寬度和高度的坐標(cxcx,cycy),其中),其中cxcx為矩形的寬度,為矩形的寬度,cycy為矩形的高度。為矩形的高度。n構造函數(shù):構造函數(shù):CSize(int initCX,int initCY);CSize(int initCX,int initCY);n CSize(SIZE initSize); CSize(SIZE initSize);

8、繪圖工具類 nCGdiObjectCGdiObject類:類:GDIGDI繪圖工具的基類,一般不能直接繪圖工具的基類,一般不能直接使用。使用。nCBitmapCBitmap:封裝了一個:封裝了一個GDIGDI位圖,提供位圖操作的接位圖,提供位圖操作的接口??凇CBrushCBrush類:封裝了類:封裝了GDIGDI畫刷,可以選作設備上下文的畫刷,可以選作設備上下文的當前畫刷。畫刷用于填充圖形內部。當前畫刷。畫刷用于填充圖形內部。nCFontCFont:封裝了:封裝了GDIGDI字體,可以選作設備上下文中的字體,可以選作設備上下文中的當前字體。當前字體。nCPalletteCPallette:

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

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

11、_LOMETRIC0.1mm邏輯坐標。坐標原點位置可以自邏輯坐標。坐標原點位置可以自由設置,由設置,X軸向右,軸向右,Y軸向上。軸向上。MM_HIMETRIC0.01mm邏輯坐標。坐標原點位置可以自邏輯坐標。坐標原點位置可以自由設置,由設置,X軸向右,軸向右,Y軸向上。軸向上。MM_LOENGLISH0.01inch邏輯坐標。坐標原點位置可以自邏輯坐標。坐標原點位置可以自由設置,由設置,X軸向右,軸向右,Y軸向上。軸向上。MM_HIENGLISH0.001inch邏輯坐標。坐標原點位置可以自邏輯坐標。坐標原點位置可以自由設置,由設置,X軸向右,軸向右,Y軸向上。軸向上。模式代碼模式代碼坐標單位

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

13、-5 使用用戶自定義映射模式,設置窗口大小和使用用戶自定義映射模式,設置窗口大小和視區(qū)大小相等的二維坐標系。視區(qū)中視區(qū)大小相等的二維坐標系。視區(qū)中x x軸水平向右為正,軸水平向右為正,y y軸垂直向上為正,原點位于客戶區(qū)中心。軸垂直向上為正,原點位于客戶區(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);畫筆樣式畫筆樣式線型線型寬度寬度顏色顏色PS_SOLID實線實線任意指定任意指定純色純色PS_DASH虛線虛線1或者更小或者更小純色純色PS_DOT點線點線1或者更

15、小或者更小純色純色PS_DASHDOT點劃線點劃線1或者更小或者更小純色純色PS_DASHDOTDOT雙點劃線雙點劃線1或者更小或者更小純色純色PS_NULL不可見線不可見線任意指定任意指定純色純色PS_INSIDEFRAME 內框架線內框架線任意指定任意指定純色純色(1)創(chuàng)建實體畫刷函數(shù)BOOL CreateSolidBrush(COLORREF crColor);(2)創(chuàng)建陰影畫刷函數(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);將設備上下文中的原將設備上下文中的原GDI對象換為新對象,同時對象換為新對象,同時返回指向原對象的指針返回指向原對象的指針

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

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

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

20、使用GetPixel()函數(shù)依次讀出該正方形內各像素點的顏色,在x軸正向的對稱位置上重新繪制該正方形。 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是直角矩形的左上角點坐標;是直角矩形的左上角點坐標;nx2x2、y2y2是直角矩形的右下角點坐標;是直角矩形的右下角點坐標; (1)繪制直角矩形(2)繪制圓角矩形BOOL RoundRect( int x1, int y1, int x2, int y2, int x3, int y3 );nx1、y1是

23、圓角矩形的左上角點坐標;nx2、y2是圓角矩形的右下角點坐標;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是限定橢圓范圍的外接矩形左上角點的坐標;是限定橢圓范圍的外接矩形左上角點的坐標;nx2x2,y2y2是限定橢圓范圍的外接矩形右下角點的坐標;是限定橢圓范圍的外接矩形右下角點的坐標;nEllipse()Ellipse()函數(shù)使用當前畫刷填充橢圓內部,并使用函數(shù)使用當前畫刷填充橢圓內部,并使用當前畫筆繪制橢圓邊界線;當前畫筆繪制橢圓邊界線;nVC+VC+中沒有專門的畫圓函數(shù),只是把圓繪制為長半軸中沒有專門的畫圓函數(shù),只是把圓繪制為長半軸和短半軸相等的橢圓;和短半軸相等的橢圓;例例2-102-10 將客戶區(qū)矩形左右邊界各收縮100個像素,分別繪制矩

26、形、矩形內切圓和矩形內切橢圓。繪制過程按圓、橢圓和矩形順序完成。設定圓、橢圓和矩形的邊界線為1像素寬黑色實線,內部全部使用透明畫刷填充。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); /選擇透明畫刷 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是外接矩形左上角點坐標;是外接矩形左上角點坐標;nx2x2,y2y2是外接矩形右下角點坐標;是外接矩形右下角點坐標;nx3x3,y3y3為橢圓弧起點坐標,該參數(shù)不一定嚴格位于圓為橢圓弧起點坐標,該參數(shù)不一定嚴格位于圓弧上;弧上;nx4x4,y4y4為橢圓弧終點坐標,該參數(shù)也不一定嚴格位于為橢圓弧終點坐標,該參數(shù)也不一定嚴格位于橢圓弧上;橢圓弧上;n橢圓弧的真實起點是外接矩形中心點與(橢圓弧的真實起點是外接矩形中心點與(x3,y3x3,y3)點點所構成的射線與橢圓的交點;所構成的射線與橢圓的交點;n橢橢圓弧的真實終點是外接矩形中心點與(圓弧的真實終點是外接矩

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

30、例2-11 2-11 在客戶區(qū)內從12點到3點逆時針繪制黑色點劃線橢圓弧,從12點到3點順時針繪制藍色實線橢圓弧。 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扇形從起點到終點逆時針方向繪制;n扇形中心位置坐標是外接矩形的中心;n扇形使用直線連接扇形中心和扇形的起點和終點;nPie()函數(shù)使用當前畫刷填充扇形內部,并用當前畫筆繪制扇形邊界線;n扇形不包括右邊界坐標和下邊界坐標,即扇形寬度為x2-x1,高度為y2-y1。例2-12 繪制兩個扇形構成扇子形狀,使用位圖畫刷填充扇子內部。 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;/左下角點、右上角的、起點和終點dl=CPoint(-400,-600),tr=CPoint(400,200); /注意起點與終點坐標的順序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指定多邊形頂點數(shù)組中每一個頂點對,是一個POINT結構或CPoint對象;nnCount指定多邊形數(shù)組中的頂點個數(shù);nPolygon()函數(shù)使用當前畫筆繪制多邊形邊界線,使用當前畫刷填充多邊形內部;n多邊形自動閉合。例2-13 以正五邊形的5個頂點為基礎,隔點存儲構成五角星,p0p4為正五邊形的5個頂點,v0v4為五角星的5個頂點。填充模式采

36、用WINDING。五角星邊界線為5個像素寬的藍色實線,內部使用紅色填充。左下角點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);/定義紅色畫刷CBrush *pOldBrush=pDC-SelectObject(&brushRed);pDC-SetPolyFillMode(WINDING);/設置填充模式int r=200;/正五邊形外接圓半徑 CPoint p5;/定義正五邊形頂點數(shù)組double Alpha=2*PI/5;/定義每條邊的圓心角 for(int i=0;iPolygon(v,5);/繪制五角星pDC-SelectObject(pOldPen);/恢復畫筆pDC-SelectObject(pOldBrush);/恢復畫刷打開路徑層BOOL BeginPath();

38、關閉路徑圖層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)左側多邊形,水平右移360個像素繪制右側同樣形狀的多邊形,分別使用FillPath()函數(shù)填充左側多邊形,StrokeAndFillPath()函數(shù)填充右側多邊形。多邊形邊界線顏色保持默認黑色,內部填充為紅色,試觀察填充效果。 vo

39、id CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCPoint p7; /定義頂點數(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);/繪制左側多邊形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是曲線的控制點組成的POINT結構數(shù)組指針;nnCount表示lpPoints數(shù)組中的數(shù)組元素個數(shù) ;n每段貝賽爾曲線要求2個中間控制點和1個終止控制點。第一段Bezier曲線還要求1個起始控制點。nPolyBezier()函數(shù)可以繪制一段或多段Bezier曲線。繪制多段Bezier曲線時,除第一段曲線使用4個控制點外,其余各段曲線僅使用3個控制點,因為后面一段曲線總把前一段曲線的終止控制點作為自己的起始控制點。只繪制一段Bezier曲線時,參數(shù)lpPoints應為4。繪制n段Bezier曲線時,參數(shù)lpPoints應為n31。nBezier曲線使用當前畫筆繪制曲線,并且一般不閉合,

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

44、0)、p5(350,-20)、p6(250,130)。使用黑色畫筆繪制控制多邊形,使用藍色畫筆繪制兩段Bezier曲線。要求兩段Bezier曲線光滑連接,也就是說p4控制點與p2、p3控制點共線。設p4點的x坐標為90,請根據直線方程計算p4點的y坐標并繪制光滑拼接的兩段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是顯示設備上下文指針,nWidth是位圖寬

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

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

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

50、顯示狀態(tài)設為極大化顯示,程序運行效果如圖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;/定義一個內存設備上下文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ù)virtual COLORREF SetTextColor(COLORREF crColor);virtual COLORREF SetTextColor(COLORREF crColor);(2)(2)設置文本背景模式函數(shù)設置文本背景模式函數(shù)int SetBkMode( int nBkMode );int SetBkMode( int nBkMode );nOPAQUEOPAQUE文本背景用當前背景顏色填充,這是默認的文文本背景用當前背景顏色填充,這是默認的文本背景模式;本背景模式;nTRANSPARENTTRANSPARENT文本背景透明。文

54、本背景透明。 (3)(3)設置文本背景顏色函數(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是文本的起點邏輯坐標是文本的起點邏輯坐標; ;nstrstr是是CStringCSt

55、ring對象。對象。12.圖形文本函數(shù)(5)設置文本格式函數(shù)void Format( LPCTSTR lpszFormat, . );式;nlpszFormat是格式控制字符串,如d、f、c等 。nCString類的Forma()成員函數(shù)可將任意數(shù)據類型轉換為CString字符串,常用于輸出數(shù)值型數(shù)據。 例2-17 使用默認的文本背景模式在點(-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/自定義坐標系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); 雙緩沖是一種基本的動畫技術。創(chuàng)建一個與屏幕顯示設備上下文區(qū)域

58、一致的內存設備上下文,將圖像先繪制到內存設備上下文中,然后調用BitBlt()函數(shù)將內存圖像復制到屏幕上,同時禁止背景刷新,可實現(xiàn)平滑動畫,而且消除了屏幕閃爍現(xiàn)象。例2-18 使用雙緩沖機制繪制旋轉的“陰陽魚太極圖”。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;/內存DCCBitmap NewBitmap,*pOldBitmap;/內存中承載的臨時位圖 /建立與屏幕pDC兼容的MemDCMemDC.CreateCompatibleDC(pDC);NewBitmap.CreateCompatibleBitmap(pDC,rect. Width(),rect

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

溫馨提示

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

評論

0/150

提交評論