当数据量非常大时,画图可能须要几秒钟甚至更长的时间,并且有时还会出现闪屏现象,为了解决这些问题,采用双缓冲技术来画图。
我之前写过利用双缓冲技术实现的c++别踩白块实现,大家可以参考。
双缓冲即在内存中创建一个与屏幕画图区域一致的对象,先将图形绘制到内存中的这个对象上,再一次性将这个对象上的图形复制到屏幕上,这样能大大加快画图的速度。双缓冲实现步骤例如以下:
1、在内存中创建与画布一致的缓冲区
2、创建位图并选入内存设备
3、在缓冲区绘图
4、将缓冲区位图复制到当前画布上
5、释放内存缓冲区
01 void CDialogGDIDlg::OnPaint()
02 {
03 CPaintDC dc(this); //设备描述符
04 CDC dcMemory;
05 dcMemory.CreateCompatibleDC(NULL); //创建设备兼容的内存设备
06 CRect bkRect;
07 GetClientRect(&bkRect); //获取客户区域大小区域
08 CBitmap bitmap;
09 bitmap.CreateCompatibleBitmap(&dc, bkRect.Width(), bkRect.Height());
10 SelectObject(dcMemory.GetSafeHdc(), bitmap); //将位图载入内存设备
11 using namespace Gdiplus;
12 Graphics graphics(dcMemory.m_hDC);
13 Pen newPen(Color(0,255,0),3);
14 //创建一个填充画刷,前景色为红色,背景色为蓝色
15 HatchBrush newBrush(HatchStyleCross,Color(255,255,0,0),Color(255,0,0,255));
16 //在(10,10)处绘制一个长为200,高为100的矩形
17 graphics.DrawRectangle(&newPen,10,10,200,100);
18 //在(10,10)处填充一个长为200,高为100的矩形区域
19 graphics.FillRectangle(&newBrush,10,10,200,100);
20 dc.BitBlt(0,0,bkRect.Width(),bkRect.Height(),&dcMemory,0,0,SRCCOPY);
21 }
第4、5行创建一个内存设备,并创建设备的兼容性。第6、7行获取窗体的大小。第8~10行根据窗体大小创建一个位图,并将这个位图选入内存设备。第11~19行利用GDI+将图像绘制到内存设备上。第20行利用GDI将内存图像复制到屏幕上。