GDI+的双缓冲绘图方法【恢复】
这是自己整理的资料和经验分享,原来放在blog上的,现在转过来和大家分享。常规的直接绘图方法示例:
Graphics graphics(SampleCtrl.GetDC()->GetSafeHdc()); // 从Device Context中创建GDI+绘图对象
// 开始绘图
Pen pen(Color(255, 255, 255, 255));
graphics.DrawLine(&pen, x1, y1, x2, y2);
...
双缓冲绘图方法示例:
Bitmap bitmap(width, height); // 创建位图对象
Graphics graphics(&bitmap); // 从位图对象中创建GDI+绘图对象,作为绘图缓冲区
Graphics graphicsDisplay(SampleCtrl.GetDC()->GetSafeHdc()); // 从Device Context中创建另一GDI+绘图对象,作为前台显示
// 开始在缓冲区中绘图
Pen pen(Color(255, 255, 255, 255));
graphics.DrawLine(&pen, x1, y1, x2, y2);
...
// 把缓冲区内容搬到前台显示
graphicsDisplay.DrawImage(&bitmap, 0, 0, width, height);
双缓冲绘图原理及优点:
先将图像绘在位图对象中,然后将位图内容整体绘到Device Context中。
直接在Device Context上绘图,每条线、每个圆等绘图内容都是在绘制的同时显示的,会耗费一些系统资源,如果绘图内容比较多,则会带来闪烁感甚至看到绘图的过程,尤其是在窗体重绘事件中更明显。而先在位图中绘图,则无需耗费系统资源来显示,速度会快一些,而且最后的绘图结果是作为一整个位图直接绘制在屏幕上的,即使绘图内容很多时也不会看到绘图过程和带来闪烁感。 能否把SampleCtrl的定义给全? ucGUI里面有这个东东 不错~ 学习
页:
[1]