list control单击列表头排序(对第一列处理)

上次我也写过一篇博客,能够实现单击列表头排序功能(所有列),不过后来在实际运行中发现原来的那种方法只能识别数字1~9(因为直接用Cstring进行比较).为此我这里再提供一种方法,能够实现较多类型字符的比较,排序

首先,在你的.cpp中定义全局变量

DWORD  dwSelColID =0; //选择的列
BOOL   bASC = FALSE;     //是否升序

在相对应的.h文件中定义联合体

enum { INT_TYPE = 0, STRING_TYPE, DOUBLE_TYPE };

在.cpp中定义回调函数

static int CALLBACK CompareFunc(LPARAM   lParam1,   LPARAM   lParam2,LPARAM   lParamSort)
{
	CListCtrl *pListCtrl = (CListCtrl *)lParamSort;//{这里面都是固定语法,适当了解
	LVFINDINFO findInfo;
	findInfo.flags = LVFI_PARAM;
	findInfo.lParam = lParam1;
	int iItem1 = pListCtrl->FindItem(&findInfo,-1);
	findInfo.lParam = lParam2;
	int iItem2 = pListCtrl->FindItem(&findInfo,-1);//这里面都是固定语法,适当了解}

	//CString strItem1 = pListCtrl->GetItemText(iItem1, dwSelColID);   //需要研究
	//CString strItem2 = pListCtrl->GetItemText(iItem2, dwSelColID);   //需要研究
	//char * str1 =(char * )strItem1.GetBuffer(strItem1.GetLength());  //需要研究
	//char * str2 =(char * )strItem2.GetBuffer(strItem1.GetLength());  //需要研究
	CString str1,str2;
	str1=pListCtrl->GetItemText(iItem1,dwSelColID);
	str2=pListCtrl->GetItemText(iItem2,dwSelColID);
	HDITEM headerItem;
	headerItem.mask = HDI_LPARAM;
	CHeaderCtrl* pHeaderCtrl = pListCtrl->GetHeaderCtrl( );
	pHeaderCtrl->GetItem(dwSelColID, &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(bASC)
		return iCompRes;
	else
		return iCompRes*-1;
	return 0;
}

在单击表头响应函数中添加响应操作

void CMy528Update_MfcDlg::OnLvnColumnclickList3(NMHDR *pNMHDR, LRESULT *pResult)//***********************单击表头实现排序
{
	LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
	

	if (dwSelColID != pNMLV->iSubItem)
	{
		dwSelColID = pNMLV->iSubItem;
		bASC = bASC;
	}
	else
		bASC = !bASC;
	int count = m_list3.GetItemCount();
	for (int i = 0;i < count;i++)
		m_list3.SetItemData(i,i);
	m_list3.SortItems(CompareFunc,(LPARAM)(&m_list3));
	*pResult = 0;
}


猜你喜欢

转载自blog.csdn.net/qq_37059136/article/details/80536500