zoukankan      html  css  js  c++  java
  • List控件排序,别处看到的,记下来

    先在.cpp文件的上面定义几个全局变量

    BOOL m_bAsc1;//是否顺序排序
    int m_nSortedCol1;//当前排序的列
    static int CALLBACK SortLVProc1(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort);排序函数
    
    static int CALLBACK SortLVProc1(LPARAM lParam1,LPARAM lParam2,LPARAM lParamSort)
    {
       CListCtrl *pList=(CListCtrl*)lParamSort;
    int nItem1,nItem2;
    LVFINDINFO FindInfo;
    FindInfo.flags=LVFI_PARAM;
    FindInfo.lParam=lParam1;
    nItem1=pList->FindItem(&FindInfo,-1);
    FindInfo.lParam=lParam2;
    nItem2=pList->FindItem(&FindInfo,-1);
    if((nItem1==-1)||(nItem2==-1))
    {
       return 0;
    }
    CString str1,str2;
    str1=pList->GetItemText(nItem1,m_nSortedCol1);
    str2=pList->GetItemText(nItem2,m_nSortedCol1);
    HDITEM headerItem;
    headerItem.mask = HDI_LPARAM;
    CHeaderCtrl* pHeaderCtrl = pList->GetHeaderCtrl( );
    pHeaderCtrl->GetItem( m_nSortedCol1, &headerItem );
    UINT nType = (UINT)(headerItem.lParam);
    int iCompRes = 0;
    switch( nType )
    {
    case INT_TYPE:
       {
        int i1,i2;
        i1 = atoi( str1 );
        i2 = atoi( str2 );
        if( i1 > i2)
         iCompRes = 1;
        else if( i1 == i2 )
         iCompRes = 0;
        else
         iCompRes = -1;
       }
       break;
    case DOUBLE_TYPE:
       {
        double i1,i2;
        i1 = atof( str1 );
        i2 = atof( str2 );
        if( i1 > i2)
         iCompRes = 1;
        else if( i1 == i2 )
         iCompRes = 0;
        else
         iCompRes = -1;
       }
       break;
    case STRING_TYPE:
    default:
       {
        if( str1 > str2)
         iCompRes = 1;
        else if( str1 == str2 )
         iCompRes = 0;
        else
         iCompRes = -1;
       }
       break;
    }
    if(m_bAsc1)
      return iCompRes;
    else
       return iCompRes*-1;
    return 0;
    }


    这个排序函数的有点在于他对要排序的变量包括的很全,有int ,cstring,double型的,这是在.h文件的函数体外定义的:enum { INT_TYPE = 0, STRING_TYPE, DOUBLE_TYPE };
    最后加一个单击表头的消息响应函数 ON_NOTIFY(LVN_COLUMNCLICK, IDC_LIST1, OnLvnColumnclickList1)

    void CGAMEFAST::OnLvnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult)
    {
    LPNMLISTVIEW pNMListView = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
    
    if(pNMListView->iSubItem==m_nSortedCol1)
          m_bAsc1=!m_bAsc1;
    else
    {
        m_bAsc1=true;
        m_nSortedCol1=pNMListView->iSubItem;
    }
    
    int    i=m_MyList.GetItemCount();                //   这两句函数是关键哦。。。。
        while(i--)m_MyList.SetItemData(i,i);  
    
    m_MyList.SortItems(SortLVProc1,(DWORD)&m_MyList);
    *pResult = 0;
    
    }


    把控件变量名改成你的控件变量就可以了!上面标着关键的那两句就是关键

  • 相关阅读:
    Android 4编程入门经典—开发智能手机与平板电脑应用
    硅谷产学研的创新循环
    用集群实现网格计算
    用商业模式改变世界(上)
    wrox经典红皮书:C++高级编程(第2版)
    编程导师Ivor Horton新作《Java 7入门经典》即将出版
    诚聘译者,翻译有奖!您就是引领先进技术潮流的先驱!
    定义目录的格式
    关于Q+
    Resource and Performance Tradeoffs in DelayTolerant Wireless Networks
  • 原文地址:https://www.cnblogs.com/nkzhangkun/p/3490002.html
Copyright © 2011-2022 走看看