使用位图,来实现双缓冲绘图,但是为什么鼠标会闪烁。也就是将内存的图贴到屏幕上去的那一瞬间,每次鼠标都会闪烁。

解决方案 »

  1.   

    贴代码。。OnEraseBkgnd ()函数return TRUE;
      

  2.   

    我只是简单的将屏幕抓取,然后什么工作都不做,然后就贴上,每次贴上的瞬间鼠标闪烁
            CDC *pDC = GetDC();
    CDC memDCT;        CRect crect;
    GetClientRect(&crect);        CBitmap memBitmap;
    CBitmap *pOldBitmap = NULL;
    memDCT.CreateCompatibleDC(pDC);
    memBitmap.CreateCompatibleBitmap(pDC, crect.Width(),
    crect.Height());
    pOldBitmap = memDCT.SelectObject(&memBitmap); memDCT.BitBlt(0, 0, crect.Width(), crect.Height(), pDC, 0, 0, SRCCOPY);
    //我抓屏之后立马就贴上了。就算是这两个动作之间我做其他的画图,鼠标还是会闪烁。

    pDC->BitBlt(0, 0, crect.Width(), crect.Height(), &memDCT, 0, 0, SRCCOPY);
    memBitmap.DeleteObject();
    memDCT.DeleteDC();这是一个画图函数。fun()。我将这个函数放在onTimer()中。如果把onTimer()中调用fun的地方注释掉,鼠标就不会出现闪烁,说明闪烁实在fun()中,产生的
      

  3.   

    SetTimer()中时间设置的越短,闪烁的越厉害。
      

  4.   

    memDCT.BitBlt(0, 0, crect.Width(), crect.Height(), pDC, 0, 0, SRCCOPY);
        //我抓屏之后立马就贴上了。就算是这两个动作之间我做其他的画图,鼠标还是会闪烁。
        
        pDC->BitBlt(0, 0, crect.Width(), crect.Height(), &memDCT, 0, 0, SRCCOPY);
    你这什么意思?BitBlt两次, memory DC copy src DC, src DC copy memory DC,还有这段代码你写在哪里?OnPaint中吗?
      

  5.   

    把你的绘图操作放在OnPaint或OnDraw函数中
      

  6.   


    第一次BitBlt()的目的是将当前屏幕图片放到位图中去然后对这个位图增加几条线。也就是说在抓取的图片的基础上更改抓取的图片。然后第二次BitBlt就是把这个位图贴到屏幕上去。
      

  7.   

    memDCT.BitBlt(0, 0, crect.Width(), crect.Height(), pDC, 0, 0, SRCCOPY);
        //我抓屏之后立马就贴上了。就算是这两个动作之间我做其他的画图,鼠标还是会闪烁。
        
        pDC->BitBlt(0, 0, crect.Width(), crect.Height(), &memDCT, 0, 0, SRCCOPY);
    你贴来贴去,干什么?
      

  8.   


    放到 onDraw()当中?我需要定时向当前屏幕的图增加几条曲线。也就是每间隔一定时间就要在上一次图的基础上增加几条线所以,我就使用两次BitBlt
      

  9.   


    看来我还是没表述清楚。
    第一:我需要把当前屏幕的图放到位图,于是就第一次BitBlt,其中,memDCT用于内存绘图。向这个位图添加几条线。添加的代码我省略了。然后第二次BitBlt就是把处理过的位图贴到屏幕上去。
      

  10.   

    如果不适用2次BitBlt的话,每次绘图的时候,都要把以前的点加上去,如果点比较多的话,会影响绘图速度。所以选择了2次BitBlt,第一次把屏幕图片保存到位内存位图中,然后对其操作,操作完了之后,贴上去。这样,每次绘图我只需要添加几个点,没有必要把以前的点也一个一个的重新画上去。
      

  11.   

    楼主用一次BitBlt就可以把内存绘制好的图形或图片复制到显示端上,鼠标闪烁有可能和这个有关系
      

  12.   

    楼主其实完全不用memDCT.BitBlt(0, 0, crect.Width(), crect.Height(), pDC, 0, 0, SRCCOPY);
    你应该将每次画的,自己保存才对!不要将已经显示的画会内存!你每次都是对内存画,然后贴出来,内存有一个bmp专门保存这个位图即可!
    双缓冲,第一次看到如楼主这么用的,呵呵!
      

  13.   

    timer 里面先bitblt 到memory DC 里然后在Paint事件里 bitblt到 窗体里就好了
      

  14.   

    我的分析就是把当前的屏幕显示的图像bitblt到memDC的时候,鼠标箭头也BitBlt过去了。所以鼠标箭头会闪烁。不知道有没有办法解决这个问题。然后,关于将当前图像的点保存到动态数组,有点问题,就是数组的上限不好确定。我的实时曲线就跟流水一样,是从右往左流的。一直在流。也就是说整个曲线都一直在滚动,所以,究竟要保存到少个点,这个不太好确定。
      

  15.   

    测试过了。就是因为将屏幕的画面 BitBlt到内存中的时候,鼠标会闪烁。刚刚看了网上的介绍,BitBlt默认截图是不会把鼠标图形截取的,那么为什么鼠标闪烁了?莫非是导致了鼠标重绘??还是??不知道各位有何解决办法。谢谢
      

  16.   

    利用view类的OnEraseBkgnd成员函数,绘制背景图像与位置相同,则不会出现闪烁现象