首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

ListControl 中Header头三角怎么实现

2013-01-07 
ListControl 中Header头三角如何实现参考http://blog.csdn.net/Joany_yang/article/details/1640448中提出

ListControl 中Header头三角如何实现
参考http://blog.csdn.net/Joany_yang/article/details/1640448中提出的:


[解决办法]
    CImageList *ImgHeaders = new CImageList;
    ImgHeaders->Create(16,16,ILC_MASK,1,1);
    ImgHeaders->Add(AfxGetApp()->LoadIcon(IDI_UP));
    ImgHeaders->Add(AfxGetApp()->LoadIcon(IDI_DOWN));
    m_HeaderCtrl->SetImageList(ImgHeaders);
//兄弟,一定要注意释放资源!!!!!!!!!!!!!!
ImgHeaders->Detach();//经验告诉我,脱离掉才能显示出图片来!
ImgHeaders->DeleteImageList();
//不需要了就加个delete ImgHeaders
    HDITEM hdrItem;
    m_HeaderCtrl->GetItem(0, & hdrItem);
    hdrItem.mask = HDI_FORMAT 
[解决办法]
 HDI_IMAGE;
    hdrItem.iImage = 0; //index of up/down bitmap
    CHeaderCtrl xyz;
    m_HeaderCtrl->SetItem(0,&hdrItem);
[解决办法]
你喜欢New一个object出来,还得要随时删除。
CHeaderCtrl* m_HeaderCtrl=new CHeaderCtrl;
不如改为:
CHeaderCtrl *m_HeaderCtrl= m_ListCtrl.GetHeaderCtrl();
试了试,CHeaderCtrl->SetItem(Column,&Hditem)加载图标。
似乎HDITEM .mask = HDI_IMAGE 
[解决办法]
 HDI_FORMAT 
[解决办法]
 HDI_TEXT更容易成功
我的代码如下:
void CMyDlg::OnLvnColumnclickList1(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
// TODO: 在此添加控件通知处理程序代码

/* 若当前排序列与点击列相同,则更改增、减序的排序方式。


若点击列与当前排序列不同的列,则改变排序序,并将排序方式改为增序。*/
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);
};

热点排行