正文

MFC中的GDI绘图(4)2008-12-21 21:29:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/xman/40010.html

分享到:

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

   有了画布,要绘图我们必须有画笔画刷。在Windows中有HPENHBRUSHGDI对象,MFCGDI对象进行了很好的封装,提供了封装GDI对象的类,如CPenCBrushCFontCBitmapCPalette等,这些类都是GDI对象类CGdiObject的派生类。

   一般先创建画笔(刷),然后调用CDC::SelectObject函数将画笔(刷)选入设备环境最为当前绘图工具,绘图完毕恢复设备环境以前的画笔(刷)对象,最后调用CGdiObject::DeleteObject函数删除画笔(刷)对象。

   这里需要注意的是,CGdiObject::DeleteObject函数彻底删除底层GDI对象(CPenCBrush类的基类)。在MFC中,当对象销毁时会调用对象的析构函数自动删除对象,一般不必调用CGdiObject::DeleteObject删除GDI对象,因为如果设备环境还在使用一个GDI对象时,将引起应用程序崩溃或出现难以理解的运行错误。

   1)创建画笔

BOOL CPen::CreatePen( int nPenStyle, int nWidth, COLORREF cfColor );

nPenStyle  指定画笔的风格。其可能取值的列表,请参见CPen构造函数中的nPenStyle参数。

nWidth   指定画笔的宽度。如果这个值为0,则不管是什么映射模式,以设备单位表示的宽度总是一个像素。

crColor 包含画笔的一个RGB颜色,为COLORREF结构。 

此外,可通过CDC::SelectStockObject函数来调用系统预定义的库存笔对应的CGdiObject对象。

pOldPen = (Cpen*)pDC->SelectStockObject(BLACK_PEN);

2)创建画刷

BOOL CBrush::CreateSolidBrush ( COLORREF crColor );

BOOL CBrush::CreateHatchBrush( int nIndex, COLORREF crColor );

参数: nIndex 指定画刷的阴影线风格。可取的值如下:

HS_HORIZONTAL   /* ==== */

HS_VERTICAL    /* ||||| */

HS_FDIAGONAL  /* \\\\\ */

HS_BDIAGONAL  /* ///// */

HS_CROSS       /* +++++ */

HS_DIAGCROSS  /* xxxxx */

返回值:调用成功时返回非零值,否则为0

此外,可通过CDC::SelectStockObject函数来调用系统预定义的库存画刷对应的CGdiObject对象。

pOldBrush = (CBrush*)pDC->SelectStockObject(BLACK_BRUSH);

3)将画笔(刷)选入设备环境。

以下为MFC中默认映射方式下的GDI绘图的模块:

//先获取设备环境pDC

    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)当绘制文本Text时,一般可以通过调用CDC::SetBkColor函数来设置背景颜色,调用CDC::SetTextColor函数来设置文字颜色,调用CDC::SetTextAlign函数设置文本对齐标记。

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

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

-------------------详情参考MSDNMFC类库详解-----------------

 --------------------To be continued------------------

阅读(9521) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册