随钻测井曲线无闪烁绘制技术

2010-12-25 07:34唐海全邵才瑞李洪强
测井技术 2010年5期
关键词:窗体绘图内存

唐海全,邵才瑞,李洪强

(1.胜利石油管理局钻井工艺研究院,山东东营257000;2.中国石油大学地球资源与信息学院,山东青岛266555)

随钻测井曲线无闪烁绘制技术

唐海全1,邵才瑞2,李洪强1

(1.胜利石油管理局钻井工艺研究院,山东东营257000;2.中国石油大学地球资源与信息学院,山东青岛266555)

分析了随钻地质导向地面监控系统测井曲线绘图过程中屏幕图形闪烁产生的2个原因。提出了采用不进行背景重绘的方法消除背景刷新引起的闪烁现象,采用内存DC绘图消除测井图形刷新造成的屏幕闪烁现象。给出了具体的实现步骤和基于Visual C++6.0平台M FC基础类库的多文档滚动视图结构。该方法已成功运用在随钻地质导向测井评价系统中的实时曲线显示过程中,使得钻井数据传输过程中画面平滑过渡,实现了图形无闪烁连续显示。

随钻测井;测井曲线;屏幕刷新;无闪烁;位图

0 引 言

钻井过程中,随钻测井曲线绘图系统根据钻头上的传感器采集数据实时绘制测井曲线。为及时地反映井眼轨迹与地层剖面的接触关系以评价地层特性,一般要通过快速地反复刷新屏幕作图区来实现。如果采用常规绘图方法而不加特殊处理,屏幕上常会出现图形闪烁现象。随着钻井深度的增加,测井井段范围和绘图所涉及的数据量增大,屏幕闪烁、停顿等现象会极大地影响程序运行效果。本文在实际随钻测井资料可视化解释软件开发中,采取了内存绘图的方法来解决这些问题。即先在内存中画图,然后再把图像拷贝到屏幕上,从而有效地解决了由于随钻实时绘图而导致的道内曲线显示的屏幕闪烁问题。

1 W indows屏幕刷新机制

在W indow s中,应用程序在4种情况下会发出WM_PA IN T消息请求重新绘图。

(1)当创建窗体、覆盖窗体时,窗口中先前被隐藏的区域重新可见;

(2)用户改变窗体的大小时;

(3)程序调用 Invalidate等函数来发送 1条WM_PA IN T消息指定更新区域时;

(4)滚动窗口用户区以及其他会影响客户区的操作时。

一般在VC中,绘图工作大多由OnDraw函数完成,OnD raw函数通过其参数pDC获得指向屏幕设备环境的指针,继而调用该设备环境封装的成员函数完成图形的绘制工作。当窗口建立时,Window s发送WM_CREA TE消息。当窗口由于某种原因需要重绘时,首先需要将窗口显示区擦除,然后再调用OnPaint函数,继而调用OnD raw函数重新绘图。基本上图形绘制过程可分为绘制——擦除——重绘等3个部分,这其中擦除窗口显示区的操作是必需的。因此,可以得到图1所示的消息图。

图1 W indows绘图消息示意图

Window s接收WM_PA IN T消息后,就会执行OnPaint函数进行窗口的重绘工作。W indow s自身所提供的绘图机制中,重绘窗口分2步进行。首先, Window s要发送WM_ERASEBKGND消息到窗口来通知窗口擦除背景,当窗口接收到WM_ERASEBKGND消息后,会调用OnEraseBkgnd函数来进行处理,这会导致用窗口的背景色填充整个窗口。上述背景重绘之后,接着实现窗口图形的重绘。如果不断有WM_PA IN T消息请求绘图,就总会有窗口背景重绘和图形重绘交替出现。

2 屏幕图形闪烁产生的原因分析

(1)屏幕背景刷新会引起闪烁现象。当创建窗体或改变窗体大小时,窗体背景会被擦除并重画窗体上的图形元素。此时由系统指定作图区域,并且应用程序发出WM_PA IN T消息,在该消息所对应的窗口处理函数中,先由指定的背景刷子来擦除背景,再重画窗体上的图形元素。有时,可能反复触发WM_PA IN T消息。当绘图时间较短、测井绘图井段很长、连续滚动测井图时,就会反复触发WM_ PA IN T消息,通知窗体擦除窗体背景并重画窗体上的测井图形元素。一般情况下,缺省的背景刷子的颜色不是透明的而是有色的,例如白色,那么在1次刷新过程中,用户就会看到绘图区先被白色刷子刷为白色,然后又被画上了测井曲线。由于要实时显示测井曲线,就要反复进行刷新,所以用户就会看到屏幕上交替显示着擦除背景后的白色背景和程序绘制出的随钻测井曲线。由于这种交替显示的频率较高,从而使用户感觉屏幕闪烁。

(2)测井图形刷新造成屏幕闪烁现象。即使克服了屏幕背景刷新引起的闪烁现象,屏幕闪烁也仍然可能存在。测井图形复杂,并且图幅大,特别是在随钻地质导向地面监控系统中,框架窗口包含多个MD I子窗口,不同视窗的客户区需同时画多个测井图形元素。一般的绘图方法是把图形元素一个一个地依次画在相应客户区上,这种方法是以视窗的图形元素为单位来画的。此外,对于同一切分窗口而言,后画的图形元素会覆盖先画的图形元素。所以在用户看来,前面切分窗口的图形元素先画,后面切分窗口的图形元素后画,且先画的图形元素处于下方,后画的图形元素在上方。对于一些操作,需要反复刷新客户区。如当主机和解释软件频繁通信导致连续发送随钻测井曲线数据,特别当每次发送的数据块较大,测井图形道内曲线较多,并且采用直接向屏幕绘图,1次绘完整个井段时,就会出现闪烁现象。

3 屏幕图形闪烁解决方法

在开发随钻测井解释系统中进行绘图时,上面2类闪烁现象同时存在。因此,要完全解决测井绘图屏幕闪烁问题,需要同时解决屏幕背景刷新引起的闪烁现象和测井图形刷新造成屏幕闪烁现象。

(1)针对背景刷新引起的闪烁,采用不进行背景重绘的方法消除。

由于测井绘图本身有背景颜色,所以没有必要让系统每次刷新都要按系统默认方式再去擦除和重绘背景,也就避免了擦除背景引起的闪烁。至于测井图形本身背景颜色的重绘,可以把其看作图形元素绘制,在解决了重绘图形元素引起的闪烁时,就不存在绘制测井图背景引起的闪烁了。针对前面的分析,可采取以下几种方法实现不执行系统默认的擦除背景操作。

①在窗口形成时,把窗口的注册类的默认背景刷修改为NULL,可以实现不擦除背景。

②也可以重载OnEraseBkgnd函数,并在实现该函数时不调用基类函数。

对OnEraseBkgnd函数来说,如果其擦除了窗口背景,将返回非0值。因此,OnEraseBkgnd函数的最后不应该再调用其基类的OnEraseBkgnd函数,而是应该直接返回TRUE值。

(2)针对测井图形刷新造成的屏幕闪烁现象,采用内存DC绘图来消除屏幕闪烁。

这类闪烁现象是由于测井图形刷新时屏幕是以视窗的元素为单位,把测井图形元素逐个画出来而造成的。当以屏幕视窗为单位进行刷新,并且速度较快时,就可以消除闪烁,而在内存DC中绘图,然后拷贝到屏幕的方法恰恰可以实现这样的功能。具体方法是把测井图形先用内存设备环境DC绘制在与显示兼容的位图中,然后从内存环境把测井图形复制到屏幕客户区,这样,在测井图形绘制到屏幕之前,已经将图形绘制在位图中,然后直接复制到屏幕上,从而消除了闪烁。

以下详细介绍利用兼容DC在内存中加载1幅普通单色位图,然后将该位图文件复制到目的窗口中的一般步骤。

①创建位图。先利用CBitmap构造1个位图对象,然后利用LoadBitmap函数加载1幅位图资源。

②创建兼容DC。其中 CreateCompatibleDC函数将创建1个内存设备上下文,与参与参数pDC所指定的DC相兼容。内存设备上下文实际上是1个内存块,表示1个显示的表面。如果想把图像复制到实际的DC中,可以先用其兼容的内存设备上下文在内存中准备这些图像,然后再将这些数据复制到实际DC中。

③将位图选入兼容DC中。当兼容的内存设备上下文被创建时,它的显示表面是标准的单色像素宽和1个单色像素高。在应用程序中可以使用内存设备上下文进行绘图操作之前,必须将1个具有正确高度和宽度的位图选入设备上下文。这时,内存设备上下文的显示表面大小就由当前选入的位图决定了。

④将兼容DC中的位图贴到当前DC中。有多个函数(例如BitBlt函数,StretchBlt函数)可以以几种不同的方式完成这一操作。图2所示的例子是调用BitBlt函数将兼容DC中的位图复制到当前DC中。

图2 显示位图的步骤

通过分析发现,在兼容DC初始创建时,选择的单色位图是通过SelectObject函数将其选入兼容DC来确定其显示表面的大小的。但随钻测井解释系统中没有这样1幅位图,需要去创建1个与当前窗口DC相兼容的DC,它的显示表面大小与当前客户区大小是一致的。可以利用兼容位图来满足这样的要求。CBitmap类的成员函数 CreateCompatibleBitmap可以通过指定的宽和高创建1幅与指定DC相兼容的位图。有了兼容位图之后,就可以把该兼容位图选入兼容DC中,从而确定兼容DC显示表面的大小。

因为兼容DC实际上1块内存,所以利用它绘制的图形在窗口中是看不到的,因此接下来在视图类的OnDraw函数中就可以利用已创建的兼容DC对象,将该DC中的内容复制到目的DC中,从而实现图形的显示。

下面给出基于Visual C++6.0平台M FC基础类库的多文档滚动视图结构,开发随钻测井实时监控软件中沿设计井眼轨迹显示随钻测井曲线模块一些重要函数的参数传递实例。

4 应用效果

这一绘图方法已经成功运用在随钻地质导向测井评价系统中的实时曲线显示过程中。结果表明,与传统的图形显示方式相比,该方法能够有效解决由于实时绘制大数据量的图像而产生的屏幕闪烁问题,实现了钻井数据传输过程中画面的平滑过渡,为进一步提高随钻测井解释工作的效率奠定了基础。

[1] 李 河,王祝文,李舟波,等.大数据量地球物理测井绘图关键技术研究[J].地球物理学进展,2005,20(1):71 -77.

[2] 闫建平,蔡进功,首祥云,等.基于Visual C++的成像测井图像双缓存视图显示[J].测井技术,2007.31(6): 864-867.

[3] 孙 鑫,余安萍.VC++深入详解[M].北京:电子工业出版社,2006.

[4] 杨永国.Visual C++6.0实用教程[M].北京:清华大学出版社,2004.

[5] 谭亚军.Window s环境中能谱图形无闪烁快速显示的一种方法[J].核电子学与探测技术,1996,16(3):177-181.

[6] 王洁宁,侯启真.应用离屏实现窗口无闪烁图像显示技术[J].中国民航学院学报,2001,19(3):38-41.

Flicker-free Rendering Technology of LWD Curves

TANG Haiquan1,SHAO Cairui2,L IHongqiang1
(1.Drilling Technology Research Institute of Shengli Oilfield,Dongying,Shandong 257000,China;2.College of Geo-resources and Information,China University of Petroleum,Qingdao,Shandong 266555,China)

Analyzed are the 2 reasons causing screen flicker in the p rocess of logging curves redraw operation for LWD interp retation system.Screen flicker caused by background ref resh is elim inated by cancellation of background redraw.Screen flicker caused by logging curves refresh is eliminated by using memory DC p lotting.Provided are the detailed realization p rocedure and m ulti-document scroll view structure based on Visual C++6.0 and M FC base class library. This technology has been used in real-time curve disp lay successfully,and has made the image transition smoothly in the p rocessof drilling data transmission so as to get the flicker-free rendering of LWD curves.

logging w hile drilling(LWD),logging curve,screen refresh,flicker free,bitmap

1004-1338(2010)05-0479-04

P631.83; TP31

A

唐海全,男,1982年生,硕士,从事随钻测井解释软件开发及井下测量仪器现场技术服务工作。

2010-05-18 本文编辑 王小宁)

猜你喜欢
窗体绘图内存
来自河流的你
“禾下乘凉图”绘图人
“春夏秋冬”的内存
试谈Access 2007数据库在林业档案管理中的应用
垂涎三尺
内存搭配DDR4、DDR3L还是DDR3?
Surfer和ArcView结合在气象绘图中的应用
基于内存的地理信息访问技术
巧设WPS窗体控件让表格填写更规范
上网本为什么只有1GB?