void CPlatform::OnPaint() //已经定义了消息映射!
{
/************************************************************************/
/* 正式代码开始!                                                        */
/************************************************************************/
//定义变量!
//CDC* pDC=this->GetDC();
CPaintDC MainPaint(this); //用CDC就会变得很快!因为不受定时器的作用了!// device context for painting
CBitmap m_Canvas;//画布!
CDC MemoryDC;//内存缓冲!
GetClientRect (&m_PlatformArea);
// 获得控件区域!

MainPaint.SelectObject(&m_PlatformArea);

//创建内存缓冲!
MemoryDC.CreateCompatibleDC(&MainPaint);
m_Canvas.CreateCompatibleBitmap(&MainPaint,m_PlatformArea.Width(),m_PlatformArea.Height());
MemoryDC.SelectObject(&m_Canvas);  //绘制边框和底色!
PaintBackground(&MemoryDC);

//绘制运动图!
DynamicPaint(&MemoryDC);

MainPaint.BitBlt(0, 0, m_PlatformArea.Width(), m_PlatformArea.Height(), &MemoryDC, 0, 0, SRCCOPY);
MemoryDC.DeleteDC();
m_Canvas.DeleteObject();
}已经用了双缓冲怎么还是闪烁呢?请问怎么解决啊?
谢谢!还有重载了,OnErabkgnd();return TURE!怎么就没有背景了啊?

解决方案 »

  1.   

    你换到WM_ERASEBKGND的响应函数里试试,有时候在OnPaint()里不行,换到OnEraseBkgnd()里就行了。
      

  2.   

    是在CPlatform类中添加OnEraseBkgnd()函数吗?
      

  3.   

    你把所有的东西 都在OnPaint 里 做 不闪 那是不可能的
    Onpaint 里  只放  1个 bitblt DC在外面就处理好  要不每次都要处理能不闪
      

  4.   

    最少  
       CDC MemoryDC;//内存缓冲!
        GetClientRect (&m_PlatformArea);
        // 获得控件区域!
        
        MainPaint.SelectObject(&m_PlatformArea);
        
        //创建内存缓冲!
        MemoryDC.CreateCompatibleDC(&MainPaint);
        m_Canvas.CreateCompatibleBitmap(&MainPaint,m_PlatformArea.Width(),m_PlatformArea.Height());
        MemoryDC.SelectObject(&m_Canvas); 
    这些要提出来吧
      

  5.   

    将那些变量移到Paint函数外,直接为CPlatform的变量,create等不必要的频繁操作,放在初始化的时候。如果都放在Paint中,频繁地计算和分配内存,即使最好的计算机也会闪的。
      

  6.   

    不是移到外面就可以的,这根本不是什么绘图效率问题,只是屏幕反差引起的!
    OnErabkgnd();return   TURE!怎么就没有背景了啊?
    /////////////////////////////////////////////////////
    当然没有背景了,看看MSDN吧!~~~~返回TRUE系统就不擦除背景了!~~~其实每次窗口过程收到WM_PAINT消息前一定会收到WM_ERASEBKGND消息,现假设默认画刷是白的,系统首先用它擦除背景然后才是你的OnPaint再在上面绘制!想一想如果你绘制的颜色和白色色差很大,不闪才怪呢!~~`1、重载OnErabkgnd();然后return   TURE; 不让系统擦除背景,然后在//绘制边框和底色!
        PaintBackground(&MemoryDC);代码上面加入MemoryDC.FillRect(...),这下就有背景了,颜色还可以自定.2、上面的方法效率比较低,如果还不能满足的话,那你只有确定你绘制的区域由OnPaint来处理,没有绘制的区域由OnErabkgnd()来处理并返回TRUE;这样比较烦一点,但效果很好!~
      

  7.   

    第二种办法没有看到你的PaintBackground和DynamicPaint代码还真的不好说!
    你可能还没有明白我说的是什么意思。那就是默认的话OnErabkgnd先擦除背景再由OnPaint来绘制,也就是说每个像素点其实被绘制了两次,这也是闪烁的根本原因!如果你能控制让每个像素点只绘制一次那也就不会闪了!
    如果你绘制的图行是规则那就很好办(FillRect),否则的话就用区域!(注意:就是区域要记算准确了,否则的话你也不知道你的屏幕上是什么东西了!)还有一点,并不是什么时候都一定要用内存绘图(双缓冲),用的不好也可能使效率下降的!~~~
    一般的话图果图形之间没有多大的色差变化的话完全可以不用双缓冲的!总之要视具体情况而定的!
      

  8.   

    楼上的!如果我把OnErabkgnd()重载为:return TURE,那么我绘制图的区域是不闪了,但是其他的背静全失去了!
    怎么办呢?谢谢!
      

  9.   

    你说的其他背景区域你能确定吗?能的话很好办!
    其它的背景可以在OnErabkgnd()中绘制!(但不要绘制全部客户区了,不然还是闪的)然后返回TRUE;还有我说的第一种办法,就是在你的位图选进内存设备描述表后这时候可以先填充背景!这样的话不是在屏幕上话,一般也不会闪的!
      

  10.   

    不是确定的!加MemoryDC.FillRect(...)了,但是没有什么作用!
      

  11.   

    把你的
    PaintBackground(&MemoryDC);
    DynamicPaint(&MemoryDC);
    代码贴上来看看,不然不好说的!~~~~
      

  12.   


     发表于:2008-01-03 19:09:40 楼主 
    C/C++ codevoid CPlatform::OnPaint() //已经定义了消息映射!
    {
        /************************************************************************/
        /* 正式代码开始!                                                        */
        /************************************************************************/    
        //定义变量!
        //CDC* pDC=this->GetDC();
        CPaintDC MainPaint(this); //用CDC就会变得很快!因为不受定时器的作用了!// device context for painting
        CBitmap m_Canvas;//画布!
        CDC MemoryDC;//内存缓冲!
        GetClientRect (&m_PlatformArea);
        // 获得控件区域!
        
        //MainPaint.SelectObject(&m_PlatformArea); 不知道你把矩形选进设备描述表做什么??
        
        //创建内存缓冲!
        MemoryDC.CreateCompatibleDC(&MainPaint);
        m_Canvas.CreateCompatibleBitmap(&MainPaint,m_PlatformArea.Width(),m_PlatformArea.Height());
        MemoryDC.SelectObject(&m_Canvas);  
       //加入的代码
        CBrush brush (RGB(255,255,255));
        MemoryDC.FillRect (&m_PlatformArea, &brush);  //这样没有背景??

      
        //绘制边框和底色!
        PaintBackground(&MemoryDC);
        
        //绘制运动图!
        DynamicPaint(&MemoryDC);
        
        MainPaint.BitBlt(0, 0, m_PlatformArea.Width(), m_PlatformArea.Height(), &MemoryDC, 0, 0,  SRCCOPY);
        MemoryDC.DeleteDC();
        m_Canvas.DeleteObject();
    }
      

  13.   

    看这里:
    http://blog.csdn.net/ringphone/archive/2007/12/03/1914052.aspx