2D绘图 - 文档/视图架构
本文是一个简单的几何图形库,用于绘制线条、圆形、弧线、文本等。
引言
GeoIO lib 是一个简单的几何库,它封装了各种几何实体的绘制(如线条、圆形、弧线、文本等),并将它们存储在列表中,支持撤消/重做操作。 附带一个名为 Cad2D 的示例应用程序,它展示了 GeoIO 库的一些基本绘图和序列化功能。
背景
一些开发人员/程序员遇到需要开发简单的应用程序来绘制二维几何图形的情况。 但是,由于时间不足、不愿探索 OpenGL、从头开始开发模块等多种原因而受阻。 MFC 类集 (DeviceContext
) 提供了一些绘制简单实体(如线条、圆形、矩形等)的良好功能,但新手可能需要一些时间来学习、理解和实验。 GeoIO 库将 MFC 的完整功能封装到一组核心几何类中。 你所要做的就是将此模块添加到你的项目中并开始使用它。 该模块还支持绘图、OnMouseMove 处理程序中的拖动操作和序列化。
使用代码
GeoIO 是一个简单的 MFC DLL。 将其作为动态链接或静态链接添加到你的项目中。 最初,使用此模块可能看起来很困难,但是一旦你阅读了以下基本概念,你应该可以轻松掌握。 打开示例项目 Cad2D(SDI MFC 应用程序),该项目使用 GeoIO 绘制 2D 基本几何对象。 请探索此示例项目以学习和理解 GeoIO 的用法。
注意:该项目具有 .vcproj 和 .vcxproj 文件,因此它应该可以在 VS2010 和 Visual Studio 的早期版本中打开。
GeoIO 中的几何类:
CPrimitive
- 所有以下提到的类的主要基类。-
CGeoArc
- 用于绘制和序列化弧线的类 -
CGeoCircle
- 用于绘制和序列化圆形的类 -
CGeoLine
- 用于绘制和序列化线条的类 -
CGeoPolybezier
- 用于绘制和序列化多段贝塞尔曲线的类 -
CGeoPolygon
- 用于绘制和序列化多边形的类 CGeoRectangle
- 用于绘制和序列化矩形的类-
CGeoText
- 用于绘制和序列化字符串的类
注意:一些绘图逻辑受到各种在线文章的启发。
集合类
-
CEntityList
- 用于保存CPrimitive
对象(如CGeoArc
、CGeoLine
、CGeoRectangle
等)的类。 -
CLayerList
- 用于保存CLayer
对象的类 CLayer
- 类存储CEntityList
的实例。CLayer
对象由图层 ID 标识。
因此,在你的应用程序中,请按照以下步骤操作
CLayer *pLayer = new CLayer(); // member variable of your window class
CPrimitive *pEntity = new CGeoLine(); // create an entity of time line
pEntity->m_StPnt = CPoint(10, 10);
// set the start point of the line
pEntity->m_EndPoint = CPoint(100, 100); // set the end point of the line
pEntity->m_clr = RGB(255, 255, 255); // set the color of the line
pLayer->AddEntityToLayer(pEntity); // store it to the layer class
在你的窗口类的 OnDraw(CDC *pDC)
方法中,调用
pLayer->DrawLayer(pDC); // NOTE: pLayer should be a member of your window class that is created in the constructor.
另请注意,在上面的示例中,我将 pEntity->m_StPnt
和 pEntity->m_EndPnt
硬编码为一些随机的 CPoint
值。 理想情况下,这应该在 OnLButtonDown
处理程序中完成,该处理程序将 CPoint
数据作为参数提供。
图层的概念
在你的应用程序中,你可以创建“N”个图层并在 CLayerList
类中维护它们。 在你的窗口类的 OnDraw()
方法中,你可以选择要绘制的 CLayer
。 如果你想绘制所有图层,则迭代 CLayerList
中的每个图层,然后调用 CLayer
的 DrawLayer()
方法。
历史
初始上传:2012 年 7 月 14 日。