CListCtrl,按照某列进行排序(本地数据倒序、正序)---SetItemData和GetItemData
1、h文件中
1 2 3 4 5 | afx_msg void OnColumnClick(NMHDR *pNMHDR, LRESULT *pResult); int static CALLBACK CompareByTime( LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort); CListCtrl m_list_; |
记得是CListCtrl类。如果用子类,记得看一下是否有OnColumnClick
2、cpp文件中:
1 2 3 4 | BEGIN_MESSAGE_MAP(CDlgOssJson, CBCGPDialog) ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_ITEMS, &CDlgOssJson::OnLvnItemchangedList) ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST_ITEMS, &CDlgOssJson::OnColumnClick) END_MESSAGE_MAP() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | BOOL CDlgOssJson::OnInitDialog() { CBCGPDialog::OnInitDialog(); DWORD dwStyle = m_list_.GetExtendedStyle(); dwStyle |= LVS_EX_FULLROWSELECT; dwStyle |= LVS_EX_GRIDLINES; dwStyle |= LVS_EX_CHECKBOXES; m_list_.SetExtendedStyle(dwStyle); int nCol = 0; //列标题 m_list_.InsertColumn(nCol++, _T( "名称" ), LVCFMT_CENTER, 300); m_list_.InsertColumn(nCol++, _T( "上传时间" ), LVCFMT_CENTER, 200); GetItemsData(1); return TRUE; } void CDlgOssJson::OnLvnItemchangedList(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast <LPNMLISTVIEW>(pNMHDR); if (pNMLV->iSubItem == 0) { BOOL bChk = TRUE; int nCount = m_list_.GetItemCount(); for ( int i = 0; i < nCount; ++i) { bChk = m_list_.GetCheck(i); if (!bChk) { break ; } } m_chk_all_.SetCheck(bChk); } *pResult = 0; } int CALLBACK CDlgOssJson::CompareByTime( LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort) { oss_json_data *cd1 = (oss_json_data*)( LPARAM )lParam1; //SetItemData时的值 oss_json_data *cd2 = (oss_json_data*)( LPARAM )lParam2; if (cd1 != NULL && cd2 != NULL) { return st_bMethod ? cd1->strTime.CompareNoCase(cd2->strTime) : cd2->strTime.CompareNoCase(cd1->strTime); } else { return int (st_bMethod); } } void CDlgOssJson::OnColumnClick(NMHDR *pNMHDR, LRESULT *pResult) { LPNMLISTVIEW pNMLV = reinterpret_cast <LPNMLISTVIEW>(pNMHDR); *pResult = 0; if (st_nSortColumn == pNMLV->iSubItem) { st_bMethod = !st_bMethod; m_list_.SortItems(CompareByTime, ( DWORD_PTR )&m_list_); //(DWORD_PTR)this也可以将this对话框传入CompareByTime } } |
重点来了
要记得
1 2 3 4 5 6 7 8 9 10 11 | m_list_.DeleteAllItems(); int iSize = m_vec_items_.size(); for ( int i = 0; i < iSize; ++i) { CString strItem = _T( "" ); strItem.Format(_T( "%d" ), i + 1); m_list_.InsertItem(i, strItem); //行标题 m_list_.SetItemData(i, ( LPARAM )(oss_json_data*)&m_vec_items_[i]); //列排序时用 m_list_.SetItemText(i, 0, m_vec_items_[i].strProjName); m_list_.SetItemText(i, 1, m_vec_items_[i].strTime); } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2014-04-18 vs2008配置winddk
2014-04-18 在初次安vs2008时设置的为C#现在怎么将其改为其他类型的界面