返回> 网站首页
基于VC++的ListCtrl列表框的排序
yoours2012-02-10 16:05:55
简介一边听听音乐,一边写写文章。
typedef struct _info{
CListCtrl * m_list;
int col;
bool asc;
}INFO;
bool asc = true;
一、基于视图工程 CListView
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CString text1,text2;
INFO* info = (INFO*)lParamSort;
LVFINDINFO fi;
fi.flags = LVFI_PARAM;
fi.lParam = lParam1;
LVFINDINFO fi1;
fi1.flags = LVFI_PARAM;
fi1.lParam = lParam2;
//从LVITEM结构中的lParam成员来查找对应项的索引号
int index1 = info->m_list->FindItem(&fi);
int index2 = info->m_list->FindItem(&fi1);
text1 = info->m_list->GetItemText(index1, info->col);
text2 = info->m_list->GetItemText(index2, info->col);
int i = 0;
if (info->asc)
i = wcscmp(text1.GetBuffer(), text2.GetBuffer());
else
i = wcscmp(text2.GetBuffer(), text1.GetBuffer());
return i;
}
void CDemoView::OnLvnColumnclick(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: Add your control notification handler code here
static int iSorted = -1; //排序列号
if (pNMLV->iSubItem == iSorted)
asc = !asc;
CListCtrl &ctrl = GetListCtrl();
INFO info;
info.col = iSorted = pNMLV->iSubItem;
info.m_list = &ctrl;
info.asc = asc;
ctrl.SortItems((PFNLVCOMPARE)CompareFunc, (LPARAM)&info);
*pResult = 0;
}
typedef struct _info{
CListCtrl * m_list;
int col;
bool asc;
}INFO;
int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
CString text1,text2,strT;
INFO* info = (INFO*)lParamSort;
strT = info->m_list->GetItemText((int)lParam1, info->col);
text1.Format("%s", strT.Left(strT.Find('(')));
text1.Trim();
strT = info->m_list->GetItemText((int)lParam2, info->col);
text2.Format("%s", strT.Left(strT.Find('(')));
text2.Trim();
int i = 0;
if (info->asc)
i = atol(text1.GetBuffer()) > atol(text2.GetBuffer());
else
i = atol(text1.GetBuffer()) < atol(text2.GetBuffer());
return i;
}
bool asc = true;
void CDlg::OnLvnColumnclickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: Add your control notification handler code here
static int iSorted = -1; //排序列号
if (pNMLV->iSubItem != 0)
{
*pResult = 0;
return;
}
if (pNMLV->iSubItem == iSorted)
asc = !asc;
CListCtrl* m_ListCtrl = (CListCtrl*)GetDlgItem(IDC_LIST1);
INFO info;
info.col = iSorted = 0;//只针对第一列排序
info.m_list = m_ListCtrl;
info.asc = asc;
m_ListCtrl->SortItemsEx((PFNLVCOMPARE)CompareFunc, (LPARAM)&info);
*pResult = 0;
}
文章评论
1515人参与,0条评论