精华内容
下载资源
问答
  • MFC双缓存

    2021-03-01 09:44:28
    // TODO: 在此处为本机数据添加绘制代码 CDC MemDC;//显示设备对象 CBitmap MemBitmap;//位图对象 //获取客户区高度和宽度 CRect clientRect; GetClientRect(&clientRect);...nWidth = clientRect.right - ...
    // TODO: 在此处为本机数据添加绘制代码
    CDC MemDC;//显示设备对象
    CBitmap MemBitmap;//位图对象
    
    //获取客户区高度和宽度
    CRect clientRect;
    GetClientRect(&clientRect);
    nWidth = clientRect.right - clientRect.left;
    nHeight = clientRect.bottom - clientRect.top;
    
    //建立与屏幕显示兼容的内存显示设备
    MemDC.CreateCompatibleDC(NULL);
    //建立与屏幕显示兼容的位图
    MemBitmap.CreateCompatibleBitmap(pDC,nWidth,nHeight);
    
    //将位图选入内存设备
    CBitmap *pOldBit = MemDC.SelectObject(&MemBitmap);
    
    //用背景色将位图清楚干净
    //MemDC.FillSolidRect(0,0,nWidth,nHeight,RGB(0,0,255));
    
    //在内存中绘图
    


    CBrush NewBrush(RGB(100, 100, 100)), NewBrush1(RGB(34,139,34));

    MemDC.Rectangle(0,0,nWidth,nHeight);
    //打印游戏区域
    CBrush *pOldBrush;
    pOldBrush = MemDC.SelectObject(&NewBrush1);
    MemDC.Rectangle(rect);
    NewBrush1.DeleteObject();
    
    //打印蛇
    pOldBrush = MemDC.SelectObject(&NewBrush);
    for (Snake* p = pHead; p != NULL; p = p->next)
    {
    	MemDC.Rectangle(p->x, p->y, p->x + width, p->y + width);
    }
    //打印食物
    if (IsNew == 1)
    	MemDC.Rectangle(food.x, food.y, food.x + width, food.y + width);
    NewBrush.DeleteObject();
    
    
    //打印分数
    CString str;
    str.Format(_T("分数为%d"), score);
    MemDC.TextOutW(rect.right + 30, cWidth / 2,str);
    //更改状态
    IsChange = 1;
    
    
    //将内存中的图拷贝到屏幕上进行显示
    pDC->BitBlt(0, 0, nWidth, nHeight, &MemDC, 0, 0, SRCCOPY);
    // 绘图完成后的清理
    MemBitmap.DeleteObject();
    MemDC.DeleteDC();
    
    展开全文
  • MFC双缓存技术实现源码,实现细节及原理
  • mfc对话框双缓存的源程序代码。 实现功能: ①button1:双缓存绘图。 ②button2:普通绘图。 非常简单的内容。便于新手更快理解双缓存的操作。使用时,可结合说明的blog 地址:...
  • MFC双缓存画图

    2011-10-11 17:00:05
    MFC双缓存画图 在使用MFC画图时,使用Invalidate()函数重画客户区,尤其是使用频繁的时候,我们可以感觉到整个客户区在不停地闪烁, 导致我们的界面的效果特别差,那么怎样能防止这一现象发生呢?我们可以有以下...
     
     
    

    MFC双缓存画图

    在使用MFC画图时,使用Invalidate()函数重画客户区,尤其是使用频繁的时候,我们可以感觉到整个客户区在不停地闪烁, 导致我们的界面的效果特别差,那么怎样能防止这一现象发生呢?我们可以有以下几种方法:

    • 局部重画:就是说,客户区画图时,我们把刚刚的有过改动的区域确定,然后只改变这一小区域,而不是把整个客户区重画。不过这样 做还是不能彻底解决闪烁的现象。因为重画的局部还是会闪烁。
    • 异或画图:学计算机的人都知道,异或逻辑是相同为0,相异1。异或画图就是利用这一特性,在原来的图形的基础上重新再画一次,与前 一次的处处都相同,这种方法相当于擦除了原来的图形,然后再画自己想要的图形。我个人觉得这个技术在画类似橡皮筋等东西时很有用。
    • 双缓存画图:下面我们重点讲解这种技术。

    MFC画图的闪烁原因不在于在屏幕上把图像画出来,而在于怎么去画。也就是说,如果原来有这么一张已经画好的图,而要计算机把这张图片画出来, 这就不会有闪烁现象发生了。双缓存技术利用的就是这个原理。

    双缓存主要就是在内存中间重新开辟一个空间,在内存中先把要画的图该怎么画先画出来,而屏幕上的东西暂时不去动它,待图像在内存中 画好之后,把画好的图像直接拷贝到屏幕上去,这样就几乎不需要时间去计算,也就不会有闪烁的现象发生。具体框架代码如下:

    BOOL CDataStructureView::OnEraseBkgnd(CDC* pDC)

    {

    CRect rc;

    CDC dcMem;

    GetClientRect(&rc);

    CBitmap bmp; //内存中承载临时图象的位图


    dcMem.CreateCompatibleDC(pDC); //依附窗口DC创建兼容内存DC

    bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());

    //创建兼容位图(必须用pDC创建,否则画出的图形变成黑色)

    CBitmap *pOldBit=dcMem.SelectObject(&bmp);

    dcMem.FillSolidRect(rc,RGB(255,255,255));

    //按原来背景填充客户区,不然会是黑色


    //画图,添加你要画图的代码,不过用dcMem画,而不是pDC;

    ......

    pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY);

    //将内存DC上的图象拷贝到前台

    //绘图完成后的清理

    dcMem.DeleteDC(); //删除DC

    bmp.DeleteObject(); //删除位图

    return true;

    //这里一定要用return true,如果用自动生成的,会调用基类,把画出来的覆盖,就什么结果也没有了

    }

     

    转自:http://www.xl7788.com/zt/computerprogram/MFCDoubleBuffer.html

    展开全文
  • mfc双缓存画图

    2013-06-25 14:51:42
    MFC双缓存画图 在使用MFC画图时,使用Invalidate()函数重画客户区,尤其是使用频繁的时候,我们可以感觉到整个客户区在不停地闪烁, 导致我们的界面的效果特别差,那么怎样能防止这一现象发生呢?我们可以有以下...

    转自:http://www.xl7788.com/zt/computerprogram/MFCDoubleBuffer.html

    MFC双缓存画图

    在使用MFC画图时,使用Invalidate()函数重画客户区,尤其是使用频繁的时候,我们可以感觉到整个客户区在不停地闪烁, 导致我们的界面的效果特别差,那么怎样能防止这一现象发生呢?我们可以有以下几种方法:

    • 局部重画:就是说,客户区画图时,我们把刚刚的有过改动的区域确定,然后只改变这一小区域,而不是把整个客户区重画。不过这样 做还是不能彻底解决闪烁的现象。因为重画的局部还是会闪烁。
    • 异或画图:学计算机的人都知道,异或逻辑是相同为0,相异1。异或画图就是利用这一特性,在原来的图形的基础上重新再画一次,与前 一次的处处都相同,这种方法相当于擦除了原来的图形,然后再画自己想要的图形。我个人觉得这个技术在画类似橡皮筋等东西时很有用。
    • 双缓存画图:下面我们重点讲解这种技术。

    MFC画图的闪烁原因不在于在屏幕上把图像画出来,而在于怎么去画。也就是说,如果原来有这么一张已经画好的图,而要计算机把这张图片画出来, 这就不会有闪烁现象发生了。双缓存技术利用的就是这个原理。

    双缓存主要就是在内存中间重新开辟一个空间,在内存中先把要画的图该怎么画先画出来,而屏幕上的东西暂时不去动它,待图像在内存中 画好之后,把画好的图像直接拷贝到屏幕上去,这样就几乎不需要时间去计算,也就不会有闪烁的现象发生。具体框架代码如下:

    BOOL CDataStructureView::OnEraseBkgnd(CDC* pDC)

    {

    CRect rc;

    CDC dcMem;

    GetClientRect(&rc);

    CBitmap bmp; //内存中承载临时图象的位图


    dcMem.CreateCompatibleDC(pDC); //依附窗口DC创建兼容内存DC

    bmp.CreateCompatibleBitmap(pDC,rc.Width(),rc.Height());

    //创建兼容位图(必须用pDC创建,否则画出的图形变成黑色)

    CBitmap *pOldBit=dcMem.SelectObject(&bmp);

    dcMem.FillSolidRect(rc,RGB(255,255,255));

    //按原来背景填充客户区,不然会是黑色


    //画图,添加你要画图的代码,不过用dcMem画,而不是pDC;

    ......

    pDC->BitBlt(0,0,rc.Width(),rc.Height(),&dcMem,0,0,SRCCOPY);

    //将内存DC上的图象拷贝到前台

    //绘图完成后的清理

    dcMem.DeleteDC(); //删除DC

    bmp.DeleteObject(); //删除位图

    return true;

    //这里一定要用return true,如果用自动生成的,会调用基类,把画出来的覆盖,就什么结果也没有了

    }

    展开全文
  • MFC 双缓存绘图

    2014-07-17 10:04:28
    我们使用双缓存绘图方式就可以很好的解决这个问题。 在OnDraw()函数中: //------------------双缓存绘图-----------------// CPoint ptCenter; CRect rect, ellipseRect; GetClientRect(&rect); ...

    在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);


    展开全文
  • MFC双缓存学习记录

    2020-09-28 11:17:38
    在使用MFC画图时,使用Invalidate()函数重画客户区,尤其是使用频繁的时候,我们可以感觉到整个客户区在不停地闪烁, 导致我们的界面的效果特别差,那么怎样能防止这一现象发生呢?我们可以有以下几种方法: 局部...
  • MFC双缓存绘图实现

    千次阅读 2016-11-17 09:32:19
    在这样的情况下就要使用双缓存技术来缓解绘图区域闪烁的情况。所谓双缓存技术就是:使用内存缓冲区来解决由多重绘制操作造成的闪烁问题。当启用双缓冲时,所有绘制操作首先呈现到内存缓冲区,而不是屏幕上的绘
  • MFC双缓存无闪烁画图

    2011-08-26 14:44:21
    OnEraseBkgnd(CDC* pDC)方法里实现了无闪烁切换背景图。。。
  • 最近在做一个图片编辑的软件,我用的图资源为png图,使用了CImage类来显示图片,在使用双缓存的时候,显示的图片颜色不对,在网上找了很多资源都是说GDI不支持透明色,需要使用GDI+,不太清楚GDI+怎么实现双缓存
  • MFC 双缓存技术

    千次阅读 2009-12-08 16:54:00
    以下代码是在MFC单文档中的一个简单测试双缓存技术的代码 /*双缓存的第一步,建立兼容的设备上下文*/ CDC memdc;//创建一个设备上下文对象 memdc.CreateCompatibleDC(pDC);//这个设备兼容当前DC /*双缓存的第二...
  • 关于MFC双缓存

    2013-10-17 17:13:30
    我写了一个双缓存显示JPG图片的代码,但是显示出来的是一个黑色矩形,不知道问题出在哪里 以下是我的代码,放在空白单文档的onlbuttonup函数里 //加载JPG IPicture* pPic; OleLoadPicturePath(_T("F:\\map....
  • void CTopoAndLogoDlg::PaintTopoTable(CDC *pDC) { CDC MemDC; // 定义一个内存显示设备对象 CBitmap MemBitmap; // 定义一个位图对象 CRect wndRect;...这一个是完整的双缓存绘图的MFC代码
  • //CDialog::OnPaint(); CPaintDC dc(this); // 目标A桌子 RECT myRect; GetDlgItem(IDC_STATIC)->GetWindowRect(&myRect); ScreenToClient(&myRect);... //ScreenToClient(&myRect);...
  • MFC 双缓存的实现

    2011-06-27 12:34:00
    //第三步 对双缓存环境初始化 //(要先添加此响应消息) x=GetSystemMetrics(SM_CXSCREEN); y=GetSystemMetrics(SM_CYSCREEN); CDC* pDC=GetDC(); m_MemDC.CreateCompatibleDC(pDC...
  • mfc双缓存技术+滚动条的画图问题

    千次阅读 2013-06-25 15:57:17
    VC中的绘图有个比较棘手的问题是闪烁,双缓存是解决此类问题的一种方法,但是在系统绘图中,由于可能要加载滚动条,响应鼠标拖动等事件,导致传统的双缓存方法不一定适用,本文提出了一种解决方法能够用统一的框架内...
  • 内存中创建了位图 在位图上画波形 双缓存映射到picture control控件上 现在我想通过 OnLButtonDown OnMouseMove OnLButttonUp 选择波形 进行放大 我现在刚可以在波形上画一个 CRect 但是这个CRect 一直闪 只有鼠标动...
  • 正常来说双缓存绘图速度快,可以创建内存DC,先在内存DC上绘制好图形 然后绘制的时候直接使用Bitblt一次性将绘制好的DC复制到窗口DC上。 但是系统控件无法执行绘制到内存DC上去,只能将系统控件的区域,从在内存...
  • MFC双缓存技术代码

    2016-06-21 22:56:00
    屏蔽背景刷新,在View中添加对WM_ERASEBKGND的响应,直接返回TRUE: BOOL CTEMV1View::OnEraseBkgnd(CDC* pDC) { // TODO: 在此添加消息处理程序代码和/或调用默认值 return TRUE;... //return CView::...
  • { CRect rc; CDC dcMem; GetClientRect(&...但是我在一个控件矩形内画了两次,第一次画了一幅画,五彩斑斓,画完第一次后,第二次我想在上面画线,也用双缓存,而且不能覆盖原来的画。这要怎么办啊?
  • [img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/onion/81.gif][/img][img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/003/onion/82.gif][/img]谁能解释下双缓存的代码编写步骤...
  • 代码如下: void CSupervisionView::OnDraw(CDC* pDC) { CSupervisionDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; CPoint ptCenter;... 第二次及之后的rect:0,611,0,1187
  • MFC单文档程序,使用双缓存技术绘图,需要把逻辑单位转成毫米,采用MM_HIMETRIC模式,问生成的位图怎么铺满整个绘图区? 代码如下: CDC dcMem; CBitmap bm; CPen pen(PS_SOLID, 0, RGB(255, 0, 10)); pDC-...
  • MFC双缓存技术

    2021-02-17 15:35:26
    MFC 在进行绘图的时候,有些情况可能会发生图像闪烁的现象。这时就需要使用二级缓存技术对图形进行处理。 二级缓存技术主要是用于处理以下几种情况: 1)非客户区和客户区不能同步更新画面造成的闪烁,可以去掉...
  • [MFC]双缓存CDC的创建

    2021-02-24 08:07:53
    [MFC]双缓存CDC的创建 CDC memCDC; CBitmap memBmp; CBitmap *pOldBmp; void CreateMemDC(int width, int height) { if (nullptr != memCDC.GetSafeHdc()) { memCDC.SelectObject(&pOldBmp); memBmp....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,700
精华内容 1,080
关键字:

mfc双缓存