主窗口很多控件上都写了重绘代码,每次一刷新什么的主窗口就很闪,特别是用IE的工具里的清除历史记录。我把那些控件的双缓冲也都开了,WM_Erasebkgnd消息被我
返回1。
  我用Sp++去截消息,WM_SETTINGCHANGE, WM_GetMinMaxINfo, wm_notify 每次闪的时候,这三消息出现的频率最高,我把前边俩个都截了,效果稍微好点点
  分只有这么多了,没100分发不了专家帖。

解决方案 »

  1.   

    WM_ERASEBKGND都设为返回0:WM_ERASEBKGND Notification--------------------------------------------------------------------------------The WM_ERASEBKGND message is sent when the window background must be erased (for example, when a window is resized). The message is sent to prepare an invalidated portion of a window for painting. Syntax
    WM_ERASEBKGND    WPARAM wParam
        LPARAM lParam;
        
    ParameterswParam
    Handle to the device context. 
    lParam
    This parameter is not used. 
    Return ValueAn application should return nonzero if it erases the background; otherwise, it should return zero. 
      

  2.   

    我用API LockWindowUpdate去锁住主窗口,返回值是大于0的,然后调用刷新,还是会闪 
      

  3.   

    你想做什么效果?为啥要截取主窗体的WM_Erasebkgnd消息?
      

  4.   


     是自己做的主動UPDATE窗口還是??
      

  5.   

    是不是刷新直接調用的  refresh??
      

  6.   


    代码很多, 有的地方是有REFRESH
      

  7.   


    跟主窗口有啥关系,你自己写的控件没必要擦除背景的话就 return 0
      

  8.   


     這樣就比較麻煩。 最好采用局部刷。 不要直接調用 reFresh.  這樣做的話肯定就刷新所有控件了。
      

  9.   

    主窗口很多控件上都写了重绘代码就不能换个思路,不让他都重绘吗?就好比一座大楼,每块玻璃都重绘,我觉得不闪不可能,cpu总不会同一个时间脉冲干完所有的事情!打个比方,不合适请指正!
      

  10.   


    菠菜好久不见,  其实我也这么觉得, 因为那窗口控件太多, 是个以前搞VB的老程序员写的, 那个窗口被他拖了200多控件上去.... 他没类的概念, 指针也不释放, 另外代码风格很怪异, 看得我很头大, 我三星期的任务就改这BUG, 拜托大家多帮忙
      

  11.   

    這個真的要看你的情況,刷新需要什麼效果。 最好是把這些控件都管理起來然後對指定的刷新,200個帶HANDLE的刷起來夠嗆啊。
      

  12.   

    我通常不调用Refresh().而是调用 Invalidate().你也应该这样做.
      

  13.   

    Refresh()  立即刷新显示,如果调用很多次,每次调用都会重绘一遍。
    Invalidate()  有空时刷新显示,如果调用很多次,如果前面的还没重绘,最后也只绘一次。
      

  14.   

    wm_notify 很多可能是重复事件造成的,比如说 A.OnChange 有 B.Caption := 'xxx',
    造成 B 的OnChange,而 B.OnChange 中又改写了 A 或 C 的OnChange
    从而可能造成一个控件的多次重绘!仔细检查一下事件处理代码,可能有帮助
      

  15.   

    呵呵,三國,看下你局部刷新代碼,我覺得應該是哪裏的問題。
    wm_notify 要留意CHANGE事件主要做了什麼
      

  16.   

    我要告诉你的是如果是DELPHI的,根本就不需要双缓冲,因为如果你看TFORM的源代码,你可以看到,实际上它根本就做过创建兼容场景,兼容位图的工作,你再搞个双缓冲简直就是没效率,多做了一次无用功,你要做的仅仅是在绘制前锁定,绘制完UNLOCK。把不必要的清除给改改,该成,扫描线清除的方式,这样效率就高多了。  Refresh().是重新绘制整个的,不建议使用,应该使用校验方式。
      

  17.   

    我以前也实验过拦截清除背景的消息,事实上是很没效率的,我的资源里面有个进程管理器里面用到了个TBUTFORM,你可以看看我是怎么画的,刚开始我也象你一样拦截什么WM_ERASEBKGND ,双缓冲等等 不过后来经过实验,发现那些根本就垃圾的要死,就好象QQ的窗体大多用的绘制方式,极其消耗资源,是非常落后的绘制手法。
      

  18.   

    发现最主要的原因 是覆盖了CreateParams函数,然后加了个WS_EX_TRANSPARENT
    结帖