⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sortlist.cpp

📁 在WinCe平台上开发的数据库管理程序,里面有一个可排序列表控件的实现和Excel的CVS文件的读写类
💻 CPP
字号:
// SortList.cpp : implementation file
//
#include "stdafx.h"
#include "resource.h"
#include "SortList.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSortList

CSortList::CSortList()
{
	m_isReady = FALSE;
	m_enableSort = TRUE;
}

CSortList::~CSortList()
{
}


BEGIN_MESSAGE_MAP(CSortList, CListCtrl)
	//{{AFX_MSG_MAP(CSortList)
	ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSortList message handlers

//点击了某一列的标题
void CSortList::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	
	DWORD wItemCount;							//表项个数
	DWORD i;
	DWORD * saveItemData;						//保存表项自定义信息
	DWORD index;

	// TODO: Add your control notification handler code here	
	//必须用sort进行初始化才能进行排序
	if(!m_isReady || !m_enableSort)
	{
		return;
	}

	if(pNMListView->iSubItem == m_sortCol)
	{
		//点击同一列修改排序方式
		m_sortAsc = !m_sortAsc;	
	}	
	else
	{
		//点击了新的一列,新的一列按升序进行排序
		m_sortAsc = TRUE;
	}
	m_sortCol = pNMListView->iSubItem;

	//保存表项的自定义信息
	wItemCount = this->GetItemCount();
	saveItemData = new DWORD[wItemCount + 2];
	if(saveItemData == NULL)
	{
		MessageBox(_T("列表排序时内存不足!"));
		return;
	}
	i = 0;
	while(i < wItemCount)
	{
		saveItemData[i] = this->GetItemData(i);
		i++;
	}
	
	//修改表项的自定义信息使其可以进行排序
	i = 0;
	while(i < wItemCount)
	{
		this->SetItemData(i,i);
		i++;
	}
	
	//进行排序
	if(SortItems(ListCompare, (LPARAM)this) ==  0)
	{
		MessageBox(_T("无法排序!"));
	}
	
	//恢复表项的自定义信息
	i = 0;
	while(i < wItemCount)
	{
		index = this->GetItemData(i);
		this->SetItemData(i, saveItemData[index]);
		i++;
	}
	
	delete saveItemData;

	*pResult = 0;
}

//FUNCTION:
//	列表框排序
//PARAMETERS:
// curSortCol	[in]当前按哪一列排序
// sortAsc		[in]排序方式Ture 升序 False 降序
// sortType		[in]类型数组
// sortNum		[in]数组大小
//RETURN:
//	无
void CSortList::Sort(WORD curSortCol, BOOL sortAsc, WORD *sortType, WORD sortNum)
{
	int i;
	//列数太多
	if(sortNum >= CSL_MAX_COL - 1)
	{
		return;
	}

	//当前排序列不合理
	if(curSortCol >= sortNum)
	{
		return;
	}

	m_sortAsc = sortAsc;
	for(i = 0; i < sortNum; i++)
	{
		m_sortType[i] = sortType[i];
	}
	m_sortCol = curSortCol;
	m_isReady = TRUE;

	SortItems(ListCompare, (LPARAM)this);
	return;
}

//充许或禁止通过点击表头进行排序
void CSortList::EnableSort(BOOL isEnable)
{
	m_enableSort = isEnable;
	return;
}

//排序函数实现
int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
	CString strComp1, strComp2;					//字符串比较
	float fComp1, fComp2;						//数字比较
	LONG lComp1, lComp2;
	CSortList  *pv;
	int iCompRes;


	//得到CSortList对象指针,从而得到排序方式
	pv = (CSortList *)lParamSort;

	//得到要比较的数据
	switch(pv->m_sortType[pv->m_sortCol])
	{
	//按字符串比较
	case CSL_SORT_STR:
		strComp1 = pv->GetItemText(lParam1, pv->m_sortCol);
		strComp2 = pv->GetItemText(lParam2, pv->m_sortCol);
		iCompRes = strComp1.Compare(strComp2);		
		break;
	//按浮点数比较
	case CSL_SORT_FLOAT:
		strComp1 = pv->GetItemText(lParam1, pv->m_sortCol);
		_stscanf(strComp1, _T("%f"), &fComp1);
		
		strComp2 = pv->GetItemText(lParam2, pv->m_sortCol);
		_stscanf(strComp2, _T("%f"), &fComp2);
		
		if(fComp1 < fComp2)
		{
			iCompRes = -1;
		}else if(fComp1 > fComp2)
		{
			iCompRes = 1;
		}
		else
		{
			iCompRes = 0;
		}

		break;
	//按整数比较
	case CSL_SORT_LONG:
		strComp1 = pv->GetItemText(lParam1, pv->m_sortCol);
		_stscanf(strComp1, _T("%d"), &lComp1);
		
		strComp2 = pv->GetItemText(lParam2, pv->m_sortCol);
		_stscanf(strComp2, _T("%d"), &lComp2);
		
		if(lComp1 < lComp2)
		{
			iCompRes = -1;
		}else if(lComp1 > lComp2)
		{
			iCompRes = 1;
		}
		else
		{
			iCompRes = 0;
		}

		break;

	//不识别的类型
	default:
		iCompRes = 0;
		break;
	}

	//根据当前的排序方式进行调整
	return pv->m_sortAsc ? iCompRes : iCompRes * -1;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -