• 大小: 3KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-23
  • 语言: C/C++
  • 标签: MFC  ListView  

资源简介

MFC. 1. 自定义CMyListView,继承自CListView, 实现点击表头进行该列排序以及固定某些列宽的功能。使用时直接继承此View即可。 2. 自定义CMyListCtrl, 继承自CMFCListCtrl, 同样实现上述功能,用于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时注意, 插入数据时需根据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]) //如果拖动的列是设定固定列宽的列之一
{
*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
{
nSor

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       5702  2013-10-21 14:37  MyListView.cpp

     文件       1566  2013-10-21 14:38  MyListView.h

----------- ---------  ---------- -----  ----

                 7268                    2


评论

共有 条评论