我要CListCtrl对进行排序,回调函数也写好了,我对LVN_COLUMNCLICK消息进行响应,OnColumnclickList(NMHDR* pNMHDR, LRESULT* pResult) 。
开始的时候虽然排序结果不对,但该函数总算能够响应。
现在我点击表头,函数居然根本不响应我的消息。经过测试发现,程序更本没有进入该函数。
我什么设置也没有改变,为什么原来能够响应消息(虽然是错误的排序结果),而
现在根本不响应?
郁闷好几天,很想砸电脑。
还有,我看别人用CSortListCtrl写的示例代码,里面为什么根本没对什么消息进行
响应,这是为什么?

解决方案 »

  1.   

    我看别人用CSortListCtrl写的示例代码,里面为什么根本没对什么消息进行
    响应,这是为什么?
    ------------------
    应该是已经在类里实现的排序功能,就象combox一样,它也有个默认的排序功能
      

  2.   

    直接:m_ListCtrl.SortItems((PFNLVCOMPARE)CompareFunc,0);
      

  3.   

    http://www.vckbase.com/document/viewdoc/?id=243
      

  4.   

    LVN_COLUMNCLICK是这个消息,可能是其他的地方有问题?
      

  5.   

    http://community.csdn.net/Expert/topic/2915/2915806.xml?temp=.3606073
      

  6.   

    nt CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
    {
    CSortListCtrl* pV=(CSortListCtrl*)lParamSort; 
        CString strItem1, strItem2; 
        LVFINDINFO info;  int nIndex; 
        info.flags = LVFI_PARAM;                       //ÉèÖÃΪLVFI_PARAM£¬ºóÃæµÄFindItem²ÅÄÜÓÐЧ£¬ÏêÇé²Î¿¼MSDNµÄLVFINDINFO 
        info.lParam = lParam1;                         //ÓÉitem data(lParam1)µÃµ½¶ÔÓ¦µÄitem text 
        if ( (nIndex=pV->FindItem(&info)) != -1) 
           strItem1 = pV->GetItemText(nIndex, pV->m_nSortedCol); 
        info.lParam = lParam2;                         //ÓÉitem data(lParam2)µÃµ½¶ÔÓ¦µÄitem text 
        if ( (nIndex=pV->FindItem(&info)) != -1)
           strItem2 = pV->GetItemText(nIndex, pV->m_nSortedCol); 
        int iCompRes ;
    iCompRes = strcmp(strItem1, strItem2);     //¸ù¾Ýµ±Ç°µÄÅÅÐò·½Ê½½øÐе÷Õû 
        if(pV->m_fAsc) 
           return iCompRes;
        else 
           return iCompRes*-1;
    }
    void CSortListCtrl::OnColumnClick( NMHDR* pNMHDR, LRESULT* pResult )
    {
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; if( pNMListView->iSubItem == m_nSortedCol )
    m_fAsc = !m_fAsc;
    else
    {
    m_fAsc = TRUE;
    m_nSortedCol = pNMListView->iSubItem;
    }
    VERIFY(SortItems( ListCompare, reinterpret_cast<DWORD>( this )));
    *pResult = 0;
    }
    BOOL CListsortDlg::OnInitDialog()
    {
    CDialog::OnInitDialog();
    .......
    item = m_LstSort.InsertItem(0,"192.168.0.1");
    m_LstSort.SetItemText(item,1,"jjj");
    m_LstSort.SetItemText(item,2,"13");
    m_LstSort.SetItemData(item,0);                   // 必不可少
      

  7.   

    排序之前要
    for(int i=0;i<mylistctrl.GetItemCount();i++){
        mylistctrl.SetItemDate(i,i);
    }
    如果不设置的话那lParaml的值默认为0
      

  8.   

    点击标题栏就是响应这个消息 LVN_COLUMNCLICK也许楼主是别的地方错了
      

  9.   

    不好意思,我在myListCtrl中重载了该消息的一个空函数。
    现在问题又来了,我的消息响应函数和回调函数如下,当我点击列头时候,点两次才排序一次,而且好像排序只对第一列有效,对别的列无效。请大家指点!void myListCtrl::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR; if(pNMListView->iSubItem==nColum)
    bAscend=!bAscend;
    else
    {
    bAscend=true;
    nColum=pNMListView->iSubItem;
    }
     
    SortItems(Compare, (LPARAM)this);

    *pResult = 0;
    }int CALLBACK Compare(LPARAM lParam1, LPARAM lParam2, LPARAM lParam)
    {
    myListCtrl* plist=(myListCtrl*)lParam;
    int index1=(int)lParam1, index2=(int)lParam2;
    char buffer1[100], buffer2[100];
    int ret; memset(buffer1, 0, 100);
    memset(buffer2, 0, 100);
    plist->GetItemText(index1, plist->nColum, buffer1, 100);
    plist->GetItemText(index2, plist->nColum, buffer2, 100); if(IsNumber(buffer1))
    ret=NumberCompare(buffer1, buffer2);
    else
    ret=strcmp(buffer1, buffer2);

    if(plist->bAscend==false)
    ret=-ret; return ret;
    }
      

  10.   

    想当初用mfc自带的跌代排序函数死活不管用,最后还是自己写了个冒泡用。
      

  11.   

    int g_nSubItem;//按哪一列纪录排序?
    int g_flag;//是否是数字
    //回调函数
    int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
    {
        CMyListCtrl* pV=(CMyListCtrl*)lParamSort;
        CString strItem1, strItem2;
        LVFINDINFO info;
        int nIndex;
        info.flags = LVFI_PARAM;    info.lParam = lParam1;    //由item data(lParam1)得到对应的item text
        if ( (nIndex=pV->FindItem(&info)) != -1)
            strItem1 = pV->GetItemText(nIndex,g_nSubItem);    info.lParam = lParam2;    //由item data(lParam2)得到对应的item text
        if ( (nIndex=pV->FindItem(&info)) != -1)
            strItem2 = pV->GetItemText(nIndex, g_nSubItem);
        
           //int iCompRes = strcmp(strItem1, strItem2);
    int iCompRes;
    if(g_nSubItem!=g_flag)
    iCompRes=strItem1.Compare(strItem2);
    else//数字排序
    {
    if(atof(strItem1)==atof(strItem2))
    iCompRes = 0;
    else
    iCompRes=(atof(strItem1) < atof(strItem2))?-1:1;
    }
        //根据当前的排序方式进行调整
    if(pV->m_fAsc)
            return iCompRes;
        else
            return iCompRes*-1;}
    void CDlgTest::OnColumnclickList1(NMHDR* pNMHDR, LRESULT* pResult) 
    {
    NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
    // TODO: Add your control notification handler code here
    AfxMessageBox("A");
    //设置排序方式
        if( pNMListView->iSubItem == m_wndList.m_nSortedCol )
            m_wndList.m_fAsc = !m_wndList.m_fAsc;
        else
        {
            m_wndList.m_fAsc = TRUE;
            m_wndList.m_nSortedCol = pNMListView->iSubItem;
        }
        //对哪一列进行排序
        g_nSubItem=pNMListView->iSubItem;
    //判断哪一列是数字
    g_flag=3;
        //调用排序函数
        m_wndList.SortItems( ListCompare, (DWORD)&m_wndList );   *pResult = 0;
    }你试一下这样