我正在使用C#GDI +创建自定义控件。
快速解释......控件将在屏幕上显示500像素,但可能包含500000像素的信息。因此,虽然我一次只显示500px,但我需要明显在水平面(左和右)滚动。棘手的部分是每个500px的位图块需要一段时间(在100ms到1000ms之间)来渲染。
所以我的计划是在内存中维护一个1500px的位图。即可见区域的500px可见部分和500px,并在用户滚动时以异步方式绘制离屏部分。
我想要一些反馈,建议,批评或代码示例来帮助我实现这一目标。这看起来相当简单,但经过一些初步的测试后,它的证明比人们想象的更难。
感谢。
答案 0 :(得分:1)
这种方法的有效性取决于(其中包括)用户周围的移动量。如果用户进行小的移动,然后停止考虑新信息,这可能会起作用。但是,如果用户来回嗖嗖,你仍然会遇到问题。
您的应用程序是否适合逐步提高图像质量 - 即提供快速可用的图像,然后在用户停止考虑时对其进行改进?
答案 1 :(得分:1)
几年前我遇到了类似的问题。正如dommer所提到的,如果您在显示图像之前处理图像块,则最好先显示某些内容并在以后进行改进。如果你在原始图像上出现问题,你的方法就会出错。 GDI +非常特别关于像素深度(你希望32bpp与alpha)。
在我们的例子中,我们处理了500px的瓷砖,并在可见视图周围填充了一块瓷砖。当用户滚动到我们处理过的区域之外时,我们将原始图像的一些位置加上一个黑色的半透明矩形。他们。这些块排队等待处理。当我们处理图像的块(中心向外)时,它们的半透明矩形将会消失。
它工作得相当好,响应速度非常快。将原始位图blit到屏幕上非常快,在我们的例子中,处理通常非常接近。瓷砖变浅的效果实际上相当漂亮。
答案 2 :(得分: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);