CDC(设备环境)与CGdiObject(图形对象)

一: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进行图形绘制中关于位图的操作。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值