CDC类的主要绘图成员函数.docx

上传人:b****5 文档编号:30037103 上传时间:2023-08-04 格式:DOCX 页数:31 大小:221.25KB
下载 相关 举报
CDC类的主要绘图成员函数.docx_第1页
第1页 / 共31页
CDC类的主要绘图成员函数.docx_第2页
第2页 / 共31页
CDC类的主要绘图成员函数.docx_第3页
第3页 / 共31页
CDC类的主要绘图成员函数.docx_第4页
第4页 / 共31页
CDC类的主要绘图成员函数.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

CDC类的主要绘图成员函数.docx

《CDC类的主要绘图成员函数.docx》由会员分享,可在线阅读,更多相关《CDC类的主要绘图成员函数.docx(31页珍藏版)》请在冰豆网上搜索。

CDC类的主要绘图成员函数.docx

CDC类的主要绘图成员函数

CDC类的主要绘图成员函数

CDC类中常用绘图函数

1)绘制像素函数

原型:

COLORREFSetPixel(intx,inty,COLORREFcrColor);

设置某像素点的RGB值

2)获取像素颜色函数

原型:

COLORREFGetPixel(intx,inty)const;

返回值:

指定像素的RGB值。

参数说明:

得到指定像素的RGB颜色值

一、画笔函数

画笔是用来绘制直线、曲线或图形的边界线,是绘图工具类之一

画笔通常具有线型、宽度和颜色三种属性

画笔的线型通常有实线、虚线、点线、点划线、双点划线、不可见线和内框架线7种,这些线型都是以PS_为前缀的预

定义标识符

默认的画笔是一个像素单位的黑色实线

要想更换画笔,可以在创建新画笔对象后,将其选入设备上下文,就可使用新画笔进行绘图。

1)创建画笔函数

原型:

BOOLCreatePen(intnPenStyle,intnWidth,COLORREFcrColor);

返回值:

非零。

参数说明:

第一个参数nPenStyle是画笔的风格代码

第二个参数nWidth是画笔的宽度

第三个参数crColor是画笔的颜色。

PS_SOLID;实线;宽度任意指定

PS_DASH;虚线;宽度1(不可任意指定)

PS_DOT;点线;宽度1(不可任意指定)

PS_DASHDOT;点划线;宽度1(不可任意指定)

PS_DASHDOTDOT;双点画线;宽度1(不可任意指定)

PS_NULL;不可见线;宽度1(不可任意指定)

PS_INSIDEFRAME;内框架线;宽度任意指定

2)选择画笔函数

原型:

Cpen*SelectObject(Cpen*pPen);

返回值:

被替代画笔的指针。

参数说明:

参数pPen是Cpen类的被选中的新画笔对象指针。

本函数把原画笔换成新画笔,同时返回指向原画笔的指针。

3)删除画笔函数

原型:

BOOLDeleteObject();

返回值:

非零。

参数说明:

画笔使用完毕,把已成自由状态的画笔从系统内存中清除。

4)选择一支库画笔函数

原型:

virtualCGdiObject*SelectStockObject(intnIndex);

返回值:

被替代的CGdiObject类对象的指针。

参数说明:

参数nIndex是库笔代码

Windows系统中准备了一些使用频率较高的画笔,不需要创建,可以直接选用。

同样,使用完库画笔时也不需要调用

DeleteObject()函数从内存中删除已使用过的画笔。

三种常用库笔:

BLACK_PEN宽度为1的黑笔实线笔;WHITE_PEN宽度为1的白笔实线笔;NULL_PEN透明笔

二、画刷函数(图形内部进行填充)

1)创建实体画刷函数

BOOLCreateSolidBrush(COLORREFcrColor);

选择画刷函数

2)CBrush*SelectObject(CBrush*pBrush);

删除画刷函数

3)BOOLDeleteObject();

创建阴影画刷函数

4)BOOLCreateHatchBrush(intnIndex,COLORREFcrColor);

第一个参数nIndex是阴影样式代码

第二个参数crColor是阴影线的颜色

5)选择一只库画刷函数

virtualCGdiObject*SelectStockObject(intnIndex);

参数:

LTGRAY_BRUSH:

亮灰色画刷;BLACK_BRUSH黑色画刷;NULL_BRUSH:

空画刷(相当于HOLLOW_BRUSH);WHITE_BRUSH:

白色画刷;DKGRAY_BRUSH深灰色画刷;GRAY_BRUSH灰色画刷;HOLLOW_BRUSH中空画刷

三、绘制矩形函数

原型:

BOOLRectangle(intx1,inty1,intx2,inty2);

返回值:

非零。

参数说明:

该函数使用当前画刷填充矩形内部,并用当前画笔绘制矩形边界线。

CPenMyPen,*OldPen;

MyPen.CreatePen(PS_SOLID,1,RGB(0,0,255));

OldPen=pDC->SelectObject(&MyPen);

CBrushMyBrush,*OldBrush;

MyBrush.CreateSolidBrush(RGB(255,0,0));

OldBrush=pDC->SelectObject(&MyBrush);

pDC->Rectangle(100,100,600,300);//画矩形

pDC->SelectObject(OldPen);//画框线为蓝色

MyPen.DeleteObject();

pDC->SelectObject(OldBrush);//填充为红色

MyBrush.DeleteObject();

坐标映射:

MM_TEXT每个逻辑单位等于一个设备像素,x向右为正,y向下为正

MM_HIENGLISH每个逻辑单位为0.001英寸,x向右为正,y向上为正

MM_LOENGLISH每个逻辑单位为0.01英寸,x向右为正,y向上为正

MM_HIMETRIC每个逻辑单位为0.01mm,x向右为正,y向上为正

MM_LOMETRIC每个逻辑单位为0.1mm,x向右为正,y向上为正

MM_TWIPS每个逻辑单位为一个点的1/20(一个点是1/72英寸),x向右为正,y向上为正

MM_ANISOTRPICx,y可变比例

MM_ISOTROPICx,y等比例

我们就可以通过调用CDC:

:

SetMapMode(intnMapMode)来设置相应的映射模式。

例如:

若将映射模式设置为MM_LOMETRIC,那么不管在什么设备中调用上述语句,都将显示出20*20mm的方块。

而MM_ISOTROPIC映射模式下:

纵横比总是1:

1,也就是说,无论比例因子如何变化,圆总是圆的。

但,MM_ANISOTROPIC映射模式下,x和y的比例因子可以独立地变化,即圆可以被拉扁成椭圆形状。

在映射模式MM_ANISOTROPIC和MM_ISOTROPIC中,常常可以调用CDC:

:

SetWindowExt(设置窗口大小)和CDC:

:

SetViewportExt(设置视口大小)函数来设置所需要的比例因子。

“窗口”和“视口”的概念往往不易理解。

所谓“窗口”,可以理解是一种逻辑坐标下的窗口,而“视口”是我们实际看到的那个窗口,也就是设备坐标下的窗口,根据“窗口”和“视口”的大小就可以确定x和y的比例因子,它们的关系如下:

x比例因子=视口x大小/窗口x大小

y比例因子=视口y大小/窗口y大小

四、绘制椭圆函数

原型:

BOOLEllipse(intx1,inty1,intx2,inty2);

返回值:

非零。

参数说明:

Ellipse函数中,参数x1,y1是限定椭圆范围的外接矩形左上角点的坐标;参数x2,y2是限定椭圆范围的外

接矩形右下角点的坐标

注意VC++中没有专门的画圆函数,只是把圆绘制为长半轴和短半轴相等的椭圆。

Ellipse函数使用当前画刷填充椭圆内

部,并用当前画笔绘制椭圆边界线。

例将一个圆绘制在视区中央,圆的形状依据视区形状而定。

当窗口的形状发生改变时,圆的形状也随之改变。

坐标系

的中点位于屏幕中心,X轴向右,Y轴向上。

圆的边界为一像素宽的蓝色边界线,内部填充为红色。

CRectRect;//定义矩形对象

GetClientRect(&Rect);//获得当前窗口的客户区大小

pDC->SetMapMode(MM_ANISOTROPIC);//设置MM_ANISOTROPIC映射模式

pDC->SetWindowExt(Rect.Width(),-Rect.Height());//设置窗口范围

pDC->SetViewportExt(Rect.right,-Rect.bottom);//设置视区范围

pDC->SetViewportOrg(Rect.right/2,Rect.bottom/2);//设置视口原点

CPenMyPen,*OldPen;

MyPen.CreatePen(PS_SOLID,1,RGB(0,0,255));

OldPen=pDC->SelectObject(&MyPen);

CBrushMyBrush,*OldBrush;

MyBrush.CreateSolidBrush(RGB(255,0,0));

OldBrush=pDC->SelectObject(&MyBrush);

pDC->Ellipse(-Rect.right/2,-Rect.bottom/2,Rect.right/2,Rect.bottom/2);

pDC->SelectObject(OldPen);//蓝边

MyPen.DeleteObject();

pDC->SelectObject(OldBrush);//填充红色

MyBrush.DeleteObject();

五、绘制多边形函数

BOOLPolygon(LPPOINTlpPoints,intnCount);

参数说明:

第一个参数lpPoints指定多边形顶点数组中每一个顶点是一个POINT结构或CPoint对象

第二个参数nCount指定多边形数组中的顶点个数

该函数用当前画笔绘制多边形边界线,用当前画刷填充多边形内部。

例绘制四个顶点分别位于视区上部中点、右部中点、下部中点和左部中点的菱形。

边界线为蓝色,内部用红色填充

CRectRect;

GetClientRect(&Rect);//获得客户区

CPenPenBlue(PS_SOLID,5,RGB(0,0,255));//定义粗蓝色画笔,绘制边界线

CPen*OldPen=pDC->SelectObject(&PenBlue);//选取画笔

CBrushBrushRed(RGB(255,0,0));//定义红色画刷,填充多边形内部

CBrush*OldBrush=pDC->SelectObject(&BrushRed);//选取画刷

CPointp[4];//定义多边形顶点数组

p[0].x=Rect.left+Rect.Width()/2;

p[0].y=Rect.top;//计算顶部中点

p[1].x=Rect.right;

p[1].y=Rect.top+Rect.Height()/2;//计算右部中点

p[2].x=p[0].x;

p[2].y=Rect.bottom;//计算下部中点

p[3].x=Rect.left;

p[3].y=p[1].y;//计算左部中点

pDC->Polygon(p,4);//绘制多边形

pDC->SelectObject(OldPen);//画笔勾边

pDC->SelectObject(OldBrush);//画刷填充

六、填充函数

voidFillRect(LPCRECTlpRect,CBrush*pBrush);

参数说明:

第一个参数lpRect指定矩形,是一个Rect结构或CRect对象

第二个参数pBrush指定画刷对象指针。

该函数将用当前画刷填充矩形内部,但不画边界线。

七、路径函数

⑴打开路径

BOOLBeginPath();

⑵关闭路径图

BOOLEndPath();

⑶填充路径

BOOLFillPath();

例绘制两个多边形,一个使用路径填充,另一个不使用路径填充,试观察结果的异同。

//绘制第一个多边形,用路径填充图

CPointp[7];//定义顶点数组

p[0]=CPoint(340,240);p[1]=CPoint(260,160);

p[2]=CPoint(220,260);p[3]=CPoint(260,370);

p[4]=CPoint(320,300);p[5]=CPoint(360,380);

p[6]=CPoint(440,220);

CBrushMyBrush;

MyBrush.CreateSolidBrush(RGB(255,0,0));

CBrush*OldBrush=pDC->SelectObject(&MyBrush);

pDC->BeginPath();

pDC->MoveTo(p[0]);//绘制多边形

for(inti=1;i<7;i++)

pDC->LineTo(p[i]);

pDC->LineTo(p[0]);

pDC->EndPath();

pDC->FillPath();

pDC->SelectObject(OldBrush);

MyBrush.DeleteObject();

//绘制第二个多边形,用画刷填充

p[0]=CPoint(740,240);p[1]=CPoint(660,160);

p[2]=CPoint(620,260);p[3]=CPoint(660,370);

p[4]=CPoint(720,300);p[5]=CPoint(760,380);

p[6]=CPoint(840,220);

MyBrush.CreateSolidBrush(RGB(255,0,0));

OldBrush=pDC->SelectObject(&MyBrush);

pDC->Polygon(p,7);

pDC->SelectObject(OldBrush);

MyBrush.DeleteObject();

八、位图函数

⑴导入位图

BOOLLoadBitmap(UINTnIDResource);//参数nIDResource是资源的ID编号

⑵建立与位图相应的内存设备上下文

virtualBOOLCreateCompatibleDC(CDC*pDC);

参数pDC是设备上下文的指针,用于在向屏幕输出图形前作准备。

⑶选择位图函数

CBitmap*SelectObject(CBitmap*pBitmap);

参数pBitmap是CBitmap类的被选中的新位图指针对象。

把原位图换成新位图,同时返回指向原位图的指针。

⑷传送位图函数

BOOLBitBlt(intx,inty,intnWidth,intnHeight,CDC*pSrcDC,intxSrc,intySrc,DWORDdwRop);

参数x,y是目标区域的左上角点坐标

参数nWidth和nHeight是目标区域的宽度和高度

参数pSrcDC是源设备上下文的指针

参数xSrc和ySrc是源位图的左上角点坐标

参数dwRop是光栅操作码

例如dwRop=SRCCOPY,表示将原位图直接拷贝到目标位图。

例在屏幕上显示一幅位图。

CRectRect;//定义客户区

GetClientRect(&Rect);//获得客户区的大小

CDCMemDC;//定义一个内存设备上下文对象

CBitmapBitmap,*OldBitmap;//定义一个CBitmap对象和一个CBitmap对象指针

Bitmap.LoadBitmap(IDB_BITMAP1);//从资源中导入图片

MemDC.CreateCompatibleDC(pDC);//建立与位图相应的内存设备上下文

OldBitmap=MemDC.SelectObject(&Bitmap);//在内存设备上下文选用位图图像

pDC->BitBlt(0,0,Rect.Width(),Rect.Height(),&MemDC,0,0,SRCCOPY);//将位图数据传送到屏幕

MemDC.SelectObject(OldBitmap);//将位图图像保存到内存中

九、图形文本函数

⑴文本颜色设置函数

原型:

virtualCOLORREFSetTextColor(COLORREFcrColor);

返回值:

原文本颜色的RGB值。

参数说明:

指定文本颜色。

⑵文本背景颜色设置函数

原型:

virtualCOLORREFSetBkColor(COLORREFcrColor);

返回值:

原文本背景色的RGB值。

参数说明:

指定文本背景颜色。

(3)文本输出函数

原型:

BOOLTextOut(intx,inty,constCString&str);

返回值:

非零。

参数说明:

参数x,y是文本的起点坐标,参数str是CString对象。

⑷文本格式函数

原型:

voidFormat(LPCTSTRlpszFormat,...);

返回值:

无。

参数说明:

参数lpszFormat是格式控制字符串,如%d、%f、%c等。

本格式常用于输出数值型数据。

例在点(100,100)处输出黄底红字“ComputeGraphicsBasedonVC++!

”;在(300,100)输出“BoChuang

ResearchInstitute”;在(100,130)整数(5,8);在(130,130)处输出小数(5.0,8.0)。

inta1=5,b1=8;

doublea2=5.2,b2=8.3;

CStringdata,c="BoChuangResearchInstitute";

pDC->SetTextColor(RGB(255,0,0));

pDC->SetBkColor(RGB(255,255,0));

pDC->TextOut(100,100,"ComputeGraphicsBasedonVC++!

");//输出文本1

data.Format("%s",c);//输出文本2

pDC->TextOut(330,100,data);

data.Format("%d,%d",a1,b1);//输出整数

pDC->TextOut(100,130,data);

data.Format("%f,%f",a2,b2);//输出小数

pDC->TextOut(130,130,data);

例使用双缓冲机制在博创研究所位图上输出“博创研究所”文字。

CRectRect;//定义客户区

GetClientRect(&Rect);//获得客户区的大小

CDCMemDC;//定义内存设备上下文

CDCPicture;//定义图片;

CBitmapBitmap,*OldBitmap;//定义一个CBitmap对象和一个CBitmap对象指针

Bitmap.LoadBitmap(IDB_BITMAP1);//从资源中导入位图

MemDC.CreateCompatibleDC(pDC);//建立与位图相应的内存设备上下文

OldBitmap=MemDC.SelectObject(&Bitmap);//把内存设备上下文换成位图图像

MemDC.BitBlt(0,0,Rect.Width(),Rect.Height(),&Picture,0,0,SRCCOPY);

//将位图数据传送到内存设备上下文

MemDC.SetBkMode(TRANSPARENT);//设置文字背景透明

MemDC.SetTextColor(RGB(255,255,255));//设置文字颜色为白色

MemDC.TextOut(500,350,"博创研究所");//输出文字

pDC->BitBlt(0,0,Rect.Width(),Rect.Height(),&MemDC,0,0,SRCCOPY);//将内存数据传送到屏幕

MemDC.SelectObject(OldBitmap);//从内存设备上下文中释放位图图像

十、VC++绘制图形的几种方法

1)第一种方法:

使用OnDraw成员函数

2)第二种方法:

使用CDC*pDC的菜单调用方式

CDC*pDC=GetDC();

pDC->MoveTo(20,30);

pDC->LineTo(200,300);

ReleaseDC(pDC);

3)第三种方法:

使用CClientDCdc(this)的菜单调用方式

CClientDCdc(this);

dc.MoveTo(20,30);

dc.LineTo(200,300);

不同点只是使用显示器客户区设备上下文类定义了客户区对象dc,并使用客户区的this指针对dc对象进行初始化,使dc对象指向显示器的客户区,这种方法不需要调用和释放设备上下文。

十一、几个例子

例1改变窗口大小时,窗口会以三种不同的颜色显示窗口背景。

1)建一个单文档SDI应用程序,名为:

显示背景颜色

2)在视图的头文件View.h的public下定义矩形窗口对象:

CRectr;

3)在视图的执行文件View.cpp前面加颜色预定义:

#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()函数添加如下代码:

voidCMyView:

:

OnDraw(CDC*pDC)

{CMyDoc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

GetClientRect(r);//获取窗口大小

if(r.right>750&&r.right<1000||r.bottom>750&&r.bottom<1000)

pDC->FillSolidRect(r,RED);//充填窗口背景红色

elseif(r.right>500&&r.right<750||r.bottom>500&&r.bottom<750)

pDC->FillSolidRect(r,GREEN);//充填窗口背景绿色

elseif(r.right<500||r.bottom<500)

pDC->FillSolidRect(r,BLUE);//充填窗口背景蓝色)

else

pDC->FillSolidRect(r,BLACK);//充填窗口背景黑色

}

5)运行后出现的窗口是红色,最小是蓝色,中间是绿色。

例2绘制2个不同填充形式的五角星

(1)建一个单文档的应用程序,名为:

五角星

(2)在视图类的实现文件(View.cpp)Draw函数中加下列代码:

voidCMyView:

:

OnDraw(CDC*pDC)

{CMyDoc*pDoc=GetDocu

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 学科竞赛

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1