資源簡介
MFC.
1. 自定義CMyListView,繼承自CListView, 實現(xiàn)點擊表頭進(jìn)行該列排序以及固定某些列寬的功能。使用時直接繼承此View即可。
2. 自定義CMyListCtrl, 繼承自CMFCListCtrl, 同樣實現(xiàn)上述功能,用于listctrl控件。使用時,將控件的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ù)據(jù)時需根據(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])?//如果拖動的列是設(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;//得到兩個列的排序信息
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;
//若采用默認(rèn)排序,用當(dāng)前順序//降序
//若點擊列與當(dāng)前排序列不同,則改變排序,?降序
//若相同,?更改增減序的排序方式.?
//若點擊列與當(dāng)前排序列不同,則改變排序,?降序
//若點擊列與當(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
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????5702??2013-10-21?14:37??MyListView.cpp
?????文件???????1566??2013-10-21?14:38??MyListView.h
-----------?---------??----------?-----??----
?????????????????7268????????????????????2
- 上一篇:銀行叫號系統(tǒng)模擬C語言
- 下一篇:EEPROM的C語言控制程序
評論
共有 條評論