Jam*_*mes 5 .net c# user-controls scroll gdi+
在GDI +中有一个首选的,快速的用户控件滚动方法吗?
我创建了一个控件,以图形方式呈现水平可滚动的数据图.
目前,我的控件通过将水平滚动条的位置转换为数据的偏移来进行操作.然后,控件呈现基于控件宽度计算的该起点和终点之间存在的数据.
这种方法有效,但速度很慢.我不希望在每次滚动事件时手动重绘整个控制界面.相反,我想通过将图形数据的整体(或部分)绘制到屏幕外表面来初始化控件,然后通过使控件表面从偏移处开始读取预渲染图形数据来虚拟滚动控件表面.由水平滚动条的位置计算.
BitBlt是唯一的方法吗?我是否真的必须手动将图形数据从一个表面复制到另一个表面?我不能只接管Paint事件并使其在渲染时从屏幕外表面读取数据吗?这样,复制和渲染操作就是同一个.
或者,我应该直接向Panel控件执行某些操作,然后直接从左到右滚动面板本身?
澄清:基本上,我想知道滚动预渲染数据的正确方法.如何在控件中滚动图形数据?重绘预渲染图形不是正确的选择.
是的,我会尝试双缓冲。如果渲染到离屏位图,则只需滚动位图即可。
您可以尝试将整个图形渲染为一张大位图,然后让滚动条移动它。但是,如果您的图形非常大,那么您需要将位图的大小限制在可见区域,仅绘制其可见的内容,并像现在一样处理滚动。
在 32 位 Windows XP 上进行测试,我发现限制约为 2.379 亿像素。对于大多数控件来说这当然足够了,但对于您的应用程序来说可能还不够。
出于好奇,以下是我们能够创建和使用的最大 Windows 位图大小:
宽度 高度 面积(像素) ======================== 32,767 7,261 237,921,187 25,000 9,517 237,925,000 23,792 10,000 237,920,000 20,000 11,896 237,920,000 15,861 15,000 237,915,000 15,000 15,861 237,915,000 11,896 20,000 237,920,000 10,000 23,792 237,920,000 9,517 25,000 237,925,000 7,261 32,767 237,921,187