Double Buffering With GDI+
http://www.codeproject.com/KB/GDI-plus/gdiplus.aspx
绪论
这是一个简单的关于GDI+的例子,我在我的第一个GDI+工程中使用过。本文关注复式抛光。首先你应当为你的工程添加GDI+支持,具体你可以参考Christian Graus的《Starting with GDI+》。
例子的主体部分是OnPaint函数,你可以在这个函数中看到一切:图像、字体、画刷等等。这些都比较清晰明了,所以我不加以讨论。我仅仅在这说明“复式抛光”。
正如你所知,你可以在视窗上画图,还可以从TextureBrush创建一个画刷或者画笔然后画各种图形或者线条。你甚至可以用TextureBrush支持的图像来写字。(你可以参考本文的例子或者Christian Graus的文章)
我认为复式抛光是图像中最重要的应用技术之一。在我们想创建图像的时候,这项技术还有很多应用细节,并且现在是快速计算机画图的时代。在这个解决方案中,在画图的时候你可以看到图像在屏幕上爬行。例如我们在地图应用软件或者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);
这在我电脑(AMD1.33G,内存256M)的屏幕上画图花费了36秒,但是应用复式抛光技术只用了5秒钟。你知道的,当你的窗口需要重绘的时候你每次都得等上36秒,这是多么无聊的。
最后,我想感谢Christian Graus的支持和文章,我使用了一些他写的关于GD+文章中的代码和思想。