65.9K
CodeProject 正在变化。 阅读更多。
Home

2D绘图 - 文档/视图架构

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.79/5 (7投票s)

2012年7月16日

CPOL

3分钟阅读

viewsIcon

46865

downloadIcon

4389

本文是一个简单的几何图形库,用于绘制线条、圆形、弧线、文本等。

引言

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 对象(如 CGeoArcCGeoLineCGeoRectangle 等)的类。
  • 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_StPntpEntity->m_EndPnt 硬编码为一些随机的 CPoint 值。 理想情况下,这应该在 OnLButtonDown 处理程序中完成,该处理程序将 CPoint 数据作为参数提供。

图层的概念

在你的应用程序中,你可以创建“N”个图层并在 CLayerList 类中维护它们。 在你的窗口类的 OnDraw() 方法中,你可以选择要绘制的 CLayer。 如果你想绘制所有图层,则迭代 CLayerList 中的每个图层,然后调用 CLayerDrawLayer() 方法。

历史 

初始上传:2012 年 7 月 14 日。

© . All rights reserved.