VC++小型矢量图系统设计研究①

2021-11-10 02:56
关键词:矢量菜单绘制

吴 晶

(东北石油大学,黑龙江 大庆 163318)

0 引 言

随着数字化信息技术的飞速发展,矢量图工具的使用日益广泛。不论是在理论还是在应用上,今天的GIS都处在一个日新月异的时期,并呈现出广阔的应用前景。利用其MFC类便开发出来的功能强大的矢量图形系统在测绘、地质等工程领域应用已经相当广泛,这个以VC++6.0为开发平台的产品凭借其体积小、速度快等优点,代表了GIS系统的发展潮流,实现绘制地图功能,展现VC++编程的优越性[1]。

1 矢量图系统概述

1.1 矢量图概念

矢量图(Vector Graph)是根据一组指令集合来描述图形的内容,在数学上可定义为一系列由线连接的点,它由矢量定义的直线、曲线等组成,其包括图形元素的位置、维数和形状。矢量图是以数学公式的方式记录图像信息的,这就使得矢量图具有两个优点:一是图像质量与分辨率无关,矢量图任意放大或缩小也不会出现模糊或锯齿现象,这是其与位图最大的区别;二是矢量图像文件数据量很小。

矢量图常以像素方式显示,根据轮廓的几何特性进行描述。矢量图像的优点不仅在于可以把矢量图与位图进行集成,也可将矢量图与矢量信息集成在一起从而产生更完美的图像[2]。

1.2 矢量图系统功能

不同领域所使用的GIS系统,对矢量图系统功能的要求也有所不同。一个基本的矢量图模块所应具备的功能如下[3]:

(1)绘制完善的矢量图并标注文本;

(2)编辑完善的图形;

(3)可进行对矢量图的修改、缩放等操作;

(4)可实现鼠标选中、放弃选中、图形删除等功能。

(5)相对完善的图形I/O与编辑功能

包括书本交互绘图、编辑、数字化仪输入、编辑,与其他流行GIS开发工具及相关软件的图形数据接口、绘图功能等;

(6)图层管理:按图层进行空间数据的管理,能够设置层集合的可显示、可选择、可编辑等不同的工作状态;

(7)实现图形参数的设置和多边形区域渲染功能;

(8)较大的存储容量;

(9)较强的容错能力和可恢复性;

(10)较高的处理速度。

2 小型矢量图形系统设计

2.1 图形元素继承关系

在矢量图形系统中,功能上选择了图元组织对象,用ClassWizard增加一个新的类CDraw,作为图形元素的基类,对直线(L)、连续直线(P)、多边形区域(R)、圆(C)、圆形区域(C1)、圆弧(A)和标注文本(T)分别组织建立。如图1所示这个类的父类是CObject。

图1 图形元素的继承关系图

从图1中可知:增加新类CDraw类作为基本图形类,其父类是CObject,可用于存储图形的颜色、层等相关信息。然后分别创建一个管理直线的类Cline和管理一个圆的类圆类CCircle其基类均为CDraw。注意创建圆弧类CArc类时其基类是CCircle以及连续直线和多边形区域类CPline和创建一个管理标注文本的CText类,其基类均是CDraw。

在各个图象元素中分别加入Draw函数的实现代码,以直线为类,在CLine类的实现文件drawDOc.cpp中加入Draw函数的实现代码为:

void CLine::Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,

short BackColor)

{

int x1,y1,x2,y2;

if(b_Delete)

return;

short LineType=m_LineType;

short LineWide=max(1,DLtoVL(m_LineWide));

short ColorPen=m_ColorPen;

if(m_DrawMode1==1)

{

if(m_LineType!=2)

LineType=2;

else

LineType++;

}

else if(m_DrawMode1==2)

ColorPen=BackColor;

CPen pen(LineType, m_LineWide,p_GraphPara->GetColor(ColorPen));

CPen* pOldPen=pDC->SelectObject(&pen);

if(m_DrawMode==0)

pDC->SetROP2(R2_COPYPEN);

else if(m_DrawMode==1)

pDC->SetROP2(R2_NOT);

DPtoVP(m_X1,m_Y1,&x1,&y1);

DPtoVP(m_X2,m_Y2,&x2,&y2);

pDC->MoveTo(x1,y1); pDC->LineTo(x2,y2);

pDC->SelectObject(pOldPen);//恢复画笔

}

2.2 增加图形参数类

在矢量图形系统中,图形参数是集中存储的。在CDrawDoc类前定义图形参数类CGraphPara。用来管理诸如颜色、图层等方面的信息。应用程序Draw中,每个图层的信息用数据结构LayerStruct表示,在CGraphPara类前定义LayerStruct结构。

2.3 组织矢量图形系统的文档

每一个基于框架的MFC程序至少都可以由类派生对象,则由CDraw类派生的CObArray对象来管理图形元素。文档类CDrawDoc类是专门设计用来帮助应用程序存储和管理数据的,创建管理各类图形元素对象指针的CObArray对象。每个图形元素是图形元素类创建的一个对象,在创建这个对象指针时得到这个对象的指针,建立一个对象指针数组来管理这些指针,以达到管理所有图形元素的目的。为了管理图形参数,在文档类CDrawDoc中定义一个CGraphPara对象,为了在各个图形元素类以及一些对话框类使用这个图形元素对象m_GraphPara,可以定义一个全局的GraphPara类指针,并把这个指针指向当前文档对象中的CGraphPara对象m_GraphPara[4]。

2.4 坐标变换

在GIS矢量成图系统中,需要涉及到实际坐标、逻辑坐标和设备坐标(物理坐标)三种坐标系统。其中实际坐标为测量所得地物测点的坐标,单位是m或km;Windows系统分为逻辑坐标和设备坐标,其中逻辑坐标指为实现设备无关性而提供的映射方式,不考虑设备的类型;设备坐标分为屏幕坐标系、窗口坐标系和客户区坐标系,可用于图形显示设备或打印设备的坐标系统,单位为像素。

在矢量图系统开发时,图形绘制首先要将实际图形通过一定的比例变换映射到逻辑坐标系中(窗口Window 中),然后使用一种映射方式将逻辑坐标映射到设备中(视口ViewportExt中),最后将实际的图形显示或打印出来[5]。

为了实现矢量图系统中实际坐标转化为逻辑坐标,在视图类中定义四个转换参数。其中函数VPtoDP用来将逻辑坐标转换成实际坐标,函数LPtoDP用来将实际坐标转换成各种映像方式下的逻辑坐标。函数VLtoDL用来将逻辑坐标长度转换为实际坐标长度,函数DLtoVL用来将实际坐标长度转换为逻辑坐标长度。

3 实现基本矢量图形系统

3.1 使用AppWizard创建MFC应用程序

(1) 选择文件菜单下的新建命令输入工程名及保存其的文件夹;

(2) 在选择Application Type时选多重文档;

(3) 将设定数据库支持;

(4) 将设定生成的标准程序中的文档支持;

(5) 去掉打印预览及打印支持;

(6) 将设定是否设置提示及怎样使用MFC库同时动态链接MFC库;

(7) 将设定AppWizard生成的类。

3.2 响应用户命令

3.2.1 建立绘图菜单项

在资源视图区中选择Menu项,右击选择“插入Menu”菜单项,将出现的菜单属性对话框中的ID号设置为IDR_DRAWTYPE。在应用程序Draw的菜单资源IDR_DRAWTYPE,鼠标左键双击出现视图区右侧的菜单内容,将出现的虚框右击出现活动菜单,选择属性,即可出现图2所示对话框,键入相应ID号和标题,ID号和标题如下1:

图2 菜单属性对话框

表1 ID号和标题

3.2.2 加对应菜单消息的响应函数(增加命令消息处理函数)

以增加直线的消息处理函数为例阐述操作流程:在菜单上右击鼠标,选择类向导,在出现对话框中选择菜单消息响应函数所在的类CDrawView,在Object IDs中选择对应ID_DRAW_LINE菜单项的,在选中command,在弹出对话框Add Member Function中单击OK。

图3 新建菜单项

(1) 在视图类CDrawView中,加入了消息处理函数的定义代码:

//{{AFX_MSG(CDrawView)

afx_msg void OnDrawLine();//绘制直线

//}}AFX_MSG

(2) 在类CDrawView的实现文件中,增加了函数的实现代码:

//选中菜单“绘制直线”时被调用

void CDrawView::OnDrawLine()

{

PushNumb=0;

m_DrawCurrent=1;//标识进行直线绘制操作

}

(3) 在实现文件中,增加了消息映射机制:

BEGIN_MESSAGE_MAP(CDrawView, CView)

//{{AFX_MSG_MAP(CDrawView)

ON_COMMAND(ID_DRAW_LINE, OnDrawLine)//开始直线绘制/}}AFX_MSG_MAP

//Standard printing commands

ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)

END_MESSAGE_MAP( )

4 程序主界面

4.1 运行结果

本文描述GIS中矢量图形系统的初步实现,完全基于VC++开发的GIS系统。利用AppWizard生成的程序框架出发,开发实现了矢量图形系统。通过建立图形元素基类CDraw又继承于MFC类库中的CObject类,这样就可以方便使用MFC类库中提供CObArray类对象存放图形元素,可绘制矢量图形同时可以提供矢量图形编辑功能。通过创建画笔对象将当前制作的位图添加为工具条,定制线型设置线宽。

图4 程序主界面运行结果

4.2 测 试

应用VC ++6.0是矢量图形系统开发的一个广泛使用的工具,本文所设计的图形对象是合理的,主要进行集成测试,检查各项功能:

(1) 小型矢量系统矢量图形绘制:可绘制直线、多边形、圆、圆弧和标注文本,检查是否正常;

(2) 编辑和操作矢量图形:从绘制的若干图形中分别进行重画、移动、全图显示、选中、删除,检查是否正常。

5 结 语

对于目前正有广泛需求的地理信息系统二次开发而言,应用VC++实现的矢量图形系统有着积极的意义,其潜在的应用前景十分广阔。本文以VC++6.0为编译平台开发了小型GIS矢量图形系统,应用计算机图形学、计算机地图制图等有关知识,包含了基本的图形元素类库,实现矢量图形的绘制、图形操作等功能。该小型矢量图形系统可以实现空间数据的有效表达与组织,通过预先定义好的图形元素库来提高绘图效率,对有关技术问题的解决方案是正确的、可行的,具有重要的推广应用价值。该系统的实现有助于图形的绘制、编辑等系统功能,交互绘制点、线、面。在此基础上还可以进行功能模块的扩展,以后进一步深化系统成图功能应用于测绘数据处理中。

猜你喜欢
矢量菜单绘制
一种矢量信息重构的最优双矢量定姿算法
绘制童话
一种适用于高轨空间的GNSS矢量跟踪方案设计
矢量三角形法的应用
作品赏析
中国新年菜单
绘制世界地图
本月菜单
三角形法则在动态平衡问题中的应用
神秘的不速之客