其他分享
首页 > 其他分享> > Win32 ListCtrl控件点击列标题排序

Win32 ListCtrl控件点击列标题排序

作者:互联网

1.在WM_NOTIFY消息中捕获鼠标点点击列的索引

int MyMainDialog::OnNotify(NMHDR* pNMhdr)
{
    if (pNMhdr->idFrom == IDC_LIST1)
    {
        QListCtrl listCtrl(pNMhdr->idFrom, this);
        NMLISTVIEW* pNmListView = (NMLISTVIEW*)pNMhdr;

        switch (pNMhdr->code)
        {
        case LVN_COLUMNCLICK:
        {
            //获得点击的列的索引     
            int nCol = pNmListView->iSubItem;
//获得列标题中图标的索引 int nColImage = listCtrl.GetColumnImageIndex(nCol);
//SortItemFunc自己定义的排序回调函数,第二个参数传二个值(列索引,升序=0/降序=1)
        //这个函数就是向ListCtrl控件发送的LVM_SORTITEMS消息 listCtrl.SortItem(SortItemFunc, MAKELPARAM(nCol, nColImage));
//排序后把图标索引改变(就在0和1之间) listCtrl.SetColumnImageIndex(nCol, (nColImage == 0 ? 1 : 0)); }break; case LVN_DELETEITEM: //关闭窗口后删除行中保存New出来的内存地址 { if (pNmListView->lParam != 0) { delete (StudentStruct*)pNmListView->lParam; pNmListView->lParam = 0; } }break; } } return 0; }

2.自定义回调函数SortItemFunc

int CALLBACK SortItemFunc(LPARAM lParam1, LPARAM lParam2, LPARAM sortID)
{
    //要比较的两行数据
  //这两行的数据是保存在行的lParam数据中
  //用SetItemData赋值的
StudentStruct* pStu1 = (StudentStruct*)lParam1; StudentStruct* pStu2 = (StudentStruct*)lParam2; int nCol = LOWORD(sortID); //要比较的列索引 int nAcs = HIWORD(sortID); //按升序或是降序排序 int nRet = 0; switch (nCol) { case 0: //姓名 nRet = _tcscmp(pStu1->name, pStu2->name); break; case 1: //性别 nRet = _tcscmp(pStu1->sex, pStu2->sex); break; case 2: //年龄,这是字符比较,如果是数字比较就要自己处理<,=,>的结果 //nRet = _tcscmp(pStu1->age, pStu2->age); if (pStu1->age < pStu2->age) nRet = -1; if (pStu1->age == pStu2->age) nRet = 0; if (pStu1->age > pStu2->age) nRet = 1; break; case 3: //电话 nRet = _tcscmp(pStu1->tel, pStu2->tel); break; } return (nAcs == 0 ? nRet : -nRet); }

 

 

 

点击性别示意图

 

 

 

 

 

点击年龄示意图

 

 

 

 

点击姓名示意图

 

 

 

 

 

感觉林这个性没排对,不只为啥?

 

标签:控件,int,age,Win32,pStu2,pStu1,ListCtrl,nRet,break
来源: https://www.cnblogs.com/greenleaf1976/p/16323145.html