65.9K
CodeProject 正在变化。 阅读更多。
Home

GDI+双缓冲

2002年2月12日

2分钟阅读

viewsIcon

244923

downloadIcon

4743

关于GDI+双缓冲的简单示例。

Sample Image - GDIPlus.jpg

引言

这是一个关于 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+ 的支持和优秀文章,我使用了他的一些代码和想法。

© . All rights reserved.