Visual Studio .NET 2002Visual C++ 7.1Visual C++ 7.0Windows 2003Windows 2000Windows XPMFC中级开发Visual StudioWindowsC++
扩展列表控件以支持进度控件






4.48/5 (20投票s)
2004年4月22日

137781

10375
在列表控件的任何列中显示进度条。
引言
我不知道自己有多少次想要能够在列表控件中显示进度条。列表控件是一个多功能的控件,当任何人想要以表格形式显示数据时,它真的非常有用。但它并没有内置的进度条。
所以我尝试使用所有者绘制和自定义绘制控件。但它们无法与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
之上,从而产生一种位于普通文本位置的错觉。