任务管理器开发(一)

 

 前言:

        这个项目是自己肤浅的看了些关于系统的文章后,决定实现一个任务管理器的加强版。现在后悔啊~发现这个任务量实在太大了,差不多两个星期了(星期1到5都晚上时间和周末都用上了),才把进程管理部分完成了一部分。

        

        期间遇到的问题列出一部分,因为很多我都不太记得了。

 

一、ListCtrl的刷新问题:

        当数据量比较大的时候,更新ListCtrl会出现闪烁,因为每次刷新都DeleteAllItems,然后再一个一个的AddItem、SetItemText。这样大部分的时间都被浪费而且造成了界面的闪烁。

        解决办法:

        1.给ListCtrl设置LVS_EX_DOUBLEBUFFER风格,顾名思义,双缓冲~

        2.在更新ListCtrl的时候使用下面的代码段,可以很大程度上改善闪烁的情况,但也不是完美的。

  1. // 防止闪烁措施
  2. m_wndListApp.SetRedraw(FALSE);
  3. // 更新数据
  4. InsertAppItem();
  5. // 恢复并更新
  6. m_wndListApp.SetRedraw(TRUE);
  7. m_wndListApp.Invalidate();
  8. m_wndListApp.UpdateWindow();

        3.运用虚表,这个具体参见http://www.codeproject.com/KB/list/virtuallist.aspx,或者直接Google吧~噢,在更新虚表的时候建议用SetItemCountEx这个方法吧,因为有个参数是防止更新后滚动条移动到开头LVSICF_NOSCROLL.

        4.派生了个ListCtrl,功能为:禁止点击第一列、点击非第一列的item的时候会弹出Edit控件,即可编辑item。

           派生了个SortCtrl,其实是在CodeProject上找的,不过自己修改了下~

           在显示process信息时,使用了虚表技术,具体察看代码~

        没有解决的问题:

            在正常ListCtrl里,更新数据项后,滚动条不移动这个功能老是实现不了。在网上找了些代码,都不成功,在此我列出一种方法吧,但是没成功~

  1. // 防止闪烁 
  2.     //m_wndListProcess.SetRedraw(FALSE); 
  3.     
  4.     //int nTopIndex =m_wndListProcess.GetTopIndex(); //得到最顶端记录索引 
  5.     //int nPerPageItem=m_wndListProcess.GetCountPerPage(); 
  6.     //m_wndListProcess.EnsureVisible(m_wndListProcess.GetItemCount()-1,FALSE); 
  7.     //m_wndListProcess.EnsureVisible(nTopIndex+nPerPageItem,FALSE); 
  8.     //m_wndListProcess.SetItemCount(m_vecProcessInfo.size()); 
  9.     // 
  10.     // 添加信息 
  11.     //InsertItem(); 
  12.     //m_wndListProcess.SetItemState(m_nCurItem,LVIS_SELECTED, LVIS_SELECTED); 
  13.     //m_wndListProcess.SetRedraw(TRUE); 
  14.     //m_wndListProcess.Invalidate(); 
  15.     //m_wndListProcess.UpdateWindow(); 
  16.     //m_wndListProcess.RedrawItems(nTopIndex,nTopIndex+nPerPageItem);

 

怪!

 

后记   :

        今天就操作ListCtrl的问题总结出来,希望以后也能记住这些经验,改善不足的地方~

        估计明天总结枚举任务栏窗口的事情~

   

还有,明天开始把当天的学习和工作成果记录下来,在纸质的笔记本上记下!

 

 

 

你可能感兴趣的:(工作,Google,任务)