计算机图形学基础教程_第1页
计算机图形学基础教程_第2页
计算机图形学基础教程_第3页
计算机图形学基础教程_第4页
计算机图形学基础教程_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第二章第二章nTurbo CTurbo Cn控制台程序,不支持鼠标和键盘操作。控制台程序,不支持鼠标和键盘操作。n只能显示只能显示1616色,不能绘制光照和带阴影的图色,不能绘制光照和带阴影的图形。形。Turbo C 开发的Sierpinksy海绵Visual C+Visual C+的的MFCMFC可以显示可以显示16781678万种真彩色,支持光万种真彩色,支持光照模型的开发。照模型的开发。支持交互式绘图。支持交互式绘图。MFC 开发的Sierpinksy海绵void main()/主函数CRect rect(30,20),*p=▭/定义对象和对象指针/用对象输出周长和面积

2、cout周长为:rect.circum()endl;/输出周长cout面积为:rect.area()endl;/输出面积/用对象指针输出周长和面积cout周长为:circum()endl;/输出周长cout面积为:area()endl;/输出面积CRect:CRect(int len,int wid)/定义带参构造函数length=len;width=wid;cout建立对象endl;CRect:CRect()/定义析构函数cout撤销对象endl;double CRect:circum()/定义周长函数return 2*(length+width);double CRect:area()/定

3、义面积函数return length*width; #includeiostream.hclass CRect/定义长方形类public:CRect(int,int);/声明带参构造函数CRect();/声明析构函数double circum();/声明周长函数double area();/声明面积函数private:int length;/声明长方形的长度int width;/声明长方形的宽度; void main()CCube *p=new CCube(30,20,100);cout立方体的体积为:volume()endl;delete p;CRect:CRect(int len,int

4、wid) /基类带参构造函数length=len;width=wid;cout建立基类对象endl;CRect:CRect()/基类析构函数cout撤销基类对象endl;double CRect:area()/基类面积函数return length*width;double CRect:circum()/基类周长函数return 2*(length+width);#includeiostream.hclass CRect/基类 public:CRect(int,int); CRect();double circum();double area();protected:int length;in

5、t width;class CCube:public CRect/公有继承派生类public:CCube(int,int,int);CCube();double volume();/新增面积成员函数private:int height; /新增高度数据成员;CCube:CCube(int len,int wid,int hei):CRect(len,wid) /派生类构造函数height=hei;cout建立派生类对象endl; CCube:CCube()/派生类析构函数cout撤销派生类对象SetPixel(20,20,RGB(255,0,0);pDC-SetPixel(20,20,RGB(

6、255,0,0);c=pDC-GetPixel(20,20);c=pDC-GetPixel(20,20);pDC-SetPixel(60,20,c);pDC-SetPixel(60,20,c); 画笔绘制边界默认的画笔是画笔绘制边界默认的画笔是1 1像素宽的黑色实线笔。像素宽的黑色实线笔。 风格代码线型宽度颜色PS_SOLID实线任意指定纯色PS_DASH虚线1(不可任意指定)纯色PS_DOT点线1(不可任意指定)纯色PS_DASHDOT点划线1(不可任意指定)纯色PS_DASHDOTDOT双点画线1(不可任意指定)纯色PS_NULL不可见线1(不可任意指定)纯色PS_INSIDEFRAME内

7、框架线任意指定纯色类属:类属:CPen:CreatPen CPen:CreatPen 原型:原型:BOOL CreatePen(int nPenStyleBOOL CreatePen(int nPenStyle,int nWidthint nWidth, COLORREF crColor); COLORREF crColor);返回值:非零。返回值:非零。参数说明:参数说明:第一个参数第一个参数nPenStylenPenStyle是画笔的风格代码,第二个参数是画笔的风格代码,第二个参数nWidthnWidth是画笔的宽度,第三个参数是画笔的宽度,第三个参数crColorcrColor是画笔的颜

8、是画笔的颜色。色。类属:类属:CPen:SelectObject CPen:SelectObject 原型:原型:Cpen Cpen * *SelectObject(Cpen SelectObject(Cpen * *pPen);pPen);返回值:被替代画笔的指针。返回值:被替代画笔的指针。参数说明:参数参数说明:参数pPenpPen是是CpenCpen类的被选中的新画笔对象指类的被选中的新画笔对象指针。本函数把原画笔换成新画笔,同时返回指向原画笔针。本函数把原画笔换成新画笔,同时返回指向原画笔的指针。的指针。类属:类属:CGdiObject:DeleteObject CGdiObject:

9、DeleteObject 原型:原型:BOOL DeleteObject( );BOOL DeleteObject( );返回值:非零。返回值:非零。参数说明:画笔使用完毕,把已成自由状态的画笔从参数说明:画笔使用完毕,把已成自由状态的画笔从系统内存中清除。系统内存中清除。类属:类属:CDC:SelectStockObject CDC:SelectStockObject 原型:原型:virtual CGdiObjectvirtual CGdiObject * *SelectStockObject(int nIndex);SelectStockObject(int nIndex);返回值:被替代

10、的返回值:被替代的CGdiObjectCGdiObject类对象的指针。类对象的指针。 参数说明:参数参数说明:参数nIndexnIndex是库笔代码。是库笔代码。 Windows Windows系统中准备了一些使用频率较高的画笔,不系统中准备了一些使用频率较高的画笔,不需要创建,可以直接选用。同样,使用完库画笔时需要创建,可以直接选用。同样,使用完库画笔时也不需要调用也不需要调用DeleteObject()DeleteObject()函数从内存中删除已函数从内存中删除已使用过的画笔。使用过的画笔。库笔代码库笔代码含义含义BLACK_PEN宽度为1的黑笔实线笔WHITE_PEN宽度为1的白笔实

11、线笔NULL_PEN 透明笔VC+VC+中的画刷用于对图形内部进行填充。中的画刷用于对图形内部进行填充。创建实体画刷函数创建实体画刷函数BOOL CreateSolidBrush(COLORREF crColor );BOOL CreateSolidBrush(COLORREF crColor );选择画刷函数选择画刷函数CBrush CBrush * *SelectObject(CBrush SelectObject(CBrush * *pBrush );pBrush );删除画刷函数删除画刷函数BOOL DeleteObject( );BOOL DeleteObject( );创建阴影画刷

12、函数创建阴影画刷函数BOOL CreateHatchBrush(int nIndex,COLORREF BOOL CreateHatchBrush(int nIndex,COLORREF crColor);crColor);第一个参数第一个参数nIndexnIndex是阴影样式代码,第二个参数是阴影样式代码,第二个参数crColorcrColor是阴影线的颜色是阴影线的颜色选择一只库画刷函数选择一只库画刷函数virtual CGdiObject virtual CGdiObject * *SelectStockObject(int SelectStockObject(int nIndex);n

13、Index);阴影样式代码含义HS_BDIAGONAL45下降阴影线(从左到右)HS_CROSS水平和垂直交叉阴影线HS_DIAGCROSS45十字交叉阴影线HS_FDIAGONAL45上升阴影线(从左到右)HS_HORIZONTAL水平阴影线HS_VERTICAL垂直阴影线库画刷代码含义对应的RGBBLACK_BRUSH黑色的实心刷子RGB(0,0,0)DKGRAY_BRUSH暗灰色的实心刷子RGB(64,64,64)GRAY_BRUSH灰色的实心刷子RGB(128,128,128)LTGRAY_BRUSH淡灰色的实心刷子RGB(192,192,192)WHITE_BRUSH白色的实心刷子R

14、GB(255,255,255)NULL_BRUSH透明刷子HOLLOW_BRUSH空心刷子设置直线的起点位置设置直线的起点位置CPoint MoveTo(int xCPoint MoveTo(int x,int y);int y);设置直线的终点位置设置直线的终点位置BOOL LineTo (int xBOOL LineTo (int x,int y);int y);参数说明:参数说明:采用起点闭区间,终点开区间的处理方法,绘制直线采用起点闭区间,终点开区间的处理方法,绘制直线的函数不指定直线的颜色,直线颜色可以通过画笔函的函数不指定直线的颜色,直线颜色可以通过画笔函数来指定。数来指定。voi

15、d CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);CPen NewPen,*pOldPen; NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255); pOldPen=pDC-SelectObject(&NewPen);pDC-MoveTo(20,30);pDC-LineTo(200,300);pDC-SelectObject(pOldPen);NewPen.DeleteObject();类属:类属:CDC:Rectangle CDC:Rectangle

16、原型原型:BOOL Rectangle(int x1BOOL Rectangle(int x1,int y1int y1,int x2int x2,int int y2);y2);返回值:非零。返回值:非零。参数说明:参数说明:该函数使用当前画刷填充矩形内部,并用当该函数使用当前画刷填充矩形内部,并用当前画笔绘制矩形边界线。前画笔绘制矩形边界线。例例6 6 绘制左上角点为(绘制左上角点为(100,100)100,100),右下角点为,右下角点为(600,300600,300)的矩形。矩形边框为一像素宽的蓝色边)的矩形。矩形边框为一像素宽的蓝色边界线,内部填充红色。界线,内部填充红色。 void

17、 CTestView:OnDraw(CDCvoid CTestView:OnDraw(CDC* * pDC) pDC) CTestDocCTestDoc* * pDoc = GetDocument(); pDoc = GetDocument();ASSERT_VALID(pDoc);ASSERT_VALID(pDoc);CPen NewPen,CPen NewPen,* *pOldPen; pOldPen; NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255); NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255); pOldPen=pD

18、C-SelectObject(&NewPen); pOldPen=pDC-SelectObject(&NewPen);CBrush NewBrush,CBrush NewBrush,* *pOldBrush;pOldBrush;NewBrush.CreateSolidBrush(RGB(255,0,0);NewBrush.CreateSolidBrush(RGB(255,0,0); pOldBrush=pDC-SelectObject(&NewBrush); pOldBrush=pDC-SelectObject(&NewBrush); pDC-Rectangle

19、(100,100,600,300);/ pDC-Rectangle(100,100,600,300);/画矩形画矩形 pDC-SelectObject(pOldPen); / pDC-SelectObject(pOldPen); /框线为蓝色框线为蓝色 NewPen.DeleteObject(); NewPen.DeleteObject(); pDC-SelectObject(pOldBrush); / pDC-SelectObject(pOldBrush); /填充为红色填充为红色NewBrush.DeleteObject();NewBrush.DeleteObject(); 类属:类属:C

20、DC:Ellipse CDC:Ellipse 原型原型:BOOL Ellipse(int x1BOOL Ellipse(int x1,int y1int y1,int x2int x2, int y2); int y2);返回值:非零。返回值:非零。参数说明:参数说明:EllipseEllipse函数中,参数函数中,参数x1x1,y1y1是限定椭是限定椭圆范围的外接矩形左上角点的坐标;参数圆范围的外接矩形左上角点的坐标;参数x2x2,y2y2是限定椭圆范围的外接矩形右下角点的坐标是限定椭圆范围的外接矩形右下角点的坐标. . 注意注意VC+VC+中没有专门的画圆函数,只是把圆中没有专门的画圆函数

21、,只是把圆绘制为长半轴和短半轴相等的椭圆。绘制为长半轴和短半轴相等的椭圆。EllipseEllipse函数函数使用当前画刷填充椭圆内部,并用当前画笔绘制使用当前画刷填充椭圆内部,并用当前画笔绘制椭圆边界线。椭圆边界线。例例7 7 将一个圆绘制在视区中央,圆的形状依据视区形状而将一个圆绘制在视区中央,圆的形状依据视区形状而定。当窗口的形状发生改变时,圆的形状也随之改变。坐定。当窗口的形状发生改变时,圆的形状也随之改变。坐标系的中点位于屏幕中心,标系的中点位于屏幕中心,X X轴向右,轴向右,Y Y轴向上。圆的边界轴向上。圆的边界为一像素宽的蓝色边界线,内部填充为红色。为一像素宽的蓝色边界线,内部填

22、充为红色。 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);pDC-SetWindowExt(Rect.Width(), Rect.Height(); pDC-SetViewportExt(Rect.Width(), -Rect.Height(); pDC-SetVi

23、ewportOrg(Rect.Width()/2, Rect.Height()/2); CPen NewPen,*pOldPen; NewPen.CreatePen(PS_SOLID,1,RGB(0,0,255); pOldPen=pDC-SelectObject(&NewPen); CBrush NewBrush,*pOldBrush; NewBrush.CreateSolidBrush(RGB(255,0,0); pOldBrush=pDC-SelectObject(&NewBrush); pDC-Ellipse(-Rect.Width()/2,Rect.Height()/

24、2, Rect.Width()/2,-Rect.Height()/2); pDC-SelectObject(pOldPen); NewPen.DeleteObject(); pDC-SelectObject(pOldBrush); NewBrush.DeleteObject();void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCPen NewPen,*pOldPen; NewPen.CreatePe

25、n(PS_SOLID,1,RGB(0,0,255); pOldPen=pDC-SelectObject(&NewPen);pDC-Arc(100,100,600,300,100,200, 350,600);pDC-SelectObject(pOldPen);NewPen.DeleteObject();BOOL Polygon(LPPOINT lpPointsBOOL Polygon(LPPOINT lpPoints,int Count);int Count);参数说明:参数说明:第一个参数第一个参数lpPointslpPoints指定多边形顶点数组中每一个顶指定多边形顶点数组中每一个顶

26、点是一个点是一个POINTPOINT结构或结构或CPointCPoint对象。对象。第二个参数第二个参数nCountnCount指定多边形数组中的顶点个数。指定多边形数组中的顶点个数。该函数用当前画笔绘制多边形边界线,用当前画刷填该函数用当前画笔绘制多边形边界线,用当前画刷填充多边形内部。充多边形内部。void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCRect Rect;GetClientRect(

27、&Rect); CPen NewPen(PS_SOLID,5,RGB(0,0,255); CPen* pOldPen=pDC-SelectObject(&NewPen); CBrush NewBrush(RGB(255,0,0); CBrush *pOldBrush = pDC-SelectObject(&NewBrush); CPoint p4; p0.x=Rect.left+Rect.Width()/2;p0.y=Rect.top; p1.x=Rect.right;p1.y=Rect.top+Rect.Height()/2;p2.x=p0.x;p2.y=Rect.b

28、ottom; p3.x=Rect.left;p3.y=p1.y; pDC-Polygon(p,4); pDC-SelectObject(pOldPen); pDC-SelectObject(pOldBrush); 类属:类属:CDC:FillRect CDC:FillRect 原型:原型:void FillRect(LPCRECT lpRectvoid FillRect(LPCRECT lpRect,CBrush CBrush * *pBrush);pBrush);返回值:无。返回值:无。参数说明:参数说明:第一个参数第一个参数lpRectlpRect指定矩形,是一个指定矩形,是一个RectR

29、ect结构或结构或CRectCRect对象;对象;第二个参数第二个参数pBrushpBrush指定画刷对象指针。指定画刷对象指针。该函数将用当前画刷填充矩形内部,但不画边界线。该函数将用当前画刷填充矩形内部,但不画边界线。void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCRect Rect;CBrush pNewBrush(RGB(255,0,0);CBrush *pOldBrush=pDC-Sel

30、ectObject(&pNewBrush);/定义红色画刷定义红色画刷Rect.left=100;Rect.top=100;Rect.right=400;Rect.bottom=200;pDC-FillRect(Rect,&pNewBrush);/填充矩形内部填充矩形内部pDC-SelectObject(pOldBrush);/恢复画刷恢复画刷。void CTestView:OnDraw(CDC* pDC) CTestDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); / TODO: add draw code for native d

31、ata here /绘制第1个多边形,用路径层填充 CPoint p7; p0=CPoint(340,240);p1=CPoint(260,160); p2=CPoint(220,260);p3=CPoint(260,370); p4=CPoint(320,300);p5=CPoint(360,380); p6=CPoint(440,220); CBrush NewBrush; NewBrush.CreateSolidBrush(RGB(255,0,0); CBrush *pOldBrush=pDC-SelectObject(&NewBrush); pDC-BeginPath(); p

32、DC-MoveTo(p0); /绘制多边形 for(int i=1;iLineTo(pi); pDC-LineTo(p0); pDC-EndPath(); pDC-FillPath(); /填充多边形 pDC-TextOut(230,450,FillPath函数填充多边形); /绘制第2个多边形,用画刷填充 p0=CPoint(740,240);p1=CPoint(660,160); p2=CPoint(620,260);p3=CPoint(660,370); p4=CPoint(720,300);p5=CPoint(760,380); p6=CPoint(840,220); pDC-Poly

33、gon(p,7); /绘制并填充多边形 pDC-TextOut(630,450,Polygon函数填充多边形); pDC-SelectObject(pOldBrush); NewBrush.DeleteObject();导入位图导入位图BOOL LoadBitmap(UINT nIDResource );BOOL LoadBitmap(UINT nIDResource );参数参数nIDResourcenIDResource是资源的是资源的IDID编号编号建立与位图相应的内存设备上下文建立与位图相应的内存设备上下文virtual BOOL CreateCompatibleDC( CDCvirt

34、ual BOOL CreateCompatibleDC( CDC* * pDC ); pDC );参数参数pDCpDC是设备上下文的指针,用于在向屏幕输出图形是设备上下文的指针,用于在向屏幕输出图形前作准备。前作准备。选择位图函数选择位图函数CBitmap CBitmap * *SelectObject( CBitmap SelectObject( CBitmap * *pBitmap );pBitmap );参数参数pBitmappBitmap是是CBitmapCBitmap类的被选中的新位图指针对象。类的被选中的新位图指针对象。把原位图换成新位图,同时返回指向原位图的指针。把原位图换成新位

35、图,同时返回指向原位图的指针。传送位图函数传送位图函数BOOL BitBlt( int x, int y, int nWidth, int BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDCnHeight, CDC* * pSrcDC, int xSrc, int ySrc, DWORD pSrcDC, int xSrc, int ySrc, DWORD dwRop );dwRop );参数参数x x,y y是目标区域的左上角点坐标是目标区域的左上角点坐标参数参数nWidthnWidth和和nHeightnHeight是目标区域的宽度

36、和高度是目标区域的宽度和高度参数参数pSrcDCpSrcDC是源设备上下文的指针是源设备上下文的指针参数参数xSrcxSrc和和ySrcySrc是源位图的左上角点坐标是源位图的左上角点坐标参数参数dwRopdwRop是光栅操作码是光栅操作码例如例如dwRopdwRopSRCCOPYSRCCOPY,表示将原位图直接拷贝到目标位,表示将原位图直接拷贝到目标位图。图。void CTestView:OnDraw(CDC* pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data

37、 hereCRect Rect;GetClientRect(&Rect); CDC MemDC; CBitmap NewBitmap,*pOldBitmap; NewBitmap.LoadBitmap(IDB_BITMAP1); MemDC.CreateCompatibleDC(pDC); pOldBitmap=MemDC.SelectObject(&NewBitmap);pDC-BitBlt(0,0,Rect.Width(),Rect.Height(), &MemDC,0,0,SRCCOPY);MemDC.SelectObject(pOldBitmap); 文本颜色设

38、置函数文本颜色设置函数类属:类属:CDC:SetTextColorCDC:SetTextColor原型:原型:virtual COLORREFSetTextColor( COLORREF virtual COLORREFSetTextColor( COLORREF crColor); crColor);返回值:原文本颜色的返回值:原文本颜色的RGBRGB值。值。参数说明:指定文本颜色。参数说明:指定文本颜色。 文本背景颜色设置函数文本背景颜色设置函数类属:类属:CDC:SetBkColorCDC:SetBkColor原型:原型:virtual COLORREFSetBkColor( COLOR

39、REF virtual COLORREFSetBkColor( COLORREF crColor); crColor);返回值:原文本背景色的返回值:原文本背景色的RGBRGB值。值。参数说明:指定文本背景颜色。参数说明:指定文本背景颜色。(3)(3)文本背景模式设置函数文本背景模式设置函数类属:类属:CDC:SetBkModeCDC:SetBkMode原型:原型:virtual COLORREF SetBkColor(int nBkMode);virtual COLORREF SetBkColor(int nBkMode);返回值:原文本背景色的返回值:原文本背景色的RGBRGB值。值。参数

40、说明:参数说明:nBkModenBkMode指定文本是否透明,有两个取值:指定文本是否透明,有两个取值:OPAQUE OPAQUE 文本背景用当前背景颜色填充;文本背景用当前背景颜色填充;TRANSPARENTTRANSPARENT文文本背景透明。本背景透明。(4)(4)文本输出函数文本输出函数类属:类属:CDC:TextOutCDC:TextOut原型:原型:BOOL TextOut(int xBOOL TextOut(int x,int yint y,const CString& const CString& str);str);返回值:非零。返回值:非零。参数说明:参数参

41、数说明:参数x x,y y是文本的起点坐标,参数是文本的起点坐标,参数strstr是是CStringCString对象。对象。 文本格式函数文本格式函数类属:类属:CString:FormatCString:Format原型:原型:void Format( LPCTSTR lpszFormat, . );void Format( LPCTSTR lpszFormat, . );返回值:无。返回值:无。参数说明:参数参数说明:参数lpszFormatlpszFormat是格式控制字符串,如是格式控制字符串,如d d、f f、c c等。等。 此成员函数用来将格式化数据写入一个此成员函数用来将格式化

42、数据写入一个CStringCString中中, ,其方法就像其方法就像sprintfsprintf函数向一个函数向一个C-C-风格的字符数组风格的字符数组中格式化输出数据一样中格式化输出数据一样void CTestView:OnDraw(CDCvoid CTestView:OnDraw(CDC* * pDC) pDC) CTestDocCTestDoc* * pDoc = GetDocument(); pDoc = GetDocument();ASSERT_VALID(pDoc);ASSERT_VALID(pDoc); / TODO: add draw code for native data

43、 here / TODO: add draw code for native data here int a1=5,b1=8;int a1=5,b1=8; double a2=5.2,b2=8.3; double a2=5.2,b2=8.3; CString data,c=BoChuang Research Institute; CString data,c=BoChuang Research Institute; pDC-SetTextColor(RGB(255,0,0); pDC-SetTextColor(RGB(255,0,0); pDC-SetBkColor(RGB(255,255,0

44、); pDC-SetBkColor(RGB(255,255,0); pDC-TextOut(100,100,Compute Graphics Based on pDC-TextOut(100,100,Compute Graphics Based on VC+!);/ VC+!);/输出文本输出文本1 1 data.Format(%s,c);/ data.Format(%s,c);/输出文本输出文本2 2 pDC-TextOut(330,100,data); pDC-TextOut(330,100,data); data.Format(%d,%d,a1,b1);/ data.Format(%d,

45、%d,a1,b1);/输出整数输出整数 pDC-TextOut(100,130,data); pDC-TextOut(100,130,data); data.Format(%f,%f,a2,b2);/ data.Format(%f,%f,a2,b2);/输出小数输出小数 pDC-TextOut(130,130,data); pDC-TextOut(130,130,data); MemDC.SetMapMode(MM_ANISOTROPIC); MemDC.SetMapMode(MM_ANISOTROPIC);MemDC.SetWindowExt(Rect.Width(),Rect.Height

46、();MemDC.SetWindowExt(Rect.Width(),Rect.Height();MemDC.SetViewportExt(Rect.Width(),-Rect.Height();MemDC.SetViewportExt(Rect.Width(),-Rect.Height();MemDC.SetViewportOrg(Rect.Width()/2,Rect.Height()/2);MemDC.SetViewportOrg(Rect.Width()/2,Rect.Height()/2);MemDC.SelectStockObject(NULL_BRUSH);MemDC.Selec

47、tStockObject(NULL_BRUSH);for(int i=0;i20;i+)for(int i=0;iBitBlt(-Rect.Width()/2,-Rect.Height()/2,pDC-BitBlt(-Rect.Width()/2,-Rect.Height()/2, Rect.Width(),Rect.Height(),&MemDC,-Rect.Width()/2, Rect.Width(),Rect.Height(),&MemDC,-Rect.Width()/2, -Rect.Height()/2,SRCCOPY); -Rect.Height()/2,SRCC

48、OPY);MemDC.SelectObject(pOldBitmap);MemDC.SelectObject(pOldBitmap);NewBitmap.DeleteObject();NewBitmap.DeleteObject();MemDC.DeleteDC();MemDC.DeleteDC(); void CTestView:OnDraw(CDCvoid CTestView:OnDraw(CDC* * pDC) pDC) CTestDocCTestDoc* * pDoc = GetDocument(); pDoc = GetDocument();ASSERT_VALID(pDoc);AS

49、SERT_VALID(pDoc);/ TODO: add draw code for native data here/ TODO: add draw code for native data hereCRect Rect;CRect Rect;GetClientRect(&Rect);GetClientRect(&Rect);pDC-SetMapMode(MM_ANISOTROPIC);pDC-SetMapMode(MM_ANISOTROPIC);pDC-SetWindowExt(Rect.Width(),Rect.Height();pDC-SetWindowExt(Rect

50、.Width(),Rect.Height();pDC-SetViewportExt(Rect.Width(),-Rect.Height();pDC-SetViewportExt(Rect.Width(),-Rect.Height();pDC-SetViewportOrg(Rect.Width()/2,Rect.Height()/2);pDC-SetViewportOrg(Rect.Width()/2,Rect.Height()/2);CDC MemDC;CDC MemDC;CBitmap NewBitmap,CBitmap NewBitmap,* *pOldBitmap;pOldBitmap;

51、MemDC.CreateCompatibleDC(pDC); MemDC.CreateCompatibleDC(pDC); NewBitmap.CreateCompatibleBitmap(pDC,Rect.Width(),Rect.NewBitmap.CreateCompatibleBitmap(pDC,Rect.Width(),Rect.Height();Height();pOldBitmap=MemDC.SelectObject(&NewBitmap); pOldBitmap=MemDC.SelectObject(&NewBitmap); MemDC.FillSolidR

52、ect(Rect,pDC-GetBkColor();MemDC.FillSolidRect(Rect,pDC-GetBkColor(); 在在VC+VC+程序中输出图形和文本时,如果不在程序中输出图形和文本时,如果不在OnDrawOnDraw函数中输出,则需要设置输出对象的设备上下函数中输出,则需要设置输出对象的设备上下文,然后才能调用相应的文,然后才能调用相应的CDCCDC类的成员函数,最后还类的成员函数,最后还需要保证将设备上下文释放给需要保证将设备上下文释放给WindowsWindows,恢复原来的,恢复原来的状态以备下次调用。状态以备下次调用。 1.1.获得设备上下文获得设备上下文类属

53、:类属:CWnd:GetDC( )CWnd:GetDC( )原型:原型:CDCCDC* * GetDC( ); GetDC( );返回值:指定的客户区设备上下文指针。返回值:指定的客户区设备上下文指针。参数说明:获得指定的窗口客户区的设备上下文。参数说明:获得指定的窗口客户区的设备上下文。2.2.释放设备上下文释放设备上下文类属:类属:CWnd:ReleaseDCCWnd:ReleaseDC原型:原型:int ReleaseDC(CDCint ReleaseDC(CDC* * pDC); pDC);返回值:非零。返回值:非零。参数说明:释放指定客户区的设备上下文。参数说明:释放指定客户区的设备

54、上下文。第第1 1种方法:使用种方法:使用OnDrawOnDraw成员函数。成员函数。void CTestView:OnDraw(CDCvoid CTestView:OnDraw(CDC* * pDC) pDC) CTestDocCTestDoc* * pDoc = GetDocument(); pDoc = GetDocument();ASSERT_VALID(pDoc);ASSERT_VALID(pDoc);/ TODO: add draw code for native data here/ TODO: add draw code for native data herepDC-Move

55、To(20,30);pDC-MoveTo(20,30);pDC-LineTo(200,300);pDC-LineTo(200,300); 在在MFCMFC框架中的框架中的FileViewFileView面板中,双击面板中,双击TestView.cppTestView.cpp,在该文件最后添加成员函数在该文件最后添加成员函数DrawLineDrawLine的定义:的定义:void CTestView:DrawLine()void CTestView:DrawLine() CDC CDC * *pDC=GetDC();pDC=GetDC();pDC-MoveTo(20,30);pDC-MoveTo

56、(20,30);pDC-LineTo(200,300);pDC-LineTo(200,300);ReleaseDC(pDC);ReleaseDC(pDC); 第第2 2种方法:使用种方法:使用CDC CDC * *pDCpDC的菜单调用方式。的菜单调用方式。在在FileViewFileView面板中,双击面板中,双击TestView.hTestView.h,在该文件中的,在该文件中的“public:public:”下面加入成员函数声明:下面加入成员函数声明:void DrawLine();void DrawLine();在菜单中添加菜单函数在菜单中添加菜单函数OnMenudrawlineOnM

57、enudrawline调用调用DrawLineDrawLine成员函数。成员函数。void CTestView:OnMENU DrawmyLine( ) void CTestView:OnMENU DrawmyLine( ) / TODO: Add your command handler code here/ TODO: Add your command handler code hereDrawLine();DrawLine(); 第第3 3种方法:使用种方法:使用CClientDC dc(this)CClientDC dc(this)的菜单调用方式。的菜单调用方式。 本章是学习后续章节的基础,介绍了面向对象本章是学习后续章节的基础,介绍了面向对象程序设计基础,包括程序设计基础,包括C+C+的类、对象、继承等概念,的类、对象、继承等概念,供读者

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论