背景:
目前在做一个任务管理器,在设计进程界面的时候,遇到了更新ListCtrl时候,不能保存当前状态,即如果我选中了第3行,在更新完listCtrl后,ListCtrl没有焦点。
然后,我在一个线程中定时遍历得到新的进程信息后,与原来的相比较,若只有其中部分进程的占用率变化后,涉及到更新ListCtrl,这时候我就发消息去更新变化的。若是进程数量不一样后,则更新整个ListCtrl,即重绘。
问题:
希望能有个设计方法,达到和系统自带的任务管理器中进程页的表现。请有经验的朋友给个思路~
目前在做一个任务管理器,在设计进程界面的时候,遇到了更新ListCtrl时候,不能保存当前状态,即如果我选中了第3行,在更新完listCtrl后,ListCtrl没有焦点。
然后,我在一个线程中定时遍历得到新的进程信息后,与原来的相比较,若只有其中部分进程的占用率变化后,涉及到更新ListCtrl,这时候我就发消息去更新变化的。若是进程数量不一样后,则更新整个ListCtrl,即重绘。
问题:
希望能有个设计方法,达到和系统自带的任务管理器中进程页的表现。请有经验的朋友给个思路~
每个进程都用OpenProcess打开,每次更新时用GetExitCodeProcess函数确定进程是否在运行,如果进程已经结束,则关闭句柄并删除Item。
可以把进程有关信息定义为一个结构,用SetItemData保存到Item里面。
设置两个Listctrl,更新完成后切换显示。
选中只要记录下item信息,更新后再设置选中。
假定m_List列表视图对象
m_List.SetRedraw(FALSE);//控件不进行绘制
//更新内容,插入列目,删除项目等
m_List.SetRedraw(TRUE);//允许控件绘制
m_List.Invalidate();//将整个控件区域设置成无效,将触发OnPaint方法
m_List.UpdateWindow();//触发OnPaint方法在后台建立一个进程表格,包含进程的ID,名称等信息,第一次单击列表的列头时,升序排序,第二次单击同一个列头时,降序排序。排序时调用CListCtrl的SortItems方法。
建立一个定时器,每隔一秒监视进程的退出与启动。然后将新进程列表与原列表比较,看变化的项目是在列表框中的显示区域,如果有,得到可视区域中第一个增加或减少的项目。然后列表框只更新这个项目之后的项目。如果没有更新项目出现在列表视图,就不更新列表。在更新项目前,记下得到焦点进程ID,更新之后,重新将这个项目聚焦。如果聚点进程不存在了,就不要设置项目焦点。