📄 sortlist.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 + -