我要CListCtrl对进行排序,回调函数也写好了,我对LVN_COLUMNCLICK消息进行响应,OnColumnclickList(NMHDR* pNMHDR, LRESULT* pResult) 。
开始的时候虽然排序结果不对,但该函数总算能够响应。
现在我点击表头,函数居然根本不响应我的消息。经过测试发现,程序更本没有进入该函数。
我什么设置也没有改变,为什么原来能够响应消息(虽然是错误的排序结果),而
现在根本不响应?
郁闷好几天,很想砸电脑。
还有,我看别人用CSortListCtrl写的示例代码,里面为什么根本没对什么消息进行
响应,这是为什么?
开始的时候虽然排序结果不对,但该函数总算能够响应。
现在我点击表头,函数居然根本不响应我的消息。经过测试发现,程序更本没有进入该函数。
我什么设置也没有改变,为什么原来能够响应消息(虽然是错误的排序结果),而
现在根本不响应?
郁闷好几天,很想砸电脑。
还有,我看别人用CSortListCtrl写的示例代码,里面为什么根本没对什么消息进行
响应,这是为什么?
响应,这是为什么?
------------------
应该是已经在类里实现的排序功能,就象combox一样,它也有个默认的排序功能
{
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); // 必不可少
for(int i=0;i<mylistctrl.GetItemCount();i++){
mylistctrl.SetItemDate(i,i);
}
如果不设置的话那lParaml的值默认为0
现在问题又来了,我的消息响应函数和回调函数如下,当我点击列头时候,点两次才排序一次,而且好像排序只对第一列有效,对别的列无效。请大家指点!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;
}
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;
}你试一下这样