zoukankan      html  css  js  c++  java
  • MFC 双缓存绘图

    在SDI应用程序中,当我们需要时刻动态刷新界面的时候,如果我们一直使用,UpdateAllView()那么就会出现屏幕不停闪烁。闪屏非常严重,特别是一直在动态刷新的时候。并且在闪屏的过程中 我们根本就不能进行任何操作。那么此时我们就需要改变我们刷新的方式,只刷新我们需要刷新的那部分界面。


    我们使用双缓存绘图方式就可以很好的解决这个问题。


    在OnDraw()函数中:
     //------------------双缓存绘图-----------------//
     CPoint ptCenter;
     CRect rect, ellipseRect;
     GetClientRect(&rect);
     ptCenter = rect.CenterPoint();
     CDC dcMem;//定义一个现实设备对象
     CBitmap bmp;//定义一个位图对象
     //随后建立与屏幕现实兼容的内存现实设备
     dcMem.CreateCompatibleDC(pDC);
     //这是还不能绘图,因为没有地方画
     //下面建立一个与屏幕现实兼容的位图,至于位图的大小可以使用窗口大小
     //即创建兼容位图
     bmp.CreateCompatibleBitmap(&dcMem, rect.Width(), rect.Height());
     //将位图选入内存DC
     dcMem.SelectObject(&bmp);
     //按照原有背景色填充客户区
     dcMem.FillSolidRect(rect, pDC->GetBkColor());
     //绘图操作
     for( int i = 60; i > 0; --i)
     {
      ellipseRect.SetRect(ptCenter, ptCenter);
      ellipseRect.InflateRect(i*5,i*5);
      dcMem.Ellipse(ellipseRect);	//在内存上绘图
     
     }
     
     //将内存DC上的东西复制到pDC
     pDC->BitBlt(0,0, rect.Width(), rect.Height(), &dcMem, 0, 0, SRCCOPY);
     dcMem.DeleteDC();//删除DC
     bmp.DeleteObject();//删除位图

    注意:在OnDraw()函数中,应该先进行双绘图的设置,然后才运行你需要更新的内容。


    然后在需要刷新的位置加入:

     POSITION pos = pDoc->GetFirstViewPosition();
       CPointCloudMeasureView *pView = NULL;
       if(pos)
        pView = (CPointCloudMeasureView *)pDoc->GetNextView(pos);
       else
        ASSERT(false);
       //pView->Invalidate();
       HWND hWnd = AfxGetMainWnd()->m_hWnd;
       pView->InvalidateRect((LPCRECT)hWnd);


  • 相关阅读:
    酒店预定系统
    毕业论文管理系统 ——总体设计
    毕业论文管理系统
    毕业管理系统——面向对象方法 项目前期
    项目前期
    5/23用户故事和backlog
    5/18
    4.8
    4.3
    第四章 需求分析
  • 原文地址:https://www.cnblogs.com/skyhuangdan/p/5486784.html
Copyright © 2011-2022 走看看