我正在使用Visual C ++进行一些GDI +绘图,并注意到我的画布在滚动,调整大小等时看起来不是最好...由于大量闪烁和慢重绘。从我所读到的,解决方案是双缓冲,但是如何实现有相互矛盾的建议。
一些消息来源建议使用现有的.NET实现,如下所示:
using namespace System::Windows::Forms;
this->SetStyle(ControlStyles::AllPaintingInWmPaint |
ControlStyles::UserPaint |
ControlStyles::DoubleBuffer, true);
更多来源建议只需绘制到您自己的位图,然后将其投放到屏幕上:
dbBitmap = gcnew Bitman(ClientRectangle.Width, ClientRectangle.Height);
dbGraphics = Graphics::FromImage(dbBitmap);
// use the graphics object to do everything you need to here
this->createGraphics()->DrawImageUnscaled(dbBitmap, 0, 0);
这些方法之间是否存在功能差异,或者我只是将微软在后台所做的工作放在首位?我关注速度和效率,以及使用一种方法而不是另一种方法可能存在的缺陷。
答案 0 :(得分:1)
只需在构造函数或“属性”窗口中将窗体的DoubleBuffered属性设置为true即可。你要在Paint事件中绘图,使用CreateGraphics()是永远不正确的。如果发生需要重新绘制窗口的事件,请调用Invalidate()或Update()。