一:CDC(设备环境)与CGdiObject(图形对象)的关系
在Windows应用程序中,设备环境与图形对象共同工作,协同完成绘图显示工作。就像画家绘画一样,设备环境好比是画家的画布,图形对象好比是画家的画 笔。用画笔在画布上绘画,不同的画笔将画出不同的画来。选择合适的图形对象和绘图对象,才能按照要求完成绘图任务。
二CDC(设备环境)
1:class CDC : public CObject
CDC类提供的成员函数可以用于操作设备描述对象、使用绘图工具、选择图形设备界面,以及操作颜色和调色板,还用于取得和设置绘图属性、映射方式、视图和窗口范围的操作、坐标的转换、区域的使用、剪取、画线以及绘制图形和文字等操作。
2:CDC四大子类
CClientDC-------代表操作窗口的DC ,是比较常用的一个子类。它只能在窗口的客户区(即窗口中除了边框、标题栏、菜单栏以及状态栏外的中间部分)中进行绘图,坐标点(,0)通常指的是客户区的左上角。它的构造函数调用GegDC函数,而析构函数调用ReleaseDC函数。
CMetaFileDC------响应Meta File的DC ,Meta File是一些GDI消息。提供了一个面向Windows图元文件的设备环境,封装了在一个Windows图元文件中绘图的方法。图元文件是一个与设备无关的图片的集合,由于它对图像的保存比像素更精确,因而往往在要求较高的场合下使用,例如AutoCAD的图形保存等。
CPaintDC-------响应WM_PAINT消息的DC。WM_PAINT消息是当窗口的某个区域需要重画时激发的窗口消息。当程序中的消息循环接到WM_PAINT消息时就自动调用消息处理函数OnPaint(),如果在OnPaint函数内定义了CPaintDC类的对象,通过这个类对象就可以使用CDC类的成员函数完成视图客户区中的图形绘制操作。
CWindowDC------代表整个屏幕的DC。可以在窗口的客户区和非客户区(即窗口的边框、标题栏、菜单栏以及状态栏)中绘图,坐标点(,0)是指整个屏幕的左上角。同CClientDC类一样,它的构造函数调用GegDC函数,而析构函数调用ReleaseDC函数。
3:子类间关系
1) 用CPaintDC 和CClientDC类的对象绘制图形时,绘制区只能在客户区,而不能在非客户区;而CwindowDC类既可以在窗口的客户区也可以在非客户区进行图形绘制。
2) 2)在CWindowDC绘图类下,坐标系是建立在整个屏幕上的,在像素坐标方式下,坐标原点在屏幕的左上角;而在CPaintDC和CClientDC绘图类下,坐标系是建立在客户区上的,在像素坐标方式下,坐标原点在客户区的左上角。
3) CPaintDC类的对象应用在OnPaint函数中,以响应Windows的WM_PAINT消息;而CClientDC类的对象应用在非响应消息WM_PAINT的情况下。CPaintDC类响应WM_PAINT消息,并自动完成绘制,这对维护图形的完整性有着重要的作用。CClientDC类可以实时地将图形绘制到屏幕 上,不需要重画;而如果用CPaintDC类的对象完成同样的工作,只能发出消息让屏幕上包含这条直线的区域重画,以把这条直线绘制到屏幕上。
三:CGdiObject(图形对象)
1:class CGdiObject : public CObject
提供了各种各样的绘图工具,主要的绘图设备类有:CGdiObject、CPen、CBrush、CFont、CBitmap、CRgn和CPalette等。使用步骤如下:
1)定义一个GDI对象,然后调用相应的函数(如CreatePen、CreateSolidBrush等)创建此GDI对象。
2)将已构造出的GDI对象利用设备环境类对象的成员函数SelectObject选入到当前环境中,并同时将原来的GDI对象保存起来。
3)绘图结束后,恢复当前设备环境中原来的GDI对象。
2:CPen类是CGdiObject类的一个派生类,它封装了Windows图形设备接口(GDI)中有关画笔的操作。
CPen newPen,*oldPen;
canvasFrame::canvasFrame()
{
newPen.CreatePen(PS_DASH,5,RGB(0,0,255));
}
void canvasFrame::OnPaint()
{
CPaintDC dc(this); //建立响应WM_PAINT消息的DC
oldPen=dc.SelectObject(&newPen); //选择新画笔
int i,j=11,ptype,x=100,y=10;
dc.MoveTo(x,y); //设定线段起点为(x,y)
for(i=0;i<=19;i++)
{
ptype = i % 4; //判断点的类型
switch(ptype)
{
case 0: //右上角的点
j=j-2;
x = x + 40 * j;
y = y;
break;
case 1: //右下角的点
x = x;
y = y + 40 * j;
break;
case 2: //左下角的点
x = x - (j - 1) * 40;
y = y;
break;
case 3: //左上角的点
x = x;
y = y - (j -1 ) * 40;
break;
}
dc.LineTo(x,y); //绘制直线至(x,y),(x,y)为下一线段的起点
}
dc.SelectObject(oldPen); //重设回旧画笔
}
3:CBrush类是CGdiObject类的一个派生类,它封装了Windows图形设备界面(GDI)中有关画刷的操作。
CBrush brush[21];
canvasFrame::canvasFrame()
{
int i=0,c,s;
COLORREF color[3] = {RGB(255,0,0),RGB(0,255,0),RGB(0,0,255)};
int style[6] = {HS_VERTICAL,HS_HORIZONTAL,HS_CROSS,HS_DIAGCROSS,HS_FDIAGONAL,HS_BDIAGONAL};
for(c=0;c<3;c++) //建立单色画刷
{
brush[i].CreateSolidBrush(color[c]);
i++;
}
for(s=0;s<6;s++) //建立阴影画刷
{
for(c=0;c<3;c++)
{
brush[i].CreateHatchBrush(style[s],color[c]);
i++;
}
}
}
void canvasFrame::OnPaint()
{
CPaintDC dc(this); //响应WM_PAINT消息的DC
int x1=10,y1=10,x2=70,y2=70;
for(int i=0;i<21;i++) //绘制填充区块
{
dc.SelectObject(&brush[i]); //选择画刷
dc.Ellipse(x1,y1,x2,y2); //绘制圆形
if((i+1)%3==0)
{
x1+=80;
x2+=80;
y1=10;
y2=70;
}
else
{
y1+=100;
y2+=100;
}
}
}
4:CFont类只有一个构造函数,在定义了一个CFont类对象之后,必须用成员函数CreateFont或CreateFontIndirect来初始化CFont对象的参数。
CFont newFont,*oldFont;
canvasFrame::canvasFrame()
{
newFont.CreateFont(100,50,50,0,100,TRUE,TRUE,FALSE,DEFAULT_CHARSET,OUT_CHARACTER_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH|FF_MODERN,"楷体");
}
void canvasFrame::OnPaint()
{
CPaintDC dc(this); //建立响应WM_PAINT消息的DC
oldFont = dc.SelectObject(&newFont);//选择新字体
dc.SetTextColor(RGB(0,0,255)); //设定文字显示颜色
dc.TextOut(30,60,"绘制文字"); //输出文字至dc
dc.SelectObject(oldFont);
}
5:CBitmap类是CGdiObject类的派生类,它封装了使用Windows GDI进行图形绘制中关于位图的操作。
CDC(设备环境)与CGdiObject(图形对象)
最新推荐文章于 2016-07-27 09:19:17 发布