双缓冲绘图记录:

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.
__

同时,





posted @ 2013-04-11 20:31  鱼在动态晒太阳  阅读(277)  评论(0)    收藏  举报