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

📄 sortlistviewctrl.h

📁 这是一本学习 window编程的很好的参考教材
💻 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 + -