在CScrollView中使用双缓存画图的拖动问题

来源:互联网 发布:linux echo b重启 编辑:程序博客网 时间:2024/05/19 23:55

 原因

    CScrollView中需要画图功能,而且画图的大小超过屏幕的实际大小,为了解决屏幕闪烁的问题,采用了双缓存画图的方法(在内存首先画出图象,然后粘贴到屏幕上),然而,当拖动滚动条的时候,产生了屏幕重叠的问题,下面是具体的解决方法;

思路

 首先在OnDraw函数中画图,下面是简单步骤;

1、  使用CreateCompatibleDC函数,生成一个内存DC

2、  使用CreateCompatibleBitmap创建一个内存BITMAP,图片的大小使用当ScrollView的大小(可以使用GetTotalSize函数获得视图的大小)

3、  内存DC载入内存内存BITMAP

4、  然后内存DC就可以使用画图函数来画图

5、  当前客户区DC使用BitBlt函数把内存DC中的位图粘贴到客户区

对应代码如下:

        void CScrollView::OnDraw(CDC* pDC)

       {    

      CDC * m_pMemoryDC=new CDC();

      CBitmap * m_pBitmap=new Cbitmap();

      CSize sizeTotal=GetTotalSize();

 

            MemoryDC->CreateCompatibleDC(pDC);        

           m_pBitmap->CreateCompatibleBitmap(pDC,sizeTotal.cx,sizeTotal.cy); 

           CBitmap * pOldbmp=m_pMemoryDC->SelectObject(m_pBitmap);

           //此处省略画图部分,可以使用LineTo Textout等画图函数

           pDC->BitBlt(0,0,sizeTotal.cx,sizeTotal.cy,m_pMemoryDC,0,0,SRCCOPY);

             

           //释放资源

           m_pMemoryDC->SelectObject(pOldbmp);      

           m_pBitmap->DeleteObject();

           m_pMemoryDC->DeleteDC();

     delete m_pMemoryDC;

     delete m_pBitmap;

   }

   接着修改OnEraseBkgnd函数,把返回值设为True,代码如下:

    BOOL CScrollView::OnEraseBkgnd(CDC* pDC)

{

              return TRUE;

          }

结论

   优点,当使用视图大小来画图,不需要考虑实际屏幕大小,也不需要考虑滚动条的位置,因为每次都是画整个视图的大小,并且粘贴为整个视图的大小;

   缺点:每次都要把整个图都画完,浪费了资源;

注意:

   在使用双缓存的时候,一定要慎重使用SetWindowOrgSetViewOrg等函数

原创粉丝点击