zoukankan      html  css  js  c++  java
  • 双缓冲绘图记录:

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

    同时,





    I see I come I conquer.
  • 相关阅读:
    GDI+绘制字体显示不全
    vector赋值
    创建不响应(不激活)窗口
    MouseHover
    duilib窗口从任务栏恢复问题
    java 加解密
    maven依赖仲裁
    $.ajax()
    mybatis 动态SQL
    Json学习
  • 原文地址:https://www.cnblogs.com/yTPety/p/3007f4a3af024a54070618a1611e2990.html
Copyright © 2011-2022 走看看