MFC中GDI绘图

来源:互联网 发布:淘宝联盟佣金怎么领 编辑:程序博客网 时间:2024/04/29 10:30
一.MFC中与GDI有关的类


为了支持GDI绘图,MFC提供了两种重要的类:设备环境DC(Device Context)类,用于设置绘图属性和绘制图形;绘图对象类,封装了各种GDI绘图对象,包括画笔、刷子、字体、位图、调色板和区域。


二.MFC中GDI绘图


    GDI绘图包括以下步骤:获取设备环境,设置坐标映射,创建绘图工具,调用DC绘图函数绘图。


1、在MFC中,MFC提供了不同类型的DC类。


<1> CPaintDC构造函数:CPaintDC(CWnd* pWnd); 构造一个CPaintDC对象(pWnd指向一个CPaintDC对象所属的CWnd对象),准备用于绘画的应用程序窗口。


    void CView::OnPaint()
    {
       CPaintDC dc(this);
       // TODO: Add your message handler code here
       OnPrepareDC(&dc);
       OnDraw(&dc)
    }


<2>CClientDC构造函数:CClientDC(CWnd* pWnd); 构造一个CClientDC对象,它将存取pWnd指向的CWnd的客户区。


// 鼠标左键事件处理
    void CExView::OnLButtonDown(UINT nFlags, CPoint point)
    {
       // TODO: 在此添加消息处理程序代码和/或调用默认值
       CClientDC dc(this);//定义客户区设备环境
       dc.LineTo(point);//绘制线段
    }


<3>CWindowDC构造函数:CWindowDC( CWnd* pWnd );构造一个CWindowDC对象,它可以访问pWnd指向的CWnd对象的整个屏幕区域(包括客户区和非客户区)。比如我们在做屏幕保护程序时,一般以整个屏幕区域作为绘制区域。


2、设置坐标映射


3、创建绘图工具并选入DC


MFC对GDI对象进行了很好的封装,提供了封装GDI对象的类,如CPen、CBrush、CFont、CBitmap和CPalette等,这些类都是GDI对象类CGdiObject的派生类。


例:
    CPen *pOldPen,newPen;
    CBrush *pOldBrush,newBrush1,newBrush2;
    //创建宽度为pixel的白色实线画笔
    newPen.CreatePen(PS_SOLID,1,RGB(0,0,0));
    //创建红色实线画刷
    newBrush1.CreateSolidBrush(RGB(255,0,0));
    //创建红色实线度的向下(从右到左)影线的阴影画刷
    newBrush2.CreateHatchBrush(HS_BDIAGONAL,RGB(255,0,0));
    //将newPen画笔和newBrush1画刷对象选入设备环境
    pOldPen = pDC->SelectObject(&newPen);
    pOldBrush = pDC->SelectObject(&newBrush1);
    //调用DC绘图函数绘图
    //……
    //绘图完毕,恢复原来画笔、画刷
    pDC->SelectObject(pOldPen);
    pDC->SelectObject(pOldBrush);
   //删除创建的画笔、画刷
    newPen.DeleteObject();
    newBrush1.DeleteObject();
    newBrush2.DeleteObject();


4、调用DC绘图函数绘图

   GDI提供了绘制基本图形的成员函数,在MFC中这些函数封装在CDC类中。

注意:绘图函数使用的坐标都是逻辑坐标。

常用CDC绘图函数

函数

功能

线输出函数

GetCurrentPosition

获取笔的当前位置(以逻辑坐标表示)

MoveTo

移动当前位置

LineTo

从当前位置到一点画直线,但不包括那个点

Arc

画一段椭圆弧

ArcTo

画一段椭圆弧。除了更新当前位置以外,这个函数与Arc类似

PolyPolyline

画多组相连线段。这个函数不使用也不更新当前位置

PolylineTo

画一条或多条直线,并把当前位置移到最后一条直线的终点

PolyBezier

画一条或多条Bezier样条。不使用也不更新当前位置

PolyBezierTo

画一条或多条Bezier样条,并把当前位置移到最后一条Bezier样条的终点

 

 

椭圆和多边形函数

Chord

绘制椭圆弧(椭圆和一条线段相交围成的闭合图形)

DrawFocusRect

绘制用于表示焦点的风格的矩形

Ellipse

绘制椭圆

Pie

绘制饼形图

Polygon

绘制多边形,包含由线段连接的一个或多个点(顶点)

PolyPolygon

创建使用当前多边形填充模式的两个或多个多边形,多边形可以相互分开或叠加

Polyline

绘制多边形,包含连接指定点的一组线段

Rectangle

使用当前笔绘制矩形,用当前画刷填充

RoundRect

使用当前笔绘制圆角矩形,用当前画刷填充

位图函数

BitBlt

从指定设备上下文拷贝位图

StretchBlt

把位图由源矩形和设备移动到目标矩形,必要时拉伸或压缩位图以适合目标矩形的维数

GetPixel

获取指定点像素的RGB颜色值

SetPixel

设置指定点像素为最接近指定色的近似值

文本函数

TextOut

用当前选取字体在指定位置写字符串

ExtTextOut

用当前选取字体在矩形区域写字符串

TabbedTextOut

在指定位置写字符串,制表符扩展为制表符停止位置数组中指定值

DrawText

在指定矩形内绘制格式化文本

------------------------------详情参考MSDN、MFC类库详解---------------------------



摘自博客网址:http://blog.csdn.net/phunxm/article/details/5083119
0 0
原创粉丝点击