背景:
目前在做一个任务管理器,在设计进程界面的时候,遇到了更新ListCtrl时候,不能保存当前状态,即如果我选中了第3行,在更新完listCtrl后,ListCtrl没有焦点。
然后,我在一个线程中定时遍历得到新的进程信息后,与原来的相比较,若只有其中部分进程的占用率变化后,涉及到更新ListCtrl,这时候我就发消息去更新变化的。若是进程数量不一样后,则更新整个ListCtrl,即重绘。
问题:
希望能有个设计方法,达到和系统自带的任务管理器中进程页的表现。请有经验的朋友给个思路~

解决方案 »

  1.   

    刷新前先获得当前选中项,刷新完毕选中指定项,并且给ListCtrl设置焦点。你是不是更新时先都删除了,然后再重新插入的啊?
      

  2.   

    以进程ID来区分进程,每次更新时,根据进程ID查找Item,找到后SetItemText更新各项信息,如果没找到则说明是新进程,要添家新Item。
    每个进程都用OpenProcess打开,每次更新时用GetExitCodeProcess函数确定进程是否在运行,如果进程已经结束,则关闭句柄并删除Item。
    可以把进程有关信息定义为一个结构,用SetItemData保存到Item里面。
      

  3.   

    建立一个数据结构用来存储每个进程的数据,然后用vector或者list之类数据结构存储,也可以用map,以进程ID作为关键字,这样就可以很简单判断、添加和删除了进程信息了在那个CListCtrl里面,每个Item关联到进程ID,SetItemData(),这样在进程描述数据结构之上,根据你的表现需求,绘制界面即可
      

  4.   

    List界面只是一个呈现而已,如果数据变化频繁或数据量大,争议采用虚表的形式,界面上的数据来源全来自于内存的一个链表,更新数据只是在内存中更新而已,刷新界面不用SetItemText的方式,这种方式只会很慢,而已界面会闪动厉害。采用虚表时增加一个LVN_GETDISPINFO消息响应函数,在这个函数中从内存链表中提取数据 。
      

  5.   

    SetItemData()设置,LVITEM保存Item信息。
    设置两个Listctrl,更新完成后切换显示。
    选中只要记录下item信息,更新后再设置选中。
      

  6.   

    我试过虚表,效果不好,不能排序,而且子项多了,用到switch你看MS的task manager 就不是用的虚表。闪烁这个问题我也基本搞定,问题是MS的任务管理器更新速度快的时候也很流畅,显然是经过处理的
      

  7.   

    大批量数量更新问题是这样的:
    假定m_List列表视图对象
    m_List.SetRedraw(FALSE);//控件不进行绘制
     //更新内容,插入列目,删除项目等
    m_List.SetRedraw(TRUE);//允许控件绘制
    m_List.Invalidate();//将整个控件区域设置成无效,将触发OnPaint方法
    m_List.UpdateWindow();//触发OnPaint方法在后台建立一个进程表格,包含进程的ID,名称等信息,第一次单击列表的列头时,升序排序,第二次单击同一个列头时,降序排序。排序时调用CListCtrl的SortItems方法。
    建立一个定时器,每隔一秒监视进程的退出与启动。然后将新进程列表与原列表比较,看变化的项目是在列表框中的显示区域,如果有,得到可视区域中第一个增加或减少的项目。然后列表框只更新这个项目之后的项目。如果没有更新项目出现在列表视图,就不更新列表。在更新项目前,记下得到焦点进程ID,更新之后,重新将这个项目聚焦。如果聚点进程不存在了,就不要设置项目焦点。