收藏 分享(赏)

VC环境下监控软件流程图界面的开发.doc

上传人:11xg27ws 文档编号:7860762 上传时间:2019-05-27 格式:DOC 页数:4 大小:91KB
下载 相关 举报
VC环境下监控软件流程图界面的开发.doc_第1页
第1页 / 共4页
VC环境下监控软件流程图界面的开发.doc_第2页
第2页 / 共4页
VC环境下监控软件流程图界面的开发.doc_第3页
第3页 / 共4页
VC环境下监控软件流程图界面的开发.doc_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

1、1VC 环境下监控软件流程图界面的开发The Development of Flow Interface for Monitoring Software Based on VC史京玲 刘旺开 白 涛SHI Jingling, LIU Wangkai, BAI Tao摘要:文章介绍了在 Windows 平台下,利用 Visual C工具实现对位图的拖动、缩放、镜像操作,解决屏幕闪烁和透明处理问题,来开发监控软件流程图界面的过程。关键词:位图操作,屏幕闪烁,透明处理,组态中图分类号:TP39 文献标识码: AAbstract:Based on Windows system, this articl

2、e introduces the realization process of software flow interface for monitoring by the Visual C+. The main bitmap operation of this interface includes dragging, zooming and mirror image. The problems of transparent disposal and screen flicker are solved too.Keywords:bitmap operation,screen flicker, t

3、ransparence disposal,configuration目前,计算机测控系统在工业领域中的应用越来越广泛。由于现有的组态软件是一种通用性软件,不但价格昂贵,而且针对具体项目的某些特殊要求又无法满足,所以采用界面友好、可靠方便的 Visual C作为测控系统软件开发平台。开发测控系统软件在完成工业过程实时监控任务外,配以灵活友善的人机界面,才能有更高的实用价值。监控子系统作为测控系统的用户界面部分,是与用户交互的窗口,其可视化的程度决定着软件的受欢迎程度。为了真实的显示现场的运行环境,需要把工艺流程图、实时控制状态等内容直观的显示在屏幕上。用绘图软件生成具有立体效果的流程图及常用控制

4、设备,再用程序载入编辑或操作大大简化了编程工作并节省了时间。这就必须解决位图编辑的灵活方便性、屏幕刷新闪烁、透明处理等问题。1 创建流程图界面 为了使监控系统流程图界面更生动直观,选用组态王或 3Dmax 绘制出有立体感的图像,之后将图像存成 BMP 格式作为背景位图。位置状态常需更改的控制设备如阀门等另行绘制,作为前景位图编辑。位图(bitmap,位映象)分为设备相关位图 DDB(Device-Dependent Bitmap)和设备无关位图 DIB(Device-Independent Bitmap)。Windows9X 以后的版本支持 DIB 位图。DIB 位图包含一个颜色表,颜色用于描

5、述像素的颜色值如何对应 RGB 值。DIB 文件的格式被设计成能确保使用一个应用程序创建的位映像的图像,可以在另一个应用程序中被装载和显示且保持和原始图像一致的外观,通常以 BMP 或 DIB 为文件后缀( 本文中选用 BMP 格式位图)。我们知道,向屏幕绘图前必须先获得设备环境 DC(Device context) 。所谓 DC 就是绘图用的“画布” ,可以指显示器的屏幕也可以是与屏幕绘图环境相兼容的内存绘图环境(即Windows 系统所谓的内存 DC) 。通过 CreateCompatibleDC 函数来创建与屏幕 DC 兼容的内存 DC,调用 SelectObject 函数将背景位图选入

6、 DC,当应用程序将指向 DC 的句柄传递给一个图形设备接口(GDI,Graphic Device Interface)的画图函数时,流程界面背景位图显示在屏幕上。这里采用可以设置指定设备环境中位图拉伸模式的函数 StretchBlt,其函数原型如下:BOOL StretchBlt ( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop ); 2其中参数 x,y,nWidth,nHeigh t 为目标矩形位置及大小,p

7、SrcDC 为资源设备环境,x Src,ySrc,nSrcWidth,nSrcHeight 为 资 源 矩 形 位 置 及 大 小 。 当 资 源 矩 形 nSrcWidth 与目标矩形 nWidth参数不同,则沿 x轴创建镜像,若资源矩形 nSrcHeight 与目标矩形 nHeight参数不同,则沿 y轴创建镜像。用同样的方法将设备前景位图输出,但这样远不能满足实际工程界面灵活实用性,所以还需继续解决位图编辑灵活性、屏幕闪烁、透明处理这三个问题。2 实现对前景位图操作功能如下图 1 所示试验段工况中,排气系统与低压系统阀门安装方位不同,为设备前景位图(阀门 )经缩小并沿对角线方向镜像处理后

8、拖移至排气系统管路上。由于现场调试可能需要变更测点个数及位置从而导致调整流程图界面上常用设备位置,所以监控软件界面部分的开发必须实现对前景位图编辑的灵活操作。图 1 监控软件流程图界面(低压部分 )这里可以调用 Windows 封装的 CRectTracker 类。CrectTracker 类无基类,它允许用户在一个视图窗口中移动或者改变矩形对象大小。该类有两个重要数据成员:m_nStyle 成员决定了边框,调整大小控制柄和其他特性;m_rect 成员为矩形保持设备坐标。重要的成员函数有四个,一个为:void Draw( CDC* pDC ) const;Draw 函数画出跟踪器(边框和调整大

9、小控制柄),但在矩形内不画出任何东西。一个是: BOOL Track( CWnd* pWnd, CPoint point, BOOL bAllowInvert = FALSE, CWnd* pWndClipTo = NULL );这里将bAllowInvert置为 true,则矩形跟踪器可以沿 X轴和 Y轴翻转;在 WM_LBUTTONDOWN处理程序中调用这个函数 Track。WM_LBUTTONDOWN 消息在用户按下鼠标左键的情况下发送。还有一个即:int HitTest( CPoint point ) const;其返回值基于其成员函数 TrackerHit列举的类型如下表所示: 类型

10、 返回值 光标位置CRectTracker:hitNothing -1 矩形框外(未选中)3CRectTracker:hitTopLeft 0 矩形左上角CRectTracker:hitTopRight 1 矩形右上角CRectTracker:hitBottomRight 2 矩形右下角CRectTracker:hitBottomLeft 3 矩形左下角CRectTracker:hitTop 4 矩形顶部CRectTracker:hitRight 5 矩形右部CRectTracker:hitBottom 6 矩形底部CRectTracker:hitLeft 7 矩形左部CRectTracker

11、:hitMiddle 8 矩形中部当返回值小于零(即为1)表示未选中状态,返回值大于等于零表示选中状态。再有一个函数:BOOL SetCursor( CWnd* pWnd, UINT nHitTest ) const;我们在视图的WM_SETCURSOR处理程序中调用此函数,确保光标在跟踪期间发生变化。如果 SetCursor返回 FALSE,调用基本类中的 OnSetCursor函数,其原型为 afx_msg BOOL OnSetCursor( CWnd* pWnd, UINT nHitTest, UINT message )。为了使应用程序整体框架合理,新建MyRect 类继承 CRect

12、Tracker 类,声明一个 SetSelect 函数设置选中状态;再声明一个DrawRect(CDC *pDC)函数,用同创建流程图界面相似的方法调用 StretchBlt 函数在屏幕上绘出前景设备位图。 因为在背景图中需绘出状态不同的同一个前景设备位图,所以在 CDocument 中定义一个类模板结构 CArray m_Array,指定在此结构中存储 CMyRect 类的对象;每调用一次 CArray 类的成员函数 ADD(其函数原型为 int Add( ARG_TYPE newElement ),就会在背景位图中添加前景设备位图。具体要做的是在工具栏中添加一个阀门图标,其 ID 为:ID

13、D_ADDFAMEN,通过 ClassWizard 添加消息映射函数 afx_msg void OnAddFamen()来调用 CArray 的函数 Add;每点击一次工具栏的阀门图标就增加一个阀门。新增加所有图形修改完毕后重新组合,即可实现流程图界面的组态功能。3解决屏幕闪烁但是当对设备前景位图作拖动、缩放、镜像处理时,会不断的刷新屏幕,由于直接在屏幕上绘制图形需要一定的时间,如此频繁的更新屏幕,产生了严重的闪烁现象。这是在动画显示时也常遇到的难题。产生屏幕闪烁的原因是:每次用户需要刷新屏幕时,一般是强制调用 Invalidate 函数,致使 Windows 产生两个消息,一个是 WM_ER

14、ASEBKGND 消息,另一个是 WM_PAINT消息。窗口收到 WM_ERASEBKGND 消息后,利用窗口背景刷子对窗口的失效区域进行填充;收到 WM_PAINT 消息后,调用视图类的消息处理函数 OnPaint,而在 OnPaint 内部调用 OnDraw 函数,进行绘图操作,完成视图的刷新。在不断更新窗口过程中,系统反复发送这两个消息,窗口背景反复被擦除和绘制,这正是产生闪烁现象的根源。解决屏幕闪烁的方法最常用的有两种,一种是在屏幕刷新的时候尽可能减小失效区域的大小,即先确定需要刷新区域的大小,然后调用 InvalidateRect 函数代替 Invalidate 函数使每次只更新需要

15、更新的部分,这样可以降低屏幕闪烁带来的影响,但这并不能从根本上解决屏幕闪烁。另一种方法是利用双缓冲技术,即先将 GDI(Windows 的图形设备接口)的绘图操作绘制到内存中的一幅位图里,然后将此位图由内存复制到显示设备上进行显示,并且截获 WMERASEBKGND 消息,不让其进行背景擦除操作,而是利用位图背景刷子填充背景,这种方法可以完全消除屏幕闪烁现象。根据双缓冲技术的原理,为简化操作过程将其封装成一个内存 DC 类 CMemDC,在此类的构造函数中加入创建兼容内存 DC 和兼容位图的代码,并确定失效区的大小,而在其析构函数中加入将位图拷贝到显示 DC 进行显4示的操作,这样便能自动实现

16、上述操作。4透明处理Windows 的位图都是规则的矩形,然而,实际的设备图形或流向线却大多是不规则的,这就引出一个问题:当把这幅位图往背景图中贴入的时候,使这幅规则的矩形位图中除了所需显示的图形外其余地方都显示为透明色,从而使之融入背景。对图形进行透明化处理主要有三种方法,一种是逐点绘图法,二为直接写屏法,三是光栅操作。由于逐点绘图法效率较低,直接写屏法编程较复杂,所以采用简单易操作的光栅处理。这里使用可以对指定的源设备描述表中的矩形区域内像素的颜色数据进行位块转换并将结果值置于目标设备描述表中的 TransparentBlt函数,其原型如下:BOOL TransparentBlt( HDC

17、 hdcDest, int nXOriginDest, int nYOriginDest,int nWidthDest, int hHeightDest,HDC hdcSrc, int nXOriginSrc,int nYOriginSrc,int nWidthSrc, int nHeightSrc, UINT crTransparent );HdcDest 为指向目标设备环境的句柄,nXOriginDest, nYOriginDest, nWidthDest, nHeightDest 分别为目标矩形的左上角 X、Y 轴坐标,宽度,高度;hdcsrc 为指向源设备环境的句柄;nXOriginS

18、rc, nYOriginSrc, nWidthSrc, nHeight 为指定源矩形的左上角的 X,Y 轴坐标,宽度及高度;crTransparent 将源位图 RGB 值当作透明色。文中设备位图背景色为白色,RGB 值(255,255,255) 。TransparentBlt 函数支持源位图的所有格式。如果源矩形和目标矩形大小不一致,将对源位图进行拉伸使之与目标矩形匹配。但源位图或者目标位图的宽度或高度为负值时函数 TransparentBlt将不对位图进行镜像操作,为此需修正MyRect 类的成员函数 DrawRect 中的光栅操作函数 StretchBlt 的坐标值。这里进行一个判断,当

19、宽度或高度小于零时调整目标矩形坐标使 nWidth 与 nHeight 为正值从而使TransparentBlt函数支持镜像操作的透明显示。5结束语本文采用 VC6.0 成功实现了监控软件流程图界面的组态功能,解决了屏幕刷新时遇到的屏幕闪烁问题并给出对图像进行透明处理的简单易实现的光栅操作法。本文中采用的方法已经在实际工程中应用,取到了较好的效果。参考文献:1 David Iseminger. Microsoft Win32 Developers Reference LibraryM.前导工作室译.北京:机械工业出版社,20012 D J.Kruglinski, S. Wingo, G.She

20、pherd 等著. Visual C+6.0 技术内幕M. 希望图书创作室译.北京:北京希望电子出版社,20003 张旭明, 徐滨士, 董世运等. 同一窗口中文本与位图动态显示的 VC+实现方法. 计算机应用.第 23 卷第二期作者简介:史京玲,(1975-),女,山西省阳泉人,在读硕士,主要从事计算机过程控制方面的研究。刘旺开,男,湖南省茶陵县人,教授,主要从事控制理论与控制工程方面的研究。白 涛,男,北京市人,工程师,主要从事测量及计算机控制方面的研究。联系电话:010-82317525, 13693043070 Email:(100083 北京航空航天大学 航空科学与工程学院 流体所) 刘旺开(100083, BeiHang University, Aeronautics Science and Engineering School, LiutiSuo) Liu Wangkai

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报