我使用定时器,2、3秒钟刷新一次数据,在非模态对话框中使用ListCtrl,显示数据,数据列有8项,发现当行数比较多,有滚动轴出现时,屏幕刷新现象明显,从列头到内容,都黑一屏,再出现,一跳一跳的,象动画。其实,我每次都先removeall()的数据,再从头显示各行数据,列头没有重写吧?而且,当机器性能下降时,即使数据行数很少,也是这种现象,如何才能避免这种一跳一跳的现象?

解决方案 »

  1.   

    更新前SetRedraw(false);更新后SetRedraw();
      

  2.   

    更新前用 LockWindowUpdate 锁定窗口重绘
    更新后用 UnlockWindowUpdate 释放之
      

  3.   

    用虚列表(LVS_OWNDERDATA),更新的时候SetItemCount之后再用Update或者RedrawWindow来更新项目
      

  4.   

    我是在主窗体中调用非模态对话框的(并封装成DLL),请问,在主窗体中,如何让对话框SetRedraw或LockWindowUpdate?
      

  5.   

    得到对话框的指针,再得到LISTCTRL的指针,就可以调用SetRedraw或LockWindowUpdate力
      

  6.   

    可SetRedraw与LockWindowUpdate没什么参数呀。直接LockWindowUpdate();或SetRedraw(false);得到指针有什么用?
      

  7.   

    可以通过对列表框发送WM_SETREDRAW消息可以自动地关闭并恢复重画功能:
    m_wndListBox.SendMessage(WM_SETREDRAW,FALSE,0);
    ....
    m_wndListBox.SendMessage(WM_SETREDRAW,TRUE,0);
    列表框会在WM_SETREDRAW消息时重画功能恢复时重画,因此没有必要跟随对Invalidate的调用。
    还可以通过用LBS_NOREDRAW来创建步进行自动重画的列表框,这种列表框只在客户区无效时才被重画。
      

  8.   

    谢谢!我发现列表框本身就带clist.setredraw();但我不明白,Invalidate是什么意思?何时调用?
      

  9.   

    m_list.SetRedraw(FALSE);
          //更新内容
          m_list.SetRedraw(TRUE);
          m_list.Invalidate();
          m_list.UpdateWindow();
     
    或者参考http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_mfc_cwnd.3a3a.setredraw.asp