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