图形控件容器的最大尺寸是多少?是32767 pixels吗?可否加大?(50分)

  • 主题发起人 watercontainer
  • 开始时间
W

watercontainer

Unregistered / Unconfirmed
GUEST, unregistred user!
[?]我开发图形编辑器时,从TScrollBox继承出一个控件容器,
从TCustomControl继承出图形控件,图形控件放在控件容器中,
当图形尺寸大于32767时,控件便不能加入容器,
同时容器显示不正常。请教各位高手?是否可增大控件容器的容量尺寸?
 
有劳各位大架!

可能我没说全面。我正在做一个作图软件,
类似于cad系统,要求实际图形尺寸不受限制,就象word文档
的大小不受word显示窗体限制一样,只不过我这个容器要同时
能放置图形和TEXT。

TScrollBox是支持滚动条的,但滚动条的最大尺寸好象是
32767 pixels,如果要支持更大范围的滚动,不知如何处理?
比如在word中,一个word文档的实际大小(高度)可能大于
32767 pixels,但一个显示窗体的大小可能只是500pixels,
加上利用显示窗体的滚动条,则该显示窗体可能显示的最大文
档尺寸也是32767 pixels。

如果我的一幅图形尺寸大于32767 pixels,那么如何用
TScrollBox或一个显示窗体来显示呢?
 
你可以自己做一个TScrollBox,
先把TScrollBox中的代码全部Copy过来,
然后把最大尺寸(你这里是32767)的地方
全部改成更大的数值,应该可以。
 
thanks to 鲁小班,
我不太熟悉PASICAL,按您所说查了一下PASICAL原代码,里面关于“3276x”的硬数据有一些
但由于TScrollBox是一个派生类,我想,除非将整个类系(TScrollBox有关)里
“3276x”们改掉,才可能有效。如果这样肯定行,还是值得的,就担心在改动的过程又引起
新的变更需求。

 
用一个象素值非常大的图形空间放置到一个SCROLLBOX里的做法是不可取的,那样会存在
内存开支以及速度上的问题。
可以用如下办法:
一、需要建立一份Tbitmap来记载整个图形的内容。
二、用一个TIMAGE来显示可视窗口。
三、作图:在TIMAGE上作图的同时通过坐标变换在TBITMAP上作图。
四、漫游:通过坐标变换直接拷贝TBITMAP的窗口内容到TIMAGE上。
五、漫游的方法:无需TSCROLLBOX,只需要SCROLLBAR就可以了。此外,应该支持图象拖动漫游。
六、TIMAGE根据漫游和作图的动作来自动适应大小。
 
thanks to wenyue
令我开矛塞
但有问 Tbitmap 的 尺寸不受限制吗?请帮我确认 或详细一点解释
bitmap.height can > 32767 吗?













 
WINDOWS的bitmap的理论上最大支持是32767*32767
一般地,我们根本无法超越。
因为至少耗费内存为:32767*32767 * 2 = 2G (在增强模式颜色下)
而普通WINDOWS SERVER最大支持每进程内存仅仅为2G

当然,假使确实必要,有宽度或者高度需要超越32767的需求
我们可以采用其他的方法来解决,最典型的就是拼图,
倘若图形宽或者高需要超越32767,生成辅助的TBITMAP
拼图需要处理边界状态
如果希望程序简单,作图需要牺牲一些性能,也就是需要更多的图形拷贝
在漫游的时候处理并不复杂,临界区域仅仅只是从多个TBITMAP中分块拷贝到显示的IMAGE上
但是在作图的时候,在边界状况情况就复杂些了
存在两种情况:
一、作图仅仅存在于可视的窗口内。
这种情况比较简单,类似于漫游的逆过程,先在窗口内作图,然后将窗口内的内容
分块拷贝到相应的TBITMAP。
二、作图假如存在需要超越当前窗口,例如写字或者复制图形。这样,必需先创建一个
临时的TBITMAP,该BITMAP一般只是稍微比可见区域大,大小是可以正好容纳做图区域。
然后将原内容从相应的TBITMAP中分块拷贝到中间临时的TBITMAP,接下来就是作图,
然后分块拷贝回相应的TBITMAP。

这样,在边界区作图由于使用了大量的图形拷贝,会导致作图的性能降低。
如果要提高性能,恐怕使用LINETO,MOVETO这些简单的函数的地方都需要修改了。
 
thanks to wenyue
我又有进步。
我的思路是
1)从TGraphicControl继承出图形单元(元素)控件,图形控件放在控件容器中,
2)从TCustomControl继承出“图形容器控件TGraphPage”,图形单元控件放在容器中,
aGraphPage < 32767 * 32767
3)每在“图形容器控件TGraphPage”中作一个图形单元,便在数据库留下一记录,
此记录可完全确定图形单元的位置和再生成信息,
4)在图形单元之间有超长画线连接,图形单元(或元素)本身不大
比如
MoveTo(hdc,0,0);
LineTo(hdc,32768,32768);
如有详细一点的边界处理方案,请赐教 email : liuqianj@163.com














我开发图形编辑器时,从TScrollBox继承出一个控件容器,
当图形尺寸大于32767时,控件便不能加入容器,
同时容器显示不正常。请教各位高手?是否可增大控件容器的容量尺寸?


 
顶部