如何用DELPHI实现虚拟屏幕?(140分)

  • 主题发起人 主题发起人 yanliang
  • 开始时间 开始时间
Y

yanliang

Unregistered / Unconfirmed
GUEST, unregistred user!
我最近遇到这么一个问题:
用CANVAS在FORM上画一棵树,树的每个结点用一个小矩形框表示。随着树的层数的增加,
在同一层上要画的矩形个数也不断增加。到最后,屏幕上已经不能再显示了。但由于这棵
树没有显示完全,所以还必须继续画。这时,就遇到虚拟屏幕的问题。也就是只要能先
再内存中把整棵树画完,再把它分成许多个块,每屏显示一个块,要查看整棵树时,只需
不断的切换这些块即可。
问题是:如何用DELPHI实现虚拟屏幕技术?
 
像RPG游戏中的地图滚动效果吗?用DIRECTDRAW吧!
 
在32 Bit Delphi 深度历险中有一个控件专门制作虚拟屏幕:
VDESKTOP.ZIP
能够轻易建立虚拟桌面管理工具 ( Virtual Desktop Manager ) 的非可视构件
( 1.0 版,附源码 ),作者 : James Azarja
http://www.vclxx.com/DELPHI/D32FREE/VDESKTOP.ZIP
 
为什么要自己画树呢?
在树上画不行么?
 
to mogao:
我的机子上不了32 Bit Delphi 深度历险,不只你能不能给我发一个过来?
另外:
我找了一个叫bittree的控件,也是作虚拟屏幕的。但安装成功后运行它的DEMO时,
却出现“ DsgnIntf.dcu”没找到的错误信息提示。我再系统中找了一下,发现在
borland/delphi5/projects/source/下有个 DsgnIntf.pas文件,却没有程序想要得文件。
不知那位大虾受中有 Dsgnintf.dcu这个文件?如有请给我发一个!谢谢!
我的E--mail: liang_mayuan@263.net
越快越好!
 
需要用控件吗?

建立一个位图对象,在位图上画树,

分块拷贝到Form的Canvas上不就行了?
 
请问hustmouse:
如何画位图?(有点幼稚,但请不要见笑,我没有接触过这方面的操作)
应着重看那些资料?这些资料那里有?
谢谢!我的赶紧在这两天内完成。
 
var bitmap:TBitmap;

bitmap := TBitmap.create;
//设置属性,如长,宽,等

for i:=0 to tree_numbers do
begin
draw_tree( i, bitmap.canvas );
end;

form.canvas.draw( bitmap );
 
to hustmouse:
谢谢你!
不过,现在问题有出来了:
我作了一个1000*1000的位图,在FORM上显示时只能显示一部分,现在我想看那些
没有显示出来的部分,应该有两条路径:
1。把位图分成许多块,然后分块显示。给每块遍上序号,再通过调用块的序号来
显示位图。问题是:如何分割位图?如何通过调用块号来显示块?
2。如果上面的方法不行,能不能给canvans加上scrollbar,通过拉动scrollbar来实现
查看整个图的目的?如果可以,应如何实现?
3。如何将画在form的canvas上的图形存到位图中去?
 
用CopyRect等方法,可以实现部分拷贝,具体函数忘了,你仔细看一下相关
函数,肯定有的。(方法1)

实际上,用ScrollBar也可以,响应ScrollBar的事件,再调用上面说的方法
根据当前应该显示的坐标进行拷贝即可。(方法2与方法1差不多)

还是可以用CopyRect,将form上的canvas拷贝到bitmap的canvas中就可以了


 
to hustmouse :
能不能对位图用放大镜,比如,由于整个图太大,看起来不方便,可以先把整个图
缩小,待找到要显示的点后,再以那个点为中心进行局部放?
 
可以!

API有个StretchBlt,Delphi应该也有对应的函数(我现在手头没有Delphi)

注意放大缩小都只对原图操作,否则效果不好。
 
to yanliang:
我已经给你发过去了。
Dsgnintf.dcu文件就是Dsgnintf.pas编译过的文件。你把source下的文件copy到delphi5/lib下
或你写的程序目录下,就可以编译了
 
to mogao:
控件我已经收到,谢谢你!
但我已经把dsgnintf.pas拷到lib文件夹下,但还是不能编译,为什么?
 
to all:
昨晚上我试了一下image控件,目的基本达到了,但就是效果不理想。
我是这样实现的:
在FORM上放一个IMAGE控件,在FORMCREATE事件中添加如下代码:
image1.width:=1500;
image1.height:=1500;
运行后自动生成scrollbar.我把整棵树画上去后在拉动scrollbar时,屏幕抖动的
厉害。要是拉的急一点整个屏幕就没法子看了。不知这是什么原因造成的?有什么
改良的办法吗?
用位图的办法我也试过了,但当鼠标在位图上滑动时,如何确定鼠标的坐标?
比如,如果用IMAGE我可以在IMAGE的 moveover事件中得到当鼠标在IMAGE上滑动时的
鼠标坐标。
 
其实你的鼠标就是在Form上动啊!

 
to hustmouse:
我现在已经用image基本实现,但还想再增加放大缩小功能。
对image能不能放大缩小?如果可以,怎样实现?
我见得放大缩小的例子,全是对bitmap的。
 
它有个scale属性,设为true,将autosize设为false,

再改变image的大小
 
to hustmouse:
鼠标变成放大镜的代码怎样写?
(最后一个问题了):
谢谢你(和其他人)帮我解答这些问题!
 
设置鼠标形状,

如:screen.cursor 等属性,Form应该也有的(我忘记了)

自己编辑一个放大镜的光标资源或者拷贝一个
 
后退
顶部