ListControl 中Header头三角如何实现
参考http://blog.csdn.net/Joany_yang/article/details/1640448中提出的:
若点击列与当前排序列不同的列,则改变排序序,并将排序方式改为增序。*/
enum { sizeOfBuffer = 256 };
TCHAR lpBuffer[sizeOfBuffer];
HDITEM hdi;
hdi.pszText = lpBuffer;
hdi.cchTextMax = sizeOfBuffer;
CHeaderCtrl *pHdCtrl = m_ListCtrl.GetHeaderCtrl();
int count = pHdCtrl->GetItemCount();
for (int i=0; i < count; i++)
{
hdi.mask = HDI_TEXT
[解决办法]
HDI_IMAGE;
pHdCtrl->GetItem(i, &hdi);
if (i == pNMLV->iSubItem)//当前所选列
{
hdi.iImage = (hdi.iImage+1) %2;
nSortOrder = hdi.iImage==0?1:-1;//nSortOrder -1为降序,1表示升序。
}
else
if (hdi.iImage==-1)
continue;
else
hdi.iImage=-1;//-1为无图标
hdi.mask = HDI_IMAGE
[解决办法]
HDI_FORMAT
[解决办法]
HDI_TEXT/*
[解决办法]
HDI_WIDTH*/;
hdi.fmt = HDF_LEFT
[解决办法]
HDF_IMAGE
[解决办法]
HDF_STRING;
pHdCtrl->SetItem( i, &hdi );
}
Item mItem;
mItem.mlist = &m_ListCtrl;
mItem.Isub = pNMLV->iSubItem;
for(int i=0;i < m_ListCtrl.GetItemCount();i++)
{
m_ListCtrl.SetItemData(i,i);
}
m_ListCtrl.SortItems(CompareFunc,(LPARAM)&mItem);
*pResult = 0;
}
// CMyDlg.h : 头文件
//
#pragma once
#include "resource.h"
typedef struct _Item
{
CListCtrl *mlist;
int Isub; //排序列
}Item;
static int nSortOrder=1; // 排序的方式,1升序,-1降序。
// CTpsOpDbDlg 对话框
class CTpsOpDbDlg : public CPropertyPage
{
DECLARE_DYNAMIC(CTpsOpDbDlg)
// 构造
public:
CTpsOpDbDlg(CWnd* pParent = NULL);// 标准构造函数
// 对话框数据
enum { IDD = IDD_TPSOPDB_DIALOG };
protected:
virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
DECLARE_MESSAGE_MAP()
public:
int citem;
CString ActiveID;
CListCtrl m_ListCtrl;
//排序的回调函数如下:
static int CALLBACK CompareFunc(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
// 得到排序方式
Item* pV=(Item*)lParamSort;
// 需要的排序参数比较
CString sz1 = pV->mlist->GetItemText(lParam1,pV->Isub);
CString sz2 = pV->mlist->GetItemText(lParam2,pV->Isub);
if(nSortOrder == 1)
return sz1.Compare(sz2);
else
return -sz1.Compare(sz2);
}
afx_msg void OnLvnColumnclickList1(NMHDR *pNMHDR, LRESULT *pResult);
};