gpt4 book ai didi

c# - 如何使用 GDI+ 合法地滚动?

转载 作者:太空狗 更新时间:2023-10-29 23:35:26 26 4
gpt4 key购买 nike

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

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

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

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

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

或者,我是否应该做一些矫揉造作的事情,比如直接在面板控件上绘制,然后直接从左向右滚动面板本身?

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

最佳答案

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

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

在 32 位 Windows XP 上进行测试,我发现限制在 2.379 亿像素左右。这对于大多数控件来说肯定足够了,但对于您的应用程序来说可能还不够。

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

Width   Height    Area (pixels)======   ======    ===========32,767    7,261 237,921,18725,000    9,517 237,925,00023,792   10,000 237,920,00020,000   11,896 237,920,00015,861   15,000 237,915,00015,000   15,861 237,915,00011,896   20,000 237,920,00010,000   23,792 237,920,000 9,517   25,000 237,925,000 7,261   32,767 237,921,187

关于c# - 如何使用 GDI+ 合法地滚动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2276985/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com