資源簡(jiǎn)介
MFC.
1. 自定義CMyListView,繼承自CListView, 實(shí)現(xiàn)點(diǎn)擊表頭進(jìn)行該列排序以及固定某些列寬的功能。使用時(shí)直接繼承此View即可。
2. 自定義CMyListCtrl, 繼承自CMFCListCtrl, 同樣實(shí)現(xiàn)上述功能,用于listctrl控件。使用時(shí),將控件的control變量更改為CMyListCtrl即可。

代碼片段和文件信息
#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時(shí)注意,?插入數(shù)據(jù)時(shí)需根據(jù)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 {
if(pHDN->iItem?==?m_vFrozenCols[i])?//如果拖動(dòng)的列是設(shè)定固定列寬的列之一
{
*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;//得到兩個(gè)列的排序信息
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;//得到兩個(gè)列的排序信息
int?n1?=?_ttoi(sz1);//??不用單獨(dú)提出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;
//若采用默認(rèn)排序,用當(dāng)前順序//降序
//若點(diǎn)擊列與當(dāng)前排序列不同,則改變排序,?降序
//若相同,?更改增減序的排序方式.?
//若點(diǎn)擊列與當(dāng)前排序列不同,則改變排序,?降序
//若點(diǎn)擊列與當(dāng)前列相同,若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
{
nSor
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件???????5702??2013-10-21?14:37??MyListView.cpp
?????文件???????1566??2013-10-21?14:38??MyListView.h
-----------?---------??----------?-----??----
?????????????????7268????????????????????2
評(píng)論
共有 條評(píng)論