基于WindowsGDI 的几何线条处理
2008-04-09 04:09:39来源:互联网 阅读 ()
关键词 GDI ;几何线条
引言
GDI 是原Windows GDI的扩展,增加了新功能并对原功能模块进行了优化,使编程人员更易实现多种高级功能。因GDI 的强大功能及其完美的性能,微软倡导新应用程序的开发基于GDI 进行。
所谓路径,是指可以被填充的、画出轮廓或同时被画出轮廓并填充的一个或多个图形。路径的引入,大大地丰富了Windows的图形功能,使得应用程序可以方便地建立复杂区域,绘制和填充不规则图形。
路径一般由以下元素组成:直线、矩形、椭圆、圆弧、多边形、三次样条和贝塞尔曲线。在GDI 中,几何线条的处理主要是通过调用图形路径(GraphicsPath)的方法来实现的。使用GraphicsPath对象可以将这些元素收集到一个单元中。以后只需调用Graphics类的DrawPath方法,就可以一次绘制出该对象收集的全部元素序列。
编程方法与实例
1、准备工作
使用GDI 编程,必须包含gdiplus.h头文件,要使用Gdiplus名称空间,连接时需要Gdiplus.lib。使用GDI 绘制对象时需要获取一个设备描述表句柄,把它作为参数传递给Graphics的构造函数,这样就可以使用Graphics对象的库函数了。
使用GDI 编程必须在创建GDI 对象前执行GdiplusStartup实现初始化,在程序结束时调用GdiplusShutdown关闭GDI 功能,清理占用的资源。两组函数要成对调用。
示例代码如下所示:
//---------------------------在stdafx.h文件中-----------------------------------//
#include "Gdiplus.h"
using namespace Gdiplus ;
#pragma comment (lib, "Gdiplus.lib")
//----------------------在应用程序类的InitInstance函数中-----------------------//
GdiplusStartupInput gdiplusStartupInput ;
GdiplusStartup (&m_GdiplusToken, &gdiplusStartupInput, NULL) ;
//-----------------------在应用程序类的ExitInstance函数中---------------------//
GdiplusShutdown (m_GdiplusToken) ;
注:其中变量m_GdiplusToken应该是ULONG_PTR类型的全局变量,或者是应用程序类的成员变量
2、路径的创建
GraphicsPath类提供了许多创建路径元素的接口:AddArc(圆弧)、AddBezier(贝塞尔曲线)、AddBeziers(贝塞尔曲线序列)、AddClosedCurve(闭合的基数样条曲线)、AddCurve(基数样条曲线)、AddEllipse(椭圆)、AddLine(直线段)、AddLines(直线段序列)、AddPie(扇形)、AddPolygon(多边形)、AddRectangle(矩形)、AddRectangles(矩形序列)和AddString(字符串轮廓路径)。
图1 MSDN中提供的路径的例子
3、子路径的添加和提取
GraphicsPath还可以包含多个图形,其中每一个图形被称为子路径(figures)。如果在GraphicsPath对象中使用了StartFigure或CloseFigure函数,在这两个之后对路径所添加的线条都将构成一个的子路径。[5]这两个函数的区别是,StartFigure方法不闭合当前图形即开始一个新图形,而CloseFigure方法闭合当前图形并开始新的图形。
下面两段示例代码在路径中添加了两个条路径,前一条子路径由两条直线段组成,后一条子路径是一个圆形。两段代码不同的地方仅仅在于StartFigure和CloseFigure函数的使用,因而它们的效果也不相同,如图2和图3所示。
//示例代码1----使用StartFigure
GraphicsPath path;
path.AddLine(100,100,100,150);
path.AddLine(100,150,150,150);
path.StartFigure();
path.AddEllipse(75,75,50,50);
Graphics g(hdc);
g.DrawPath(&Pen(Color::Black,1),&path);
//示例代码2----使用CloseFigure
GraphicsPath path;
path.AddLine(100,100,100,150);
path.AddLine(100,150,150,150);
path.CloseFigure();
path.AddEllipse(75,75,50,50);
Graphics g(hdc);
g.DrawPath(&Pen(Color::Black,1),&path);
图2 StartFigure效果
图3 CloseFigure效果
GDI 的GraphicsPathIterator类完成了对路径的一个或多个子路径的描述、管理、测试等功能。GraphicsPathIterator能够从给定的路径中进行多种与子路径相关的操作。
表1 GraphicsPathIterator类常用成员函数
常用成员函数 功能描述 HasCurve 指示与此GraphicsPathIterator对象关联的路径是否包含曲线 NextSubpath 将此子路径移到指定的GraphicsPath对象中的下一子路径 Rewind 将此GraphicsPathIterator对象重绕到其关联路径的起始处 GetSubpathCount 获取路径中子路径的数目
GDI 提供的Matrix类封装表示几何变形的3×3仿射矩阵。通过设置Matrix对象,可以旋转、缩放、错切或平移GraphicsPath对象。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash