我在MFC对话框里,先添加了一个图片。使用OnEraseBkgnd函数来设置了背景图片(纯蓝色),然后在OnCtlColor中设置静态控件的背景颜色(这样静态控件的颜色与背景颜色一样了,看起来就好像是文字在背景图上),可是因为静态控件的文字一变化,就会重叠,本来我是用Invalidate()来解决这个问题的,但是会闪烁。如何才能消除闪烁呢?网上说可以用双缓冲
的方法,http://www.vckbase.com/document/viewdoc/?id=1612 。。例如这个
    可是虽然原理我明白,但是还是不太懂,我对图形的问题一直很差,双缓冲在哪里搞的啊,是在Onpaint()里面还是在哪里的啊,能否有高手能够把此种方法说得清楚些呢,或者告诉我其它的方法来消除闪烁。
    最好给个例子,只要有背景图片,然后再来个静态文本,当文本的文字变化时(会变化十几次以上的),如何不闪烁且又文字不重叠的呢?菜鸟求教~下面有一个例子,可是我看不明白。能否来点简单的例子呢……void CCustomInputDialog::OnPaint()
{
    CPaintDC dc(this);    CDC memDC;    memDC.CreateCompatibleDC(&dc);    memDC.SelectObject(&m_bgbmp);    CDC maskDC;    maskDC.CreateCompatibleDC(&dc);    CBitmap maskbmp;    maskbmp.CreateCompatibleBitmap(&dc,480,276);//    maskDC.SelectObject(&maskbmp);    maskDC.BitBlt(0,0,480,276,&memDC,0,0,SRCCOPY);
    
    if(!v_keyinfo.empty())
    {
        for(int i = 0;i<v_keyinfo.size();i++)
        {
            if(m_bDownShift == false)
            {
                if(i >= 36 && i< 62)
                    continue;
                if(v_keyinfo[i].pImage[0]!=NULL)
                if(v_keyinfo[i].keydown == false)
                    v_keyinfo[i].pImage[0]->Draw(maskDC,&v_keyinfo[i].rc,NULL);
                else
                {
                    v_keyinfo[i].pImage[1]->Draw(maskDC,&v_keyinfo[i].rc,NULL);
                    v_keyinfo[i].pImage[2]->Draw(maskDC,&v_keyinfo[i].effectRC,NULL);
                }
            }else
            {
            if(i >= 10 && i<=35)
                continue;
            if(v_keyinfo[i].pImage[0]!=NULL)
                if(v_keyinfo[i].keydown == false)
                    v_keyinfo[i].pImage[0]->Draw(maskDC,&v_keyinfo[i].rc,NULL);
                else
                {
                    v_keyinfo[i].pImage[1]->Draw(maskDC,&v_keyinfo[i].rc,NULL);
                    v_keyinfo[i].pImage[2]->Draw(maskDC,&v_keyinfo[i].effectRC,NULL);
                }
            }
        }
    }
    dc.BitBlt(0,0,480,276,&maskDC,0,0,SRCCOPY);    memDC.DeleteDC();
    maskDC.DeleteDC();
    maskbmp.DeleteObject();
}

解决方案 »

  1.   

    一开始像楼主这种情况很正常的.主要是理解1个屏幕CDC和内存CDC...所有的操作都在内存CDC中,在最后调用屏幕CDC把内存CDC读出就OK了理解过程就能看得懂代码了...当然先需要完成基本绘图
      

  2.   

    其实我对绘图不怎么理解,以前不怎么接触过。我觉得静态控件中的文字变了,用invalidate来刷新我能明白。但是怎么用双缓冲来刷新?我只想在静态文本的字体改变的时候,实现无闪烁的刷新。那应该怎么办,在Onpaint里面写代码就可以了?还要不要调用其它的函数呢?
      

  3.   

    我现在是急着要解决这个问题呢,而且对绘图又不怎么熟悉。,我的MFC窗口上共有五个静态控件文本,每次有文字改变后我都是用invalidate来刷新的……我现在想要的是当静态文本字体改变的时候,能实现无闪烁的刷新,这应该怎么办,高手说个详细的能用的方法吧,急……
      

  4.   

    其实我想过取得五个静态控件的区域,然后局部刷新它们的,这样整个MFC窗口应该不会闪烁了,我只是这么上司而已,能实现吗?怎么实现法呢
      

  5.   

     Invalidate() 强制更新的整个窗口吧,能不闪吗 ?!
      

  6.   

    InvalidateRect 来刷新那五个控件行不行的呢,行的话如何写?请指导一下
      

  7.   

    可以,用InvalidateRect只刷新指定的无效区域
      

  8.   

    来点实质点的东西吧各位大侠,作为一个菜鸟我只会Invalidate() ,而且我对绘图的部分一点也不熟悉。那么多的回复愣是没点有用的……我复制的那个例子我也确实看不明白……又没注释,中间部分又不知道是啥,我想要的是当静态文本的文改变时,能够不闪烁地刷新,可是那个例子好像是说在Onpiant里画图的……这例子我模仿不来啊……虚心求教
      

  9.   


    求代码啊大侠,以IDC_STATIC来举个例子吧,如何只刷新这个静态文本
      

  10.   

    我已经懂得用InvalidateRect 来刷新单个控件了,虽然整个MFC窗口不再闪烁,不过闪烁的是在静态文本这里了,我很想知道双缓冲方法如何解决这个问题的呢,求代码啊大侠,以IDC_STATIC来举个例子吧,改变文字后如何不闪烁地刷新这个静态文本(有背景图片就是难搞),只要说明哪里添加什么代码就可以了,应该可以的吧?
      

  11.   

    楼主试试Invalidate()后再UpdateWindow(),这样可以加快重新绘制窗口的速度
      

  12.   

    Invalidate() 强制更新的整个窗口吧,能不闪吗 ?!
      

  13.   

    以前用过双缓冲 不太记得了
    主要是在视图类的OnCreate()函数中设置像素格式static PIXELFORMATDESCRIPTOR pfd ={},
    然后在 后缓冲区画图,之后在OnDraw()中使用SwapBuffers() 交换到前缓冲区, 可以解决闪烁问题
      

  14.   

    Invalidate传个参数FALSE,就不闪了