65.9K
CodeProject 正在变化。 阅读更多。
Home

扩展列表控件以支持进度控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.48/5 (20投票s)

2004年4月22日

viewsIcon

137781

downloadIcon

10375

在列表控件的任何列中显示进度条。

Sample Image - ProgressListControl.jpg

引言

我不知道自己有多少次想要能够在列表控件中显示进度条。列表控件是一个多功能的控件,当任何人想要以表格形式显示数据时,它真的非常有用。但它并没有内置的进度条。

所以我尝试使用所有者绘制和自定义绘制控件。但它们无法与Windows默认进度条的外观和感觉相匹配。

所以我决定将进度控件作为控件的子控件,并将进度位置设置为相应框的数字文本。

代码

诀窍是捕获 WM_PAINT 消息,然后在正确的位置创建一系列进度控件。

void CListCtrlEx::OnPaint()
{
 // TODO: Add your message handler code here
 // Do not call CListCtrl::OnPaint() for painting messages
 int Top=GetTopIndex();
 int Total=GetItemCount();
 int PerPage=GetCountPerPage();
 int LastItem=((Top+PerPage)>Total)?Total:Top+PerPage;
 // if the count in the list os nut zero
 // delete all the progress controls and them procede
 {
  int Count=(int)m_ProgressList.GetCount();
  for(int i=0;i<Count;i++)
  {
   CProgressCtrl* pControl=m_ProgressList.GetAt(0);
   pControl->DestroyWindow();
   m_ProgressList.RemoveAt(0);
  }
 }
 CHeaderCtrl* pHeader=GetHeaderCtrl();
 for(int i=Top;i<LastItem;i++)
 {
  CRect ColRt;
  pHeader->GetItemRect(m_ProgressColumn,&ColRt);
  // get the rect
  CRect rt;
  GetItemRect(i,&rt,LVIR_LABEL);
  rt.top+=1;
  rt.bottom-=1;
  rt.left+=ColRt.left;
  int Width=ColRt.Width();
  rt.right=rt.left+Width-4;
 // create the progress control and set their position
  CProgressCtrl* pControl=new CProgressCtrl();
  pControl->Create(NULL,rt,this,IDC_PROGRESS_LIST+i);
  CString Data=GetItemText(i,m_ProgressColumn);
  int Percent=atoi(Data);
  // set the position on the control
  pControl->SetPos(Percent);
  pControl->ShowWindow(SW_SHOWNORMAL);
  // add them to the list
  m_ProgressList.Add(pControl);
 }
 CListCtrl::OnPaint();
}

因此,列表控件在正确的位置绘制数据,而进度控件作为子窗口,停留在 ListCtrl 之上,从而产生一种位于普通文本位置的错觉。

© . All rights reserved.