我现在急需实现点击ListCtrl控件的每一个Head,来实现该列的数据的排序!
如果有现成的程序可以给我发E_MAIL:[email protected]
也可以高诉网址或关键的代码!
谢谢!
急!!!!

解决方案 »

  1.   

    有可回调函数可以使用啊.
    int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, 
       LPARAM lParamSort);
    SortItems(CompareFunc,para);SortItems会用你回调函数指定的规则排序的,很简单.
      

  2.   

    msdn里有……static int CALLBACK 
    MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
    {
       // lParamSort contains a pointer to the list view control.
       // The lParam of an item is just its index.
       CListCtrl* pListCtrl = (CListCtrl*) lParamSort;
       CString    strItem1 = pListCtrl->GetItemText(lParam1, 0);
       CString    strItem2 = pListCtrl->GetItemText(lParam2, 0);   return strcmp(strItem2, strItem1);
    }void snip_CListCtrl_SortItems()
    {
       // The pointer to my list view control.
       extern CListCtrl* pmyListCtrl;   // Sort the list view items using my callback procedure.
       pmyListCtrl->SortItems(MyCompareProc, (LPARAM) pmyListCtrl);
    }
    但是奇怪的是不起作用
    sigh
    不知是不是要装service pack。
      

  3.   

    列表控制有一个特殊的功能,当以详细资料方式显示时,列表顶部的表头可以当作按钮来使用,这可以通过列表控制创建时的风格来控制。当鼠标点击列表头名称时,列表控制就会向其父窗口发送一个LNV_COLUMNCLICK消息,利用类导向中列表控制IDC_LISTCTRL对应的LNV_COLUMNCLICK消息加入相应处理函数,就可将表列按照特定顺序进行排列。其函数使用方法见程序,其中iSort为排序的表列索引号,(PFNLVCOMPARE)CompareFunc为进行具体排序的回调函数,也就是说,通过鼠标点击表头实现的排序过程是由第三方开发的专用排序函数来实现的,排序函数只是实现表项的具体比较操作,而整个排序过程是由SortItemS属性通过不断调用这个函数来实现的。正常的排序过程是升序方式,通过调换排序函数中的参数值,就可实现降序排列,即将PARAM1与PARAM2调换位置。这个回调函数的前两个参数为表列中表项的索引号,第三个参数为排序的表列索引号。void CVCLISTDlg::OnColumnclickListctrl(NMHDR* pNMHDR, LRESULT* pResult) { //鼠标左键单击表头处理函数NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;// TODO: Add your control notification handler code herestatic int iSorted=-1;//排列序号if (pNMListView->iSubItem==iSorted) return;iSorted=pNMListView->iSubItem;m_ListCtrl.SortItems((PFNLVCOMPARE)CompareFunc,iSorted);*pResult = 0;}//排序时比较表项的回调函数int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2,LPARAM lParamSort){ char *text1,*text2;switch (lParamSort){case 0L:text1=Sps[lParam1].szPm;text2=Sps[lParam2].szPm;break;case 1L:text1=Sps[lParam1].szSl;text2=Sps[lParam2].szSl;break;case 2L:text1=Sps[lParam1].szDj;text2=Sps[lParam2].szDj;break;case 3L:text1=Sps[lParam1].szJe;text2=Sps[lParam2].szJe;break;}return (strcmp(text1,text2));//结果为>0 =0 <0}同样,也可以通过专用按钮来实现排序功能,如本文的排序按钮对应的功能代码如下:void CVCLISTDlg::OnSort() { // TODO: Add your control notification handler code herem_ListCtrl.SortItems((PFNLVCOMPARE)CompareFunc,0);}
      

  4.   

    sigh
    查了半天文档才发现,原来回调函数的参数是插入
    item时的lparam值……而不是
    item的索引……郁闷。
      

  5.   

    text1=Sps[lParam1].szPm;text2=Sps[lParam2].szPm;text1 何text2的意思是得到同一列的两个项的字符串,将其提取出即可!
      

  6.   

    完整应该如下,要加上给各item赋一个跟序列号一样的lparam值……
    在LV_COLUMNCLICK(好像是)事件里调用sortitems方法吧。static int CALLBACK 
    MyCompareProc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
    {
       // lParamSort contains a pointer to the list view control.
       // The lParam of an item is just its index.
       CListCtrl* pListCtrl = (CListCtrl*) lParamSort;
       CString    strItem1 = pListCtrl->GetItemText(lParam1, 0);
       CString    strItem2 = pListCtrl->GetItemText(lParam2, 0);   return strcmp(strItem2, strItem1);
    }void snip_CListCtrl_SortItems()
    {
       // The pointer to my list view control.
       extern CListCtrl* pmyListCtrl;
       
       int i;
       for (i=0;i<pmyListCtrl->GetItemCount();i++) {
          pmyListCtrl->SetItemData(i,i);
       }
       // Sort the list view items using my callback procedure.
       pmyListCtrl->SortItems(MyCompareProc, (LPARAM) pmyListCtrl);
    }