📄 sortlistviewctrl.h
字号:
#ifndef _SORTLISTVIEWCTRL_H
#define _SORTLISTVIEWCTRL_H
// CSortListViewCtrl Version 1.0
//
// Author: Gilad Novik (gilad_no@tmicha.net)
//
// Permission is granted to anyone to use this code for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, without any restrictions.
//
///////////////////////////////////////////////////////////////////////////////
template<class T>
class CSortListViewCtrlItem
{
public:
int Compare(T* Item,int nField) // Comparison function. You must override it
{
ATLASSERT(FALSE);
return 0;
}
};
template <class T>
class CSortListViewCtrl : public CWindowImpl<CSortListViewCtrl ,CListViewCtrl >
{
public:
enum Direction // Direction for sorting
{
Descending = -1,
None = 0,
Ascending = 1
};
CSortListViewCtrl() : m_nColumn(-1) , m_nDirection(None)
{
BOOL bFreeLibrary=FALSE;
HINSTANCE hInstance=::GetModuleHandle(_T("shell32.dll"));
if (!hInstance) //If you don't link to shell32, we need to load it using LoadLibrary
{
hInstance=::LoadLibrary(_T("shell32.dll"));
bFreeLibrary=TRUE;
}
ATLASSERT(hInstance);
if (hInstance)
{ // Load bitmaps from shell32.dll
m_Up.Attach((HBITMAP)::LoadImage(hInstance,MAKEINTRESOURCE(133),IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS));
m_Down.Attach((HBITMAP)::LoadImage(hInstance,MAKEINTRESOURCE(134),IMAGE_BITMAP,0,0,LR_LOADMAP3DCOLORS));
if (bFreeLibrary)
::FreeLibrary(hInstance);
}
}
BEGIN_MSG_MAP(CSortListViewCtrl)
//REFLECTED_NOTIFY_CODE_HANDLER(LVN_DELETEITEM, OnDeleteItem)
REFLECTED_NOTIFY_CODE_HANDLER(LVN_COLUMNCLICK , OnColumnClick)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
//LRESULT OnDeleteItem(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/)
//{
// LPNMLISTVIEW pnmv=(LPNMLISTVIEW)pnmh;
// //T* pItem=(T*)GetItemData(pnmv->iItem);
// //ATLASSERT(pItem);
// //if (pItem) // Delete attached structure
// // delete pItem;
// return 0;
//}
LRESULT OnColumnClick(int /*idCtrl*/, LPNMHDR pnmh, BOOL& /*bHandled*/)
{
LPNMLISTVIEW pnmv=(LPNMLISTVIEW)pnmh;
Sort(pnmv->iSubItem,m_nColumn==pnmv->iSubItem ? -m_nDirection : Ascending); // Sort the list
return 0;
}
void Sort(int nColumn,int nDirection=Ascending)
{
if (m_nColumn>=0 && m_nColumn!=nColumn)
SetColumnBitmap(m_nColumn,None); // Clear last arrow
SetColumnBitmap(m_nColumn=nColumn,m_nDirection=nDirection); // Draw new arrow
SortItems(CompareFunc,MAKELPARAM(m_nColumn,m_nDirection)); // Sort items on list
}
CSortListViewCtrl& operator=(HWND hWnd)
{ // Subclass to our control
SubclassWindow(hWnd);
return *this;
}
protected:
static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
T Item1=(T)lParam1;
T Item2=(T)lParam2;
switch (HIWORD(lParamSort))
{
case (WORD)Ascending:
return Item1.Compare(&Item2,LOWORD(lParamSort));
break;
case (WORD)Descending:
return Item2.Compare(&Item1,LOWORD(lParamSort));
break;
}
return 0;
}
void SetColumnBitmap(int nColumn,int nDirection)
{
CHeaderCtrl Header(GetHeader());
HDITEM Item;
Item.mask=HDI_FORMAT;
Header.GetItem(nColumn,&Item);
if (nDirection!=None)
{
Item.mask|=HDI_BITMAP;
Item.fmt|=HDF_BITMAP|HDF_BITMAP_ON_RIGHT;
HBITMAP Bitmap[]={m_Down,NULL,m_Up};
Item.hbm=Bitmap[nDirection+1];
}
else
Item.fmt&=~(HDF_BITMAP|HDF_BITMAP_ON_RIGHT); // Remove bitmap properties from header
Header.SetItem(nColumn,&Item);
}
int m_nColumn;
int m_nDirection;
CBitmap m_Up,m_Down;
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -