#include "MyListView.h"
IMPLEMENT_DYNCREATE(CMyListView, CListView)
BEGIN_MESSAGE_MAP(CMyListView, CListView)
ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnClick)//1011 afx_idw_pane_first?
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CView3 construction/destruction
CMyListView::CMyListView()
{
// TODO: add construction code here
m_nCurSortCol = -1;
}
CMyListView::~CMyListView()
{
m_vFrozenCols.clear();
}
BOOL CMyListView::PreCreateWindow(CREATESTRUCT& cs)
{
// 用LVS_SORTDESCENDING时注意, 插入数据时需根据insertitem返回插入n列
cs.style |= LVS_REPORT | LVS_SHOWSELALWAYS ;// | LVS_SORTDESCENDING;
return CListView::PreCreateWindow(cs);
}
//1016 固定列
BOOL CMyListView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
int len = m_vFrozenCols.size();
if(len > 0)
{
HD_NOTIFY* pHDN = (HD_NOTIFY*)lParam;
switch(((NMHDR*)lParam)->code)
{
case HDN_BEGINTRACKW:
case HDN_BEGINTRACKA:
case HDN_DIVIDERDBLCLICKA:
case HDN_DIVIDERDBLCLICKW:
for(int i=0; i<len; i++)
{
if(pHDN->iItem == m_vFrozenCols[i]) //如果拖动的列是设定固定列宽的列之一
{
*pResult = TRUE;
return TRUE;
}
}
}
}
return CListView::OnNotify(wParam, lParam, pResult);
}
void CMyListView::FreezeColumn(int col)
{
m_vFrozenCols.push_back(col);
}
/////////////////////////////////////////////////////////////////////////////
//1011 排序
int CALLBACK CMyListView::ListViewCompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
int *pisortorder = (int*)lParamSort;//得到排序方式
TCHAR *sz1 = (TCHAR*)lParam1;
TCHAR *sz2 = (TCHAR*)lParam2;//得到两个列的排序信息
if(*pisortorder == LVS_SORTASCENDING)
return lstrcmp(sz1, sz2);
else
return lstrcmp(sz1, sz2) * (-1);
}
int CALLBACK CMyListView::ListViewCompareIntFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
int *pisortorder = (int*)lParamSort;//得到排序方式
TCHAR *sz1 = (TCHAR*)lParam1;
TCHAR *sz2 = (TCHAR*)lParam2;//得到两个列的排序信息
int n1 = _ttoi(sz1);//? 不用单独提出int
int n2 = _ttoi(sz2);
if(*pisortorder == LVS_SORTASCENDING)
{
if(n1 - n2 > 0) return 1;
else if(n1 - n2 == 0) return 0;
else return -1;
}
else
{
if(n1 - n2 > 0) return -1;
else if(n1 - n2 == 0) return 0;
else return 1;
}
}
void CMyListView::CallSort(int nSortCol, BOOL dftOrder)
{
CListCtrl* rList = &GetListCtrl();
LONG ws = GetWindowLong(rList->m_hWnd, GWL_STYLE);
int nSortOrder;
//若采用默认排序,用当前顺序//降序
//若点击列与当前排序列不同,则改变排序, 降序
//若相同, 更改增减序的排序方式.
//若点击列与当前排序列不同,则改变排序, 降序
//若点击列与当前列相同,若True,排序不变, false,改变
if(m_nCurSortCol != nSortCol)
{
// ws ^= LVS_SORTASCENDING;
ws &= ~LVS_SORTASCENDING;
nSortOrder = LVS_SORTDESCENDING;
m_nCurSortCol = nSortCol;
}
else
{
if(ws & LVS_SORTASCENDING)
{
if(!dftOrder)
{
//ws ^= LVS_SORTASCENDING;
ws &= ~LVS_SORTASCENDING;
nSortOrder = LVS_SORTDESCENDING;
}
else
{
nSortOrder = LVS_SORTASCENDING;
}
}
else
{
if(!dftOrder)
{
//ws ^= LVS_SORTDESCENDING;
ws &= ~LVS_SORTDESCENDING;
nSortOrder = LVS_SORTASCENDING;
}
else
{
nSortOrder = LVS_SORTDESCENDING;
}
}
}
ws |= nSortOrder;
SetWindowLong(rList->m_hWnd, GWL_STYLE, ws);//将当前的排序信息保存在窗口Style中
//将各item的lparam用新排序列的内容替换
LVITEM li;
li.mask = LVIF_PARAM | LVIF_TEXT;
TCHAR szItemText[1024];
for(int i=0; i<rList->GetItemCount(); i++)
{
li.iItem = i;
li.iSubItem = m_nCurSortCol;
li.cchTextMax = 1024;
li.pszText = szItemText;
rList->GetItem(&li);
TCHAR* szlparam = (TCHAR*)li.lParam;
//删除以前的信息, 释放空间
//添加list item时应注意将lParam初始化NULL
if(szlparam != NULL)
delete szlparam;
//复制当前列的szitemtext到item的lparam中
szlparam = new TCHAR[lstrlen(szItemText)+1];
lstrcpy(szlparam, szItemText);
rList->SetItemData(i, DWORD(szlparam));
}
rList->SortItems(ListViewCompareFunc, (LPARAM)(&nSortOrder));
}
void CMyListView::OnColumnClick(NMHDR* pNMHDR, LRESULT* pResult)
{
NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
CallSort(pNMListView->iSubItem);
*pResult = 0;
}
int CMyListCtrl::OnCompareItems(LPARAM lParam1, LPARAM lParam2, int iColumn)
{
CString strItem1, strItem2;
LVFINDINFO lvfi;
lvfi.flags = LVFI_PARAM;
lvfi.lParam = lParam1;
strItem1 = GetItemText(FindItem(&lvfi, -1), iColumn);
lvfi.lParam = lParam2;
strItem2 = GetItemText(FindItem(&lvfi, -1), iColumn);
//某些行需要按整数排列. 因为字符的话11在2前面。
/*
if(iColumn == 0)
{
int nItem1 = _ttoi(strItem1);
int nItem2 = _ttoi(strItem2);
if(nItem1 == nItem2)
return 0;
else
return (nItem1<nItem2 ? -1 : 1);
}
*/
int iSort = _tcsicmp(strItem1, strItem2);
return (iSort);
}
BOOL CMyListCtrl::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
int len = m_vFrozenCols.size();
if(len > 0)
{
HD_NOTIFY* pHDN = (HD_NOTIFY*)lParam;
switch(((NMHDR*)lParam)->code)
{
case HDN_BEGINTRACKW:
case HDN_BEGINTRACKA:
case HDN_DIVIDERDBLCLICKA:
case HDN_DIVIDERDBLCLICKW:
for(int i=0; i<len; i++)
{
if(pHDN->iItem == m_vFrozenCols[i]) //如果拖动的列是设定固定列宽的列之一
{
*pResult = TRUE;
return TRUE;
}
}
}
}
return CMFCListCtrl::OnNotify(wParam, lParam, pResult);
}
void CMyListCtrl::FreezeColumn(int col)
{
m_vFrozenCols.push_back(col);
}
- 1
- 2
前往页