摘 要 以统筹图绘制程序的编制为例,详细给出了应用Visual C++开发工具及MFC实现图形编辑中的节点-箭线联动方法。该方法对于实现GIS应用、标图应用和统筹图应用中的类似功能有较好的参考价值。
关键词 节点;箭线;编辑联动
1 引言
很多的图形应用如统筹图应用、GIS应用、标图应用中都存在着编辑联动的问题。所谓编辑联动,是指在对一个图元编辑修改包括位置的变动后,其他图元由于与这个图元有某种关系,而能自动同步被修改。按图元类型,可将图形联动划分为点-点、点-线、点-面、线-线、线-面、面-面等6种。文中以统筹图为例,讨论节点-箭线联动编辑问题。
节点与箭线图元的实现以VC自带面向对象图形例程DRAWCLI基础,添加自定义类CDrawNode和CDrawArrow来实现。依据功能设计,程序的主要工作包括:
(1) 基本图元的绘制。包括绘制节点和箭线。绘制的节点图形表示为圆心标有编号圆圈;箭线的两侧标注有文字说明,且文字行与箭线保持平行,箭线带有起节点和终节点。
(2) 处理图元及相互位置关系。包括删除操作和移动操作。删除某一节点,与该节点相连的箭线全部删除,且调整编号在其后面的节点编号,删除箭线不影响节点。移动节点时,与之相连的箭线相应移动,其关键是准确计算箭线的位置。
2 基本图元及联动
2.1基本图元实现
设在VC++6.0的环境下已建立了工程Draw.dsp。节点类和箭线类都是以CDrawObj为基类派生。在建立这两个类之前,需要添加以下全局变量
enum DrawShape{…,circle,arrow,…};//图元类型以及相应的工具circleTool和arrowTool(arrow)、arrowlineTool
2.1.1节点类CDrawNode的设计
class CDrawNode : public CDrawObj
{
public:
CDrawNode(const CRect& position,int Radius);
void SetCircleIndex(int Index){ m_nIndex=Index}; 设置节点编号
virtual int GetObjIndex(){ return m_nIndex} ; //获取编号
public:
int m_Radius; //节点半径
int m_CentreX,m_CentreY;//圆心
//在圆中心写上编号,要考虑编号的位数情况 virtual void Draw(CDC* pDC,CDrawView* pView);
|