DEPHI滚动绘图(100分)

  • 主题发起人 主题发起人 z_f123
  • 开始时间 开始时间
Z

z_f123

Unregistered / Unconfirmed
GUEST, unregistred user!
我现在要用delphi来做一个测井数据的解释软件(从数据文件中读数据,进行滚动绘图),江汉石油学院已经有人利用网站上提供的第三方组件实现。但是该组件对目前的D6、D7 、D8 等不适应,在编译安装过程中总是出错:未声明标志(其实是DELPHI自带的建立动态数组的函数)。此外,在绘图过程中图形的刷新问题是个大问题。因为我以前使用VB坐的,油井几千米,绘出的图形占据很多的内存空间,后来束手无策转向DELPHI,希望那位大虾能够帮助小弟一下,我就像一头无头苍蝇乱撞,最好能给一些合理化的建议,万分感激,愿倾囊相受!!我的QQ:279832121。邮箱:z-f123@163.com
万分感激!!
 
动态绘制,只绘制需要显示的部分,不显示的部分不绘,
 
对呀,要看哪段,画哪段
 
不太明白LZ的意思?
如果是只是显示一些简单的线等可以用Delphi自带的TChart
如果比较复杂可以使用DelphiX控件,采用DriectX双缓冲技术刷新时不闪烁
 
需要显示哪里画哪里
但是这样 就会给打印带来问题的
 
打印的时候也可以这样来,自己写Tprinter类的内容,一张一张生成,就没问题了....
所谓的动态绘制就类似与excel ,走到哪画到哪,估计也容易吧
 
我也一直在寻找合适的DELPHI控件,但是没找到,江汉石油学院的文章我看了,那个控件我感觉不太合适,我现在也在作同样的工作,有进展联系一下,邮箱:liangqb@cs.daqing.com
 
可否告我江汉的文章和用的控件的名称,看楼上的MAIL,好象是大庆的。本人也是油田的。

测井图比较长,不能象普通绘图一样申请个位图去绘制,这样的位图太大了,占内存。
应该是根据滚动条的位置动态计算可以显示在窗口内部的数据,只绘制需要显示的数据。单纯的绘制不是很困难的事,困难的在于交互操作。

省略诸多诸多罗嗦的前提条件后,一个只绘制没交互的测井图可以这样绘:

1、坐标映射(屏幕坐标和井深),使用WINDOW自己的或干脆自己写一个。自己写一个对于交互操作和双缓冲比较有利——纯个人看法。

2、找一个合适的窗口基类,如TCUSTOMCONTROL

3、建立窗口设备坐标和逻辑坐标(井深)的对应关系

4、搞定滚动条,可以设置窗口的样式来获取WINDOWS窗口自带的,或使用标准滚动条控件
5、建立滚动条位置与井深的对应关系
6、当滚动时,根据滚动条位置得到窗口顶和底对应的井深,发送INVALIDATE
7、重载窗口的绘制过程,根据顶底井深绘制曲线,对于边框等比较长的线,要做裁剪,避免数据值太大,导致绘制API出错。打印和绘制是一个道理。做的好可以象VC++一样和绘制共享一个处理方法。

如果想进一步提高绘制效率,就必须精确计算需要每次滚动或其他操作后必须重绘的区域,然后发送无效区域给窗口,而窗口的绘制过程也必须是基于无效区域计算后仅绘制无效的这一部分。
 
towk_knife:
 我是西安石油大学的。
 我很赞同你的说法。你所提到的前5项我基本实现了。绘图的时候会遇到问题就是图形的刷新重绘的问题! 这两个问题一直叫我头大。我想问一下你有什么好的建议12 
 
 
如果是滚动条引发的,可以在滚动条消息处理中用SCROLLWINDOW(也可能是SCROLLWINDOWEX滚动窗口),然后调用UPDATAWINDOW;如果是屏幕上对象的改变引发的,就计算无效区域,然后使用InvalidateRect,这两种方法会引发PAINT消息,在PAINT中得到CLIPRECT,然后就CLIPRECT的范围绘制需要绘制的部分。

图形的刷新效率的提高主要就在于:只绘必须重绘的部分。
由于测井数据数据量也比较大,需要遍历是否在无效区的计算过程可能也比较费时,导致时间延迟,有停顿现象,可以进一步根据“窗口”区域(因为滚动条的位置可以决定窗口顶和底对应的井深,减少需要遍历的数据范围,提高速度,不过现在计算机比较快,因为计算带来的延迟并不常见,主要还是要解决大量的绘制带来的延迟。
 

Similar threads

D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
800
DelphiTeacher的专栏
D
D
回复
0
查看
793
DelphiTeacher的专栏
D
D
回复
0
查看
657
DelphiTeacher的专栏
D
D
回复
0
查看
828
DelphiTeacher的专栏
D
后退
顶部