如何用GDI +合法滚动?

时间:2010-02-16 22:46:14

标签: c# .net user-controls gdi+ scroll

在GDI +中,是否有一种首选的快速滚动用户控件的方法?

我创建了一个控件,以图形方式呈现水平滚动数据图。

目前,我的控件通过将水平滚动条的位置转换为数据的偏移来进行操作。然后,控件将根据控件的宽度呈现此起点和终点之间存在的数据。

此方法有效,但速度很慢。我不希望在每次滚动事件时手动重绘整个控制界面。相反,我想通过将图形数据的整体(或部分)绘制到屏幕外表面来初始化控件,然后通过使控件表面从偏移处开始读取预渲染图形数据来虚拟滚动控件表面。由水平滚动条的位置计算。

BitBlt是唯一的方法吗?我是否真的必须手动将图形数据从一个表面复制到另一个表面?我不能只接管Paint事件并使其在渲染时从屏幕外表面读取数据吗?这样,复制和渲染操作就是同一个。

或者,我应该直接向Panel控件执行某些操作,然后直接从左到右滚动面板本身?

澄清: 基本上,我想知道滚动预渲染数据的正确方法。如何在控件中滚动图形数据?重新绘制预渲染的图形不是正确的选择。

1 个答案:

答案 0 :(得分:3)

是的,我会尝试双缓冲。如果渲染到离屏位图,则只需滚动位图即可。

您可以尝试将整个图形渲染为一个大位图,然后让滚动条移动它。但是,如果您的图形非常大,那么您需要将位图的大小限制为可见区域,绘制可见的区域,并像现在一样虚拟处理滚动。

在32位Windows XP上进行测试,我发现这个限制大约是2.379亿像素。对于大多数控件而言,这当然是充足的,但对于您的应用程序来说可能还不够。

对于好奇,这是我们能够创建和使用的最大Windows位图大小:

Width   Height    Area (pixels)
======   ======    ===========
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