请问各位大侠一个在CListView的排序的问题 我在使用 CListView 时不知道里面的项怎么排序,望高手指教,或提供一些资料。小生谢过了。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://www.vchelp.net/vchelp/zart/sortl.asp?type_id=9&class_id=1&cata_id=1&article_id=73 请参考下例,已涉及字符串、整数、日期的升降排序,你可根据需要增加修改。/////////////////////////////////////////////////////////////////////////////// callback for sortint CALLBACK CompareListItem(LPARAM lParam1, LPARAM lParam2, LPARAM param);// 响应 LVN_COLUMNCLICKvoid CMyListView::OnHeaderClick(NMHDR* pNMHDR, LRESULT* pResult) { *pResult = 0; NM_LISTVIEW* pnmlv = (NM_LISTVIEW*)pNMHDR; int nItems = GetListCtrl().GetItemCount(); if(nItems < 2) return; if(pnmlv->iSubItem != m_iSortColumn) { m_bAscend = TRUE; m_iSortColumn = pnmlv->iSubItem; for(int i=0; i < nItems; i++) { TCHAR *pOldBuf = (TCHAR *)m_ListFilePath.GetItemData(i); if(pOldBuf) delete pOldBuf; CString strText = m_ListFilePath.GetItemText(i, pnmlv->iSubItem); TCHAR *buf = new TCHAR[strText.GetLength()+1]; lstrcpy(buf, strText); GetListCtrl().SetItemData(i, (DWORD)buf); } } else { m_bAscend = !m_bAscend; } GetListCtrl().SortItems(CompareListItem, (DWORD)this);}int CALLBACK CompareListItem(LPARAM lParam1, LPARAM lParam2, LPARAM param){ CPlayListDlg *pDlg = (CPlayListDlg *)param; int iCol = pDlg->m_iSortColumn; int ret = 0; CString str1((TCHAR *)lParam1); CString str2((TCHAR *)lParam2); switch(iCol)// 每列使用不同的排序方法,根据需要修改。 { case 0: // string ret = str1.CompareNoCase(str2); break; case 1: // int ret = atoi(str1) - atoi(str2); break; case 2: // date { char c; int y1, m1, d1, hour1, min1, sec1; int y2, m2, d2, hour2, min2, sec2;// sscanf(str1,"%d%c%c%d%c%c%d%c%c%d%c%c%d%c%c%d", // &y1, &c,&c, &m1, &c,&c, &d1, &c,&c, &hour1, &c,&c, &min1, &c,&c, &sec1);// sscanf(str2,"%d%c%c%d%c%c%d%c%c%d%c%c%d%c%c%d", // &y2, &c,&c, &m2, &c,&c, &d2, &c,&c, &hour2, &c,&c, &min2, &c,&c, &sec2); sscanf(str1,"%d%c%d%c%d%c%d%c%d%c%d", &y1, &c, &m1, &c, &d1, &c, &hour1, &c, &min1, &c, &sec1); sscanf(str2,"%d%c%d%c%d%c%d%c%d%c%d", &y2, &c, &m2, &c, &d2, &c, &hour2, &c, &min2, &c, &sec2); CTime time1(y1, m1, d1, hour1, min1, sec1); CTime time2(y2, m2, d2, hour2, min2, sec2); CTimeSpan span = time1 - time2; ret = span.GetSeconds(); } break; } if(! pDlg->m_bAscend) ret = -ret; return ret;}void CPlayListDlg::OnDeleteitemList(NMHDR* pNMHDR, LRESULT* pResult) { NMLISTVIEW *pnmlv = (NMLISTVIEW *)pNMHDR; if(pnmlv->lParam) { delete (TCHAR *)pnmlv->lParam; pnmlv->lParam = 0; }} 上例已经很详细了,还可以参考programing windows with MFC里关于CListView排序的的部分说明,更容易看懂 mfc打印和打印预览 VS 操作PPT时出现COleDispatchException Win32 开发 怎样实现一个风格的滚动条 如何禁用一個按鈕 如何把BYTE数组的值传给CString? 转正自己提合适么? 为什么winXp不能安装VC++?急急!!!!!! ADSL问题 创建DEF文件? 图像能量的定义 求教一个位图问题 关于文件操作的问题
// callback for sort
int CALLBACK CompareListItem(LPARAM lParam1, LPARAM lParam2, LPARAM param);// 响应 LVN_COLUMNCLICK
void CMyListView::OnHeaderClick(NMHDR* pNMHDR, LRESULT* pResult)
{
*pResult = 0;
NM_LISTVIEW* pnmlv = (NM_LISTVIEW*)pNMHDR; int nItems = GetListCtrl().GetItemCount();
if(nItems < 2) return; if(pnmlv->iSubItem != m_iSortColumn)
{
m_bAscend = TRUE;
m_iSortColumn = pnmlv->iSubItem; for(int i=0; i < nItems; i++)
{
TCHAR *pOldBuf = (TCHAR *)m_ListFilePath.GetItemData(i);
if(pOldBuf)
delete pOldBuf; CString strText = m_ListFilePath.GetItemText(i, pnmlv->iSubItem); TCHAR *buf = new TCHAR[strText.GetLength()+1];
lstrcpy(buf, strText); GetListCtrl().SetItemData(i, (DWORD)buf);
}
}
else
{
m_bAscend = !m_bAscend;
} GetListCtrl().SortItems(CompareListItem, (DWORD)this);
}int CALLBACK CompareListItem(LPARAM lParam1, LPARAM lParam2, LPARAM param)
{
CPlayListDlg *pDlg = (CPlayListDlg *)param;
int iCol = pDlg->m_iSortColumn;
int ret = 0;
CString str1((TCHAR *)lParam1);
CString str2((TCHAR *)lParam2); switch(iCol)// 每列使用不同的排序方法,根据需要修改。
{
case 0: // string
ret = str1.CompareNoCase(str2);
break;
case 1: // int
ret = atoi(str1) - atoi(str2);
break;
case 2: // date
{
char c;
int y1, m1, d1, hour1, min1, sec1;
int y2, m2, d2, hour2, min2, sec2;// sscanf(str1,"%d%c%c%d%c%c%d%c%c%d%c%c%d%c%c%d",
// &y1, &c,&c, &m1, &c,&c, &d1, &c,&c, &hour1, &c,&c, &min1, &c,&c, &sec1);
// sscanf(str2,"%d%c%c%d%c%c%d%c%c%d%c%c%d%c%c%d",
// &y2, &c,&c, &m2, &c,&c, &d2, &c,&c, &hour2, &c,&c, &min2, &c,&c, &sec2); sscanf(str1,"%d%c%d%c%d%c%d%c%d%c%d",
&y1, &c, &m1, &c, &d1, &c, &hour1, &c, &min1, &c, &sec1);
sscanf(str2,"%d%c%d%c%d%c%d%c%d%c%d",
&y2, &c, &m2, &c, &d2, &c, &hour2, &c, &min2, &c, &sec2); CTime time1(y1, m1, d1, hour1, min1, sec1);
CTime time2(y2, m2, d2, hour2, min2, sec2); CTimeSpan span = time1 - time2; ret = span.GetSeconds();
}
break;
} if(! pDlg->m_bAscend)
ret = -ret; return ret;
}void CPlayListDlg::OnDeleteitemList(NMHDR* pNMHDR, LRESULT* pResult)
{
NMLISTVIEW *pnmlv = (NMLISTVIEW *)pNMHDR; if(pnmlv->lParam)
{
delete (TCHAR *)pnmlv->lParam;
pnmlv->lParam = 0;
}
}