GDI+Visual Studio .NET 2002Visual C++ 7.0Windows 2000Visual C++ 6.0Windows XPMFC初学者开发Visual StudioWindowsC++
GDI+双缓冲






4.85/5 (20投票s)
2002年2月12日
2分钟阅读

244923

4743
关于GDI+双缓冲的简单示例。
引言
这是一个关于 GDI+ 的简单示例,我将其用在我的第一个 GDI+ 项目中。本文重点介绍双缓冲。 首先,如果您想为您的项目添加 GDI+ 支持,可以参考 Starting with GDI+,作者是 Christian Graus。
我的示例的主要部分在 OnPaint
函数中,您可以在那里看到所有内容,包括图像、字体、画笔等。它们都非常清晰,因此我不再赘述。我只在这里解释“双缓冲”。
如您所知,您可以将图像绘制到您的窗口中,并从纹理画笔创建画笔或笔,然后使用图像绘制形状或线条。您甚至可以通过提供纹理画笔来使用图像绘制文本。(您可以在本文或 Christian Grause 的文章中找到示例)
我认为图像最重要的用途之一是双缓冲技术。当我们要创建的绘制内容包含许多细节时,即使在快速计算机上,绘制也可能非常耗时。在这种情况下,图像在绘制时似乎会逐渐显示在屏幕上。例如,在地图应用程序或 CAD/CAM 应用程序中,我们可能会遇到这个问题。在这种技术中,我们不是直接在屏幕上绘制,而是首先将内容绘制到图像中,然后将图像绘制到窗口中。以下是我的双缓冲示例
srand( (unsigned)time( NULL ) ); int number = rand(); number /= RAND_MAX + 1; number *= 254; Rect rc(rect.left,rect.top,rect.right,rect.bottom); Bitmap bmp(rect.right,rect.bottom); // Create a Graphics object that is associated with the image. Graphics* graph = Graphics::FromImage(&bmp); for(int x=0;x<rect.right;x++) { for(int y=0; y<rect.bottom; y++) { double number = rand(); number /= RAND_MAX + 1; number *= 254; Pen pen(Color(number,number,number,number)); graph->DrawLine(&pen,0,0,x,y); } } // Draw the altered image. graphics.DrawImage(&bmp,rect.left,rect.top,rect.right,rect.bottom);
在我的计算机(AMD 1.33GHz 和 256Mb RAM)上,不使用双缓冲绘制屏幕需要 36 秒,而使用此技术只需要 5 秒。你知道,每次你的窗口需要重绘时等待 36 秒是没意思的!
最后,我想感谢 Christian Graus 对 GDI+ 的支持和优秀文章,我使用了他的一些代码和想法。