我在Formview上做一个监控图,鼠标移动时需要多次重绘,由于反差较大,引起了强烈的闪烁,我用BitBlt直接从内存贴图取代重绘解决了闪烁问题.但若用之前重绘的方法则解决不了,如下:    一开始我用双缓冲使InvalidateRect()时从内存中贴图,这样的确闪烁减轻了很多,但仍有闪烁,可以感觉出来是重绘时FormView刷了一遍默认的背景,于是我希望通过OnEraseBKgnd()直接用Return返回,可是ClassWizard中却找不到WM_ERASEBKGND消息,我查了资料说是可以自己添加上,我添加了这个函数的消息映射,但跟踪却发现执行不到这个函数,显然不起作用,我发现重绘时系统会进入OnCtlColor()函数,我让其返回一个透明的画刷也不能解决.
    
    我的第一个疑问就是为什么FormView中没有OnEraseBKgnd()这个虚函数?而其它的View类,凡是CWnd类下的都有,而CFormView却例外呢?如何让系统重绘时不进行默认背景的重绘以解决闪烁的问题呢?   

解决方案 »

  1.   

    在ClassWirard中add的时候把"Filter for messages available to"置为Window
      

  2.   

    嗯,选上让FormView窗口的属性,这样应该就有了OnEraseBKgnd()消息
      

  3.   

    谢谢楼上两位,OnEraseBKgnd()的问题已经解决,
        闪烁的问题仍然没有解决,FormView上有很多编辑框控件,我在OnPaint()函数里创建了一个DC,这个DC在内存中绘制了FormView正中间的监控图,这样从内存贴图时也就只有监控图那部分了,当鼠标移动时中间的监控图部分是不闪了,可是编辑框的闪烁却又不止了,我想应该用这个DC在内存中也把那些编辑框等绘制进去,请问如何实现呢?谢谢了.
      

  4.   

    局部重绘呢?JJHOU在<<Dissecting MFC>>中有一章专门讲过相关内容。