在软件开发领域,2D绘图是一个常见的需求。开发者经常需要创建应用程序来绘制各种几何图形,如线条、圆形、弧线、文本等。然而,由于各种原因,如时间限制、不愿意探索OpenGL、从头开始开发模块等,许多开发者在实现这一功能时遇到了困难。MFC(Microsoft Foundation Classes)提供了一些绘制简单图形的类,如线条、圆形、矩形等,但对于初学者来说,可能需要一段时间来学习、理解和实践。GeoIO库将MFC的全部绘图功能封装成一组核心几何类,使得开发者可以轻松地将其添加到项目中并开始使用。此外,该库还支持绘图、拖动操作以及序列化功能。
一些开发者/程序员在开发一个简单的2D几何图形绘制应用程序时遇到了障碍。他们可能因为缺乏时间、不愿意探索OpenGL、从头开始开发模块等原因而受阻。MFC的DeviceContext类提供了一些绘制简单实体的功能,但对于初学者来说,可能需要一段时间来学习、理解和实验。GeoIO库将MFC的全部功能封装成一组核心几何类。只需要将这个模块添加到项目中,然后就可以开始使用了。该模块还支持在OnMouseMove处理器上的绘图和拖动操作以及序列化。
GeoIO是一个简单的MFCDLL。可以将其作为动态链接或静态链接添加到项目中。最初使用这个模块可能会看起来有些困难,但一旦阅读了以下基本概念,应该能够轻松地使用它。打开示例项目Cad2D(SDI MFC应用程序),它使用GeoIO来绘制2D基本几何对象。请探索这个示例项目,以学习和理解GeoIO的用法。注意:该项目有.vcproj和.vcxproj文件,因此应该可以在Visual Studio 2010及更早版本中打开。
以下是GeoIO库中定义的一些几何类:
CPrimitive
- 所有以下类的基础类。CGeoArc
- 绘制和序列化弧线的类。CGeoCircle
- 绘制和序列化圆的类。CGeoLine
- 绘制和序列化线的类。CGeoPolybezier
- 绘制和序列化贝塞尔曲线的类。CGeoPolygon
- 绘制和序列化多边形的类。CGeoRectangle
- 绘制和序列化矩形的类。CGeoText
- 绘制和序列化字符串的类。注意:一些绘图逻辑受到了各种在线文章的启发。
以下是GeoIO库中定义的一些集合类:
CEntityList
- 持有CPrimitive
对象的类(如CGeoArc
、CGeoLine
、CGeoRectangle
等)。CLayerList
- 持有CLayer
对象的类。CLayer
- 存储一个CEntityList
实例的类。一个CLayer
对象通过层ID来识别。在应用程序中,可以按照以下步骤使用GeoIO库:
CLayer *pLayer = new CLayer(); // 创建一个新的图层
CPrimitive *pEntity = new CGeoLine(); // 创建一个线条实体
pEntity->m_StPnt = CPoint(10, 10); // 设置线条的起点
pEntity->m_EndPoint = CPoint(100, 100); // 设置线条的终点
pEntity->m_clr = RGB(255, 255, 255); // 设置线条的颜色
pLayer->AddEntityToLayer(pEntity); // 将实体添加到图层
在窗口类的OnDraw(CDC *pDC)
方法中,调用:
pLayer->DrawLayer(pDC); // 绘制图层
注意:在上面的示例中,硬编码了pEntity->m_StPnt
和pEntity->m_EndPoint
为一些随机的CPoint
值。理想情况下,这应该在OnLButtonDown
处理器中完成,它会将CPoint
数据作为参数提供。
在应用程序中,可以创建'N'个图层,并将它们维护在CLayerList
类中。在窗口类的OnDraw()
方法中,可以选择要绘制的CLayer
。如果想绘制所有图层,那么遍历CLayerList
中的每个图层,然后调用CLayer
的DrawLayer()
方法。