工控网首页
>

应用设计

>

工业组态软件基本图形库的实现

工业组态软件基本图形库的实现

2008/1/21 15:32:00
开发控制系统应用软件时编程量很大,开发成本很高,周期长,软件的维护量也很大。组态软件就是将众多常用功能组合在一起形成一个新的软件平台,用户只需在这个平台下进行二次开发即可。为构建组态软件基本图形库,本项目选用了Visual c++6.0作为开发工具,在Windows操作平台下利用MFG强大的类库支持对图元模块进行了开发设计。 开发的组态软件图形库包括了基本的图形库和基本元件。开发中采用VisuaC++6,0作为组态软件的开发工具,在结构上采用多文档/视图结构。在文档类存储数据,在视图类显示图形。最主要的是在程序中应用了面向对象程序设计的类的继承与派生,大大简化不同图元的处理过程,简化了代码编写时间。所设计的绘图程序能用鼠标在屏幕上直观地画出满意的直线、矩形、圆角矩形、圆、椭圆等对象,能保存并可以重新打开。另外使用Class Wizard设计了对象的属性对话框类,定义数据成员,进行有关的消息映射并配有快捷的右键菜单。 一、矢量图 计算机中显示的图形一般可以分为两大类—矢量图和位图。矢量图保存的是图元各点的坐标,因此无论放大缩小或旋转等不会失真变形。例如存储直线我们可以只保存直线的两端点坐标存储矩形保存它的对角线坐标存储圆形保存它的圆心坐标和半径长度。 存储坐标可以说是图形格式上的一次革命。以往的图形格式大多都采用逐点扫描、依次存储的方式。例如,存储八位的bmp格式的灰度图时,就是把每点的元素用八位表示并依次存储。这样,图形所占用的存储空间就会非常大。即使现在所流行的jpeg图形格式也不过是采用对图形隔行隔列扫描从而进行存储的原理,虽然所占空间变小,但是会在放大图形时引起失真。虽然,矢量图难以表现色彩层次丰富的逼真图像效果但是因为它是通过公式计算获得,所以文件体积较小且不会失真。综上所述,此处来用矢量制图的方式来实现图元的绘制。 二、基本图元模块 新建一个基于MFGAppWizard(exe)名为DrawCli的多文档项目。在菜单栏和工具栏中新添加绘图(直线、矩形、圆角矩形圆、椭圆和静态文本)、元件(按钮、指示灯)和编辑(对齐、等大)按钮及其响应的函数,通过鼠标键盘驱动事件响应的机制实现。 所有图元都基于CDrawObj的一个对象,它保存了图元的基本属性:位置、大小、线型、填充色,同时还包括图元的基本操作:对齐等大、撤消恢复通过右键弹出菜单设置图元的具体属性。这些基本操作被设计成虚函数的形式,可以根据图元的具体情况实现不同的功能。下面列出CDrawObj的一些主要成员变量和成员函数。 classCDrawObj:publicCobject { protected: DECLARE_SERIAL(CDrawObj);//声明支持序列化 CDrawObj();//构造函数public: CDrawObj(constCRect&positron);//VPA的构造函数,设置初始化位置CRectm_position;// CDrawDoc*m_pDocument;//指向文档类的指针变量 CDrawView*pView;//指向视图类的指针变量 virtualintGetHandleCount();//得到图元边框矩形黑点的数量(8个点) virtualCPointGetHandle(IntnHandle),//得到点的位置 CRectGetHandleRect(IntnHandlelD,CDrawVlew*pView);//得到编辑图元的边框矩形 virtualHCHRSORGetHandleCursor(IntnHandle),//得到光标的句柄 virtualvoidSetUnBWof(COLORREFcolor);//得到线条的颜色 virtualvoidSetFiIIColor(COLORREFcolor);得到填充的颜色 virtualvoidDraw(CDC*pDC),//绘制图元 enumTrackerState{normal,selected,active},//图元的三种状态 virtualvoidMoveTo(constCRect&position,CDrawVlew*pview=NULL);//拖动图元到新的位置 virtualintHitTest(CPolntpoint,CDrawView*pVlew,BOOLbSe-ected);//测试鼠标是否洗中图元 virtualBOOLIntersects(constCRect&rect)://矩形内判断virtualvoidMoveHandleTo(intnHandle,CPointpdintCDravJVievv"pView=NULL)//移动图元句柄 virtualvoidOnOpen(CDravJView*pView)//打开新界面 virtualVoidOnEditPropertieso//图元编辑属性的虚函数 virtualCDrawObj*Clone(CDrawDoc*pDoc=NULL),//拷贝对象的虚函数 public virtualvoidDrawTracker(CDC*pDC,TrackerStatestate);//跟踪位置状态 virtualCDrawObj(),//析构函数 virtualvoidSerialize(CArchive&ar)//图元序列化protected LOGFONTm_logfonb,//逻辑字体书写文字 BOOLm_bPen判断画笔是否被选中 LOGPENm_logpenl//逻辑画笔,绘制图元 BOOLm_bBrush//判断是否被选中 LOGBRUSHm_logbrush//逻辑画笔填充图元); 同时需要设计一个处理图元各种事件的类CDfaWTool,用来实现图元的选择、移动等事件。classCDrawTool{public CDrawTool(DrawShapenDrawShape)//初始化图元类型 BOOLmoveenable;判断是否移动 VirtualvoidOnLButtonDown(CDrawView*pView,UINTnFlaps,constCPoint&point)//鼠标左键单击事件 VirtualvoidOnLButtonDbIClk(CDrawVew,pView,UINTnFlags,constCPoint&point)//鼠标左键双击事件 virtualvoidOnLBunonUp(CDrawViewpVlew,UINTnHagscoastCPoint&point)//鼠标左键弹起事件 virtualvoidOnpIousep1ove(CDravvdievv*pView,UINTnFlagsconstCPoint&point),//鼠标移动事件 virtualvoidOnEditProperties(CDravJVievv*pView),//图元编辑 virtualvoidOnCancelo,//取消事件 DrawShapemdrawShape//图元类型 staticCDrawTool*RndTool(DrawShapedrawShape)//判断当前选中图元的形状再执行子类的具体操作。如当前绘制圆则利用此函数查找圆的从CDrawTool继承的类CRoundTool对象来完成圆的有关操作。 staticCPtrListc_tools//所有图元形状的操作列表,有几种图元就有几种操作类。 static(Pointc_down//鼠标击中当前选中图元的位置,也是拖动图元的起始位置 staticUINTc_nDownFlags,//是否按下shift键 static(Pointc_last;//鼠标移动的最终位置也是拖动图元的结束位置 staticDrawShapec_drawShape;//当前选中图元的类型 ); 1.图元绘制的基本实现方法 创建图元只需要在CDrawView,CDrawTool两个类中响应OnLButtonDown(按下鼠标左键),OnMouseMove(鼠标移动)及OnLButtonUp(松开鼠标左键)三个事件就可完成。 2.图元对齐、等大的实现 在CDrawView类中写入函数Select实现几个矢量图形的同时选中定义CDrawObtList的一个对象m_selection将选中的图元信息保存起来,而后根据用户从编辑菜单中选择的具体对齐(居左、居右、居上、居下)或等大(等高、等宽、等高且等宽)来调用与之相对应的消息响应函数其中调用MFC的封装函数GetHeadPosition得到第一个图元的位置CDfaWObj*类型变量m_activeobj得到为基准的图元位置,共他的图元位置坐标与之进行简单的加减运算后重绘即可实现。 3.右键决捷菜单制作 为了更容易设置图元对象的控制,在设计中便用了右键决捷菜单(上下文菜单),在Menu资源中插入新的菜单页IDPOPUP_MENU其中包括剪切、复制、粘贴、清除、元件属性和画面属性;在DrawView.Cpp中调用添加消息响应函数OnContextMenu来实现。 4.图元撤消、恢复的实现 为了方便的取消错误操作,此处正如Word中对文字图形编辑的取消、重做一样也实现了取消(Undo)、重做(Redo)的功能口其机制是将每次绘图操作的状态存储在一个链表中根据需要找到合适的链表结点来确定取消或重做的具体位置。在CDrawDoc类中调用函数NewChangSave来实现。 5.图元的保存 MFC有一套Serialize(序列化)机制,目的在于把文件名的选择、文件的开关、缓冲区的建立、数据的读写、对象的动态创建等都包装起来。在类的声明中便用DECLARE_SERIAL和IMPLEMENT_SERIAL两个宏实现序列化的载入。图元对象的序列化是通过重载文档对象的虚拟成员函数CDrawDoc::Serialize(CArchiive&at)来实现的,在这个函数内部调用另外两个类CDrawRect和CDrawObj的Serialize函数来实现. 三、结束语 随着计算机技术的飞速发展,各种图形技术不断地被应用到组态软件的设计之中.目前仅仅采用矢量图形制作方式设计完成了基本图形〔直线、矩形、圆角矩形、圆、椭圆)并在此基础上设计了基本元件(按钮、指示灯和表格),虽然已经能够实现简单界面的绘制但是为了使应用范围可以更广泛,还需要各种各样的不规则图元和描绘工业现场的历史趋势图线,因此图元库有必要进一步扩展。
投诉建议

提交

查看更多评论
其他资讯

查看更多

助力企业恢复“战斗状态”:MyMRO我的万物集·固安捷升级开工场景方案

车规MOSFET技术确保功率开关管的可靠性和强电流处理能力

未来十年, 化工企业应如何提高资源效率及减少运营中的碳足迹?

2023年制造业“开门红”,抢滩大湾区市场锁定DMP工博会

2023钢铁展洽会4月全新起航 将在日照触发更多商机