我在定时器里刷新我的CListCtrl,但是随着程序运行时间的累加,CListCtrl刷新的闪动越来越厉害,请问是什么原因?有什么办法可以解决CListCtrl的刷新闪动问题。谢谢

解决方案 »

  1.   

    问题补充:
            1.我并没有大量是数据更新,只有5行5列数据,而且我没有用DeleteAllItems(),而用的是SetItemText()
            2.只是在更新数据时判断了一下,数据是否需要更新,这其中进行了链表的遍历,所以可能消耗了一定的时间
            3.我用的是从VCKBASE上下载的一个CListCtrl控件,不知道控件本身会不会对闪动造成影响
      

  2.   

    你可以在刷新之前
    调用 SetRedraw( FALSE ) 关闭界面刷新数据更新完之后再调用 SetRedraw ( TRUE );
    最后调用 Invalidate
      

  3.   

    是否刷新太频繁,还有随着时间,闪烁增加,是不是有资源泄漏,查看一下任务管理器的GDI对象等。
      

  4.   

    哦,我发现GDI对象没有长,但是USER对象在增长
      

  5.   

    这是刷新表格的代码,有点乱哦
    void CCMFD_Svr_MainFrameDlg::UpdateListCtrl()
    {
    CString     sLCId;
    CString     sLCConnState;
    CString     sLCLastRevTime;
    CString     sDataAmount;
    CString     sLCIP;

    try
    {
    m_ListCtrl.SetRedraw(FALSE);   POSITION pos = theApp.m_DataHandler.m_DataProcess.m_LCInfoList.GetHeadPosition();
    int i=0;
    while(pos != NULL)
    {
    STLCInfo *LCInfo = theApp.m_DataHandler.m_DataProcess.m_LCInfoList.GetNext(pos);
    bool bLCConnect = false; int nCount = m_arraySTSocketInfo->GetSize();
    for (int j=0; j<nCount; j++)
    {
    if(bLCConnect)
    break;
    STClientConnInfo *pSTSocketInfoinArray = (STClientConnInfo*)m_arraySTSocketInfo->GetAt(j);
    if(strcmp(pSTSocketInfoinArray->m_cClientIPaddr,LCInfo->sLCIP)==0)
    {
    sLCConnState = "通讯正常";
    sDataAmount.Format("%d",pSTSocketInfoinArray->m_nRecvDataAmount);
    sLCIP.Format("%s",pSTSocketInfoinArray->m_cClientIPaddr);
    COleDateTime LastTime(pSTSocketInfoinArray->m_tRecvLastTime); 
    sLCLastRevTime = LastTime.Format(_T("%H:%M:%S"));

    m_ListCtrl.SetItemTextColor(1,i,RGB(0,0,255));
    m_ListCtrl.SetItemText(i,1,sLCConnState);
    m_ListCtrl.SetItemText(i,3,sDataAmount);
    m_ListCtrl.SetItemText(i,4,sLCLastRevTime);
    bLCConnect = true;
    }
    }
    if(!bLCConnect)
    {
    sLCConnState = "通讯中断";
    m_ListCtrl.SetItemTextColor(1,i,RGB(0,0,255));
    m_ListCtrl.SetItemText(i,1,sLCConnState);
    }
    //m_ListCtrl.SetItemTextColor(0,i,RGB(0,255,255));
    i++;
    }

    m_ListCtrl.SetRedraw(TRUE); 
    m_ListCtrl.Invalidate();
    m_ListCtrl.UpdateWindow(); }
    catch(...)
    {
    m_pExceptionLog.WriteExceptionLog(-1,"CMFD_Svr_MainFrame","UpdateListCtrl()","","更新界面表格异常");
    }
    }
      

  6.   

       m_ListCtrl.SetRedraw(FALSE); 
    ...
    m_ListCtrl.SetRedraw(TRUE); 
            m_ListCtrl.Invalidate();
            m_ListCtrl.UpdateWindow();
    全去掉
      

  7.   

    另外对话框要有WS_CLIPCHILDREN风格
    或者属性设置中Clip Children = true
      

  8.   

    查查int nCount = m_arraySTSocketInfo->GetSize();
    是不是越来越大!
      

  9.   

    排除下载的CListCtrl控件问题,用MFC的试试。有什么原因必须用下载的CListCtrl控件吗?
      

  10.   

    CListCtrl 重载了DrawItem吗? 在这里面画应该不会闪烁。 另外设置对话框的属性 WS_CLIPCHILDREN
      

  11.   

    CListCtrl 重载了DrawItem吗? 在这里面画应该不会闪烁。 另外设置对话框的属性 WS_CLIPCHILDREN
      

  12.   

     人家的类重载了DrawItem,为什么要设置WS_CLIPCHILDREN属性呢