WIN32 API 双缓冲绘图记录:
当数据量很大时,绘图可能需要几秒钟甚至更长的时间,而且有时还会出现闪烁现象,为了解决这些问题,可采用双缓冲技术来绘图。双缓冲绘图的原理就是创建一个内存DC,把需要做的绘图操作在里面完成,然后一次性的汇出到显示DC上.
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | //双缓冲绘图: HDC dc,dcmen1,dcmem2; //dc为绘图DC,一般通过GetDC函数得到, HBITMAP bm[100],bmcache; //dcmen1,dcmen2为内存DC. HGDIOBJ oldbm1,oldbm2; SIZE bmSize; dc=GetDC(hWnd); dcmen1=CreateCompatibleDC(dc); //创建两个内存DC, dcmen1=CreateCompatibleDC(dc); for ( int i=0;i<100;i++) //这个for循环为例子. { bm[i]=LoadBitmap(hInstance,MAKEINTRESOURCE (IDB_BITMAP1+i) if (!bm[i]) { MessageBox(NULL,L "位图载入失败" ,L "出错" ,MB_OKCANCLE); break ; } GetBitmapDimensionEx(bm[i],&bmsize); //获得位图大小. bmcache=CreateCompatibleBitmap(dc,bmsize.cx,bmsize.cy); //创建位图大小的虚拟位图,便于后面将位图DC复制到这. oldbm1=SelectObject(dcmem1,bmcache); //将位图选择到DC. oldbm2=SelectObject(dcmem2,bm[i]); BitBlt(dcmen1,0,0,bmsize.cx,bmsize.cy,dcmen2,i*bmsize.cx,0,SRCCOPY); //此处通过设置复制DC的位置实现图片的连续显示,而不是所有图片在同 //一地方 SelectObject(dcmen2,oldbm2); SelectObject(dcmen1,oldbm1); } BitBlt(dc,0,0,bmsize.cx*100,bmsize.cy,dcmen1,0,0,SRCCOPY); //将绘图完成的DC复制 //到输出DC上.尽量减少屏幕闪烁. DeleteDC(dcmen1); //销毁DC DeleteDC(dcmen2); //////////////////////////////////////////////////////////////////////////////// 大概步骤是: 创建内存DC,载入及创建位图,将位图选择进DC,(绘图,复制到缓存DC)N次,将缓存DC复制到屏幕DC. |
同时,在WIN32中,绘图操作不能放在WM_CREATE一类瞬间调用的消息处理函数中,可以放在WM_PAINT WM_ERASEBKGND等. 绘图DC,HBITMAP须是全局变量.最好是static.
__
同时,