?? 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 + -