返回> 网站首页 

基于VC++的ListCtrl列表框的排序

yoours2012-02-10 16:05:55 阅读 1236

简介一边听听音乐,一边写写文章。

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;
}

二、对话框工程CListCtrl控件
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;
}
微信小程序扫码登陆

文章评论

1236人参与,0条评论