2

我正在使用 C# GDI+ 创建一个自定义控件。

快速解释...该控件将在屏幕上显示 500 像素,但可能包含 500000 像素的信息。因此,虽然我一次只显示 500 像素,但我显然需要在水平面(左右)滚动。棘手的部分是每个 500 像素的位图块需要一段时间(在 100 毫秒 - 1000 毫秒之间)来渲染。

所以我的计划是在内存中维护一个 1500px 的位图。即 500px 可见部分和 500px 可见区域的任一侧,并在用户滚动时异步绘制屏幕外部分。

我想要一些反馈、建议、批评或代码示例来帮助我实现这一目标。这看起来相当简单,但经过几次初步测试尝试后,它被证明比人们想象的要困难得多。

谢谢。

4

3 回答 3

1

这种方法的有效性取决于,除其他外,用户将做的移动量。如果用户正在做小动作,然后停下来考虑新信息,这可能会起作用。但是,如果用户来回呼啸而过,您仍然会遇到问题。

您的应用程序是否有助于逐渐提高图像的质量——即提供一个快速可用的图像,然后在用户停止考虑时对其进行改进?

于 2009-04-07T20:01:53.757 回答
1

几年前我也遇到过类似的问题。正如 dommer 所提到的,如果您在显示它们之前处理图像的块,那么您最好显示一些东西并稍后改进它。如果您在对原始图像进行 blitting 时遇到问题,则说明您的方法有问题。GDI+ 对像素深度非常特别(你想要 32bpp 和 alpha)。

在我们的例子中,我们处理了 500px 的图块,并在可见视图 Ff 周围填充了一个图块,当用户滚动到我们处理的区域之外时,我们用叠加在它们上面的黑色半透明矩形对原始图像的位进行了 blitted。这些块已排队等待处理。当我们处理图像的大块(居中)时,它们半透明的矩形会消失。

它工作得相当好,反应灵敏且速度非常快。将原始位图 blit 到屏幕上非常快,在我们的例子中,处理通常非常紧随其后。瓷砖变亮的效果其实还是蛮漂亮的。

于 2009-04-07T20:10:27.950 回答
1

仅绘制可见区域。构建方法

Bitmap DrawGraph(leftMargin, rightMargin) {...}

然后在OnPaint()

Bitmap bmp = new Bitmap(e.ClipRectangle.Width, e.ClipRectangle.Height);
bmp = DrawGraph(e.ClipRectangle.Left, e.ClipRectangle.Right);

e.Graphics.DrawImageUnscaled(bmp, e.ClipRectangle.Location);
于 2010-07-20T16:29:07.523 回答