VC之列表控件排序
2015-04-05 20:06
218 查看
本文简单介绍下VC列表控件排序功能实现。
![](https://img-blog.csdn.net/20150405200745042?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmluZ2RpYW5sYW54aW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
{
// Construction
public:
int m_nSortSign2;
int m_nSortSign1;
CListSortDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CListSortDlg)
enum { IDD = IDD_LISTSORT_DIALOG };
CListCtrl m_list2;
CListCtrl m_list1;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CListSortDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CListSortDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnColumnclickList2(NMHDR* pNMHDR, LRESULT* pResult);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
void SetListInit2();
void SetListInit();
};
排序事件
排序事件
![](https://img-blog.csdn.net/20150405201529127?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmluZ2RpYW5sYW54aW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
点击列表1标题栏,试试点击不同的栏的效果
![](https://img-blog.csdn.net/20150405201554617?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmluZ2RpYW5sYW54aW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
点击列表2标题栏,试试点击不同的栏的效果
![](https://img-blog.csdn.net/20150405201538225?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmluZ2RpYW5sYW54aW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20150405201547008?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmluZ2RpYW5sYW54aW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20150405201642619?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYmluZ2RpYW5sYW54aW4=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
源码下载
1.新建对话框应用程序
新建对话框应用程序,并且添加List列表控件。2.添加相关变量和函数
class CListSortDlg : public CDialog{
// Construction
public:
int m_nSortSign2;
int m_nSortSign1;
CListSortDlg(CWnd* pParent = NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CListSortDlg)
enum { IDD = IDD_LISTSORT_DIALOG };
CListCtrl m_list2;
CListCtrl m_list1;
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CListSortDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CListSortDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult);
afx_msg void OnColumnclickList2(NMHDR* pNMHDR, LRESULT* pResult);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
void SetListInit2();
void SetListInit();
};
3.初始化
初始化变量
SetListInit(); SetListInit2(); m_nSortSign1 = 1; m_nSortSign2 = 1;
初始化列表
void CListSortDlg::SetListInit() { //属性设置 m_list1.ModifyStyle(LVS_TYPEMASK,LVS_REPORT&LVS_TYPEMASK|LVS_SINGLESEL); DWORD dwStyle = m_list1.GetExtendedStyle(); m_list1.SetExtendedStyle(dwStyle|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); //设置行宽 CImageList image; image.Create(1,30,ILC_COLOR24|ILC_MASK,4,0); m_list1.SetImageList(&image,LVSIL_SMALL); //设置字体和大小 CFont font; font.CreateFont(16,0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"宋体"); m_list1.SetFont(&font); m_list1.GetHeaderCtrl()->SetFont(&font); //设置标题头 m_list1.InsertColumn(0,"序号",LVCFMT_LEFT,80,0); m_list1.InsertColumn(1,"姓名",LVCFMT_LEFT,120,0); m_list1.InsertColumn(2,"年龄",LVCFMT_LEFT,80,0); //设置内容 m_list1.InsertItem(0,"001"); m_list1.SetItemText(0,1,"小明"); m_list1.SetItemText(0,2,"18"); m_list1.InsertItem(1,"002"); m_list1.SetItemText(1,1,"小红"); m_list1.SetItemText(1,2,"17"); m_list1.InsertItem(2,"003"); m_list1.SetItemText(2,1,"小华"); m_list1.SetItemText(2,2,"19"); } void CListSortDlg::SetListInit2() { //属性设置 m_list2.ModifyStyle(LVS_TYPEMASK,LVS_REPORT&LVS_TYPEMASK|LVS_SINGLESEL); DWORD dwStyle = m_list2.GetExtendedStyle(); m_list2.SetExtendedStyle(dwStyle|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES); //设置行宽 CImageList image; image.Create(1,30,ILC_COLOR24|ILC_MASK,4,0); m_list2.SetImageList(&image,LVSIL_SMALL); //设置字体和大小 CFont font; font.CreateFont(16,0,0,0,FW_NORMAL,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_SWISS,"宋体"); m_list2.SetFont(&font); m_list2.GetHeaderCtrl()->SetFont(&font); //设置标题头 m_list2.InsertColumn(0,"序号",LVCFMT_LEFT,80,0); m_list2.InsertColumn(1,"姓名",LVCFMT_LEFT,120,0); m_list2.InsertColumn(2,"年龄",LVCFMT_LEFT,80,0); //设置内容 m_list2.InsertItem(0,"001"); m_list2.SetItemText(0,1,"小明"); m_list2.SetItemText(0,2,"18"); m_list2.InsertItem(1,"002"); m_list2.SetItemText(1,1,"小红"); m_list2.SetItemText(1,2,"17"); m_list2.InsertItem(2,"003"); m_list2.SetItemText(2,1,"小华"); m_list2.SetItemText(2,2,"19"); }
4.排序
方案一:只对指定栏排序
系统函数int CALLBACK SortData1(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { CListSortDlg* pDlg = (CListSortDlg*)lParamSort; if (!pDlg) { return 0; } CListCtrl &list = (CListCtrl&)(pDlg->m_list1); WORD wSubItem = 0; WORD nItem1 = lParam1; WORD nItem2 = lParam2; CString sItem1 = list.GetItemText(nItem1,wSubItem); CString sItem2 = list.GetItemText(nItem2,wSubItem); if (sItem1 < sItem2) { return pDlg->m_nSortSign1; } else { return -1*pDlg->m_nSortSign1; } return 0; }
排序事件
void CListSortDlg::OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // TODO: Add your control notification handler code here LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); if (0 == pNMLV->iSubItem) { int cnt = m_list1.GetItemCount(); for (int i=0; i<cnt; i++) { m_list1.SetItemData(i,i); } m_list1.SortItems(SortData1,DWORD(this)); if (m_nSortSign1 >=0) { m_nSortSign1 = -1; } else { m_nSortSign1 = 1; } } *pResult = 0; }
方案二:对所有栏排序
系统函数int CALLBACK SortData2(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { CListSortDlg* pDlg = (CListSortDlg*)lParamSort; if (!pDlg) { return 0; } CListCtrl &list = (CListCtrl&)(pDlg->m_list2); WORD wSubItem = (lParam1&0xFFFF0000)>>16; WORD nItem1 = lParam1&0x0000FFFF; WORD nItem2 = lParam2&0x0000FFFF; CString sItem1 = list.GetItemText(nItem1,wSubItem); CString sItem2 = list.GetItemText(nItem2,wSubItem); if (sItem1 < sItem2) { return pDlg->m_nSortSign2; } else { return -1*pDlg->m_nSortSign2; } return 0; }
排序事件
void CListSortDlg::OnColumnclickList2(NMHDR* pNMHDR, LRESULT* pResult) { NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; // TODO: Add your control notification handler code here LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR); if (-1 < pNMLV->iSubItem) { DWORD dwItemData = 0; int cnt = m_list2.GetItemCount(); for (int i=0; i<cnt; i++) { dwItemData = pNMLV->iSubItem; dwItemData = dwItemData<<16; dwItemData = dwItemData+i; m_list2.SetItemData(i,dwItemData); } m_list2.SortItems(SortData2,DWORD(this)); if (m_nSortSign2 >=0) { m_nSortSign2 = -1; } else { m_nSortSign2 = 1; } } *pResult = 0; }
5.效果
运行程序点击列表1标题栏,试试点击不同的栏的效果
点击列表2标题栏,试试点击不同的栏的效果
源码下载
相关文章推荐
- vc中列表视图控件的使用
- VC++之列表控件(CListCtrl)中加入复选框
- VC MFC列表视图(CListCtrl)控件
- VC中给列表控件CListCtrl添加复选框
- VC中给列表控件CListCtrl添加复选框
- VC中列表视图控件的使用
- [VC/MFC]虚拟列表控件——显示上百万数据的列表控件
- VC++之列表控件(CListCtrl)中加入复选框
- VC++ 列表控件(CList) 使用方法 (2)
- VC控件资料汇总--------列表控件 .
- [VC/MFC]虚拟列表控件
- 【转帖】VC中使CListCTrl控件排序
- VC++中ClistControl列表头实现排序
- VC++ 列表控件(CList) 使用方法
- VC++之列表控件(CListCtrl)中加入复选框
- 列表控件排序功能的实现
- 列表控件排序功能的实现
- [VC/MFC]虚拟列表控件——显示上百万数据的列表控件
- vc 列表控件(listctrl) 设置选中某行
- VC 列表控件 CListCtrl成员