我做了个界面类CMyFrame, 从CWnd继承。
在CMyFrame上我画了几张小图片,在Vista系统下显示时,界面会有闪烁。 但在XP系统下就不闪烁。
我采用了双缓冲绘画界面, 即先在内存中把界面画好, 然后再显示都界面上。请赐教, 谢谢。

解决方案 »

  1.   

    吃掉消息 afx_msg BOOL OnEraseBkgnd(CDC* pDC); 了吗?
      

  2.   

    在OnEraseBkgnd(CDC* pDC)里添加一行代码,return true;直接返回。
    如果在擦除背景时不直接返回,则窗口在重绘之前先前客户区擦除,然后再将最新的重绘图绘制上去,这样中间会的一个显示白色区域的过程,所以会看到闪一下。
      

  3.   

    实现了afx_msg BOOL OnEraseBkgnd(CDC* pDC)并立即返回TURE。 不好使, 郁闷。 
      

  4.   

    hoho,看来各个系统都有差别,我的是WIN2000下不闪,到XP下闪。
      

  5.   

    在OnEraseBkgnd(CDC *pDC)中再添加一段代码:
                for (CWnd *pChild = GetWindow(GW_CHILD) ;pChild != NULL;  pChild = pChild->GetWindow(GW_HWNDNEXT)) {
    if (pChild->IsWindowVisible()) {
    CRect rect;
    pChild->GetWindowRect(&rect);
    ScreenToClient(&rect);
    if(rect.Width() > 20 || rect.Height() > 20)
    pDC->ExcludeClipRect(&rect);
    }
    }
    用以控制自己绘制,不需要系统擦除
      

  6.   

    以上的方法都不可以, 最后发现是Vista下的DWM.exe在作怪, DWM和Vista的玻璃效果有关系, 关闭玻璃效果程序界面不闪烁, 打开之后又闪烁。 郁闷问题还是没有解决。