MFC中的GDI绘图(4)

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

有了画布,要绘图我们必须有画笔画刷。在Windows中有HPEN、HBRUSH等GDI对象,MFC对GDI对象进行了很好的封装,提供了封装GDI对象的类,如CPen、CBrush、CFont、CBitmap和CPalette等,这些类都是GDI对象类CGdiObject的派生类。

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

这里需要注意的是,CGdiObject::DeleteObject函数彻底删除底层GDI对象(CPen和CBrush类的基类)。在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


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


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

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

时间: 2024-08-11 09:49:43

MFC中的GDI绘图(4)的相关文章

MFC中的GDI绘图<转>

一.关于GDI的基本概念 什么是GDI? Windows绘图的实质就是利用Windows提供的图形设备接口GDI(Graphics Device Interface)将图形绘制在显示器上. 在Windows操作系统中,动态链接库C:\WINDOWS\system32\gdi32.dll(GDI Client DLL)中定义了GDI函数,实现与设备无关的包括屏幕上输出像素.在打印机上输出硬拷贝以及绘制Windows用户界面功能.在Visual C++6.0中的头文件C:\Program Files

MFC中的GDI绘图(1)

一.关于GDI的基本概念 什么是GDI         Windows绘图的实质就是利用Windows提供的图形设备接口GDI(Graphics Device Interface)将图形绘制在显示器上. 在Windows操作系统中,动态链接库C:\WINDOWS\system32\gdi32.dll(GDI Client DLL)中定义了GDI函数,实现与设备无关的包括屏幕上输出像素.在打印机上输出硬拷贝以及绘制Windows用户界面功能.在Visual C++6.0中的头文件C:\Progra

MFC中的GDI绘图(2)

二.MFC中GDI绘图 GDI绘图包括以下步骤:获取设备环境,设置坐标映射,创建绘图工具,调用DC绘图函数绘图. 1.获取设备环境 (1)在SDK编程中,获取设备环境的方法有两种: <1>通过API函数BeginPaint.应用程序响应WM_PAINT消息进行图形刷新时主要通过BeginPaint函数获取设备环境,在消息处理函数返回前调用API函数EndPaint释放设备环境. 函数原型为:WINUSERAPI HDC WINAPI BeginPaint( HWND hWnd,LPPAINTS

MFC中的GDI绘图(3)

2.设置坐标映射    (1)Windows坐标系统         Windows坐标系分为逻辑坐标系和设备坐标系两种,GDI支持这两种坐标系.一般而言,GDI的文本和图形输出函数使用逻辑坐标,而在客户区移动或按下鼠标的鼠标位置是采用设备坐标.         <1>逻辑坐标系是面向DC的坐标系,这种坐标不考虑具体的设备类型,在绘图时,Windows会根据当前设置的映射模式将逻辑坐标转换为设备坐标.         <2>设备坐标系是面向物理设备的坐标系,这种坐标以像素或设备所能

MFC中的GDI绘图(5)

坐标映射实例 (1)建立单文档MFC项目Draw:New->Projects->MFC AppWizard(EXE)->Single Document. (2)找到CMainFrame::PreCreateWindow函数,在其中设置默认窗口大小为400 pixel*300 pixel. BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs) { if( !CFrameWnd::PreCreateWindow(cs) ) return

VS2013中使用GDI+绘图

VC范例,400多个例子源代码下载 http://download.csdn.net/detail/bigtree_mfc/7727977 VS2013中使用GDI+绘图和VC6.0不同,在VC6.0中能绘出的图像在VS2013中不会显示,原因就是在VS2013中需要添加初始化GDI+: 绘图 对话框视图类中:(绘图部分大同小异,) void **View::OnDraw(CDC *pDC){ //初始化部分 GdiplusStartupInput gdiplusStartupInput; UL

GDI+学习笔记(九)带插件的排序算法演示器(MFC中的GDI+实例)

带插件的排序算法演示器 本节将通过一个实例来说明GDI+在MFC中的应用.这个算法演示器其实是本人算法系列的一个开端,由于csdn没有树状的目录结构,咱也只好使用链表了不是?好了,废话不多说,开始今天的文章. (一)功能说明 我们初步制定功能如下: (1). 能够通过柱状图,自动展示排序算法的交换比较过程 (2). 能够使用插件的形式进行开发.即,当新完成一个算法后,只需要完成一个插件文件(我们这里使用动态库dll),由主程序加载插件,即可进行执行,而不再需要重新编译主程序. (3). 保证主程

【VS2013中使用GDI+绘图】

VS2013中使用GDI+绘图和VC6.0不同,在VC6.0中能绘出的图像在VS2013中不会显示,原因就是在VS2013中需要添加初始化GDI+: 绘图 对话框视图类中:(绘图部分大同小异,) void **View::OnDraw(CDC *pDC) { //初始化部分 GdiplusStartupInput gdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken, &gdiplusStartu

怎样在VS2013/MFC中使用TeeChart绘图控件

TeeChart作为一款强大好用的绘图控件,通过它可以绘制出各式各样的图表,包括2D的,还有3D的,绘制的图表美观实用,这里主要讲述如何在VS2013/MFC中使用TeeChart控件,顺便说一下在VS2013中如何创建MFC项目. 工具/原料 Visual studio 2013 TeeChart.pro.v5.ActiveX 方法/步骤 1 在网上下载TeeChart控件并安装,安装自然不用多说,安装完后找到安装路径(带有TeeChart5.ocx文件),复制当前路径 2 安装完后需要对控件