您的位置:首页 > 其它

[置顶] CListCtrl控件列表项和列表头图标的显示

2017-09-19 14:19 661 查看
1、为CListCtrl控件绑定一个控件变量:m_List。

2、插入三个ICON作为列表项的图标显示,ID分别为:IDI_ICON1、IDI_ICON2、IDI_ICON3。插入两个Bitmap作为列表头图标的显示图标,ID分别为:IDB_BITMAP1、IDB_BITMAP2。

3、基本步骤都是:1、Create创建图像列表; 2、向图像列表里添加多个图标; 3、将CImageList对象绑定到CListCtrl控件或是CHeaderCtrl控件中; 4、插入列表项时,根据图标的索引插入图标。

具体代码:

首先变量声明:

public:
CListCtrl m_List;
CImageList m_imagelist;//定义列表项的图标列表
CImageList m_hbmpList;//定义列表头的图标列表
int m_nCol;          //当前带有图标列表头的索引
BOOL m_bOrder;       //根据true和false选择图标进行显示
afx_msg void OnColumnclickList(NMHDR *pNMHDR, LRESULT *pResult);
};


其次,初始化函数中显示列表项图标,并对列表头图标进行一些初始化操作:

BOOL C列表项和列表头图标添加Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog();

//......省略其它自动生成的代码

//初始化List控件表头

m_List.InsertColumn(0,"第一列",LVCFMT_CENTER,170,-1);
m_List.InsertColumn(1,"第二列",LVCFMT_CENTER,170,-1);
m_List.InsertColumn(2,"第三列",LVCFMT_CENTER,170,-1);

m_List.SetExtendedStyle(m_List.GetExtendedStyle()|LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);

//第一步:Create创建图像列表

m_imagelist.Create(16,16,ILC_COLOR32|ILC_MASK,3,3);

//第二步:向图像列表里添加多个图标

m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON1));
m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON2));
m_imagelist.Add(AfxGetApp()->LoadIcon(IDI_ICON3));

//第三步:将CImageList对象绑定到CListCtrl控件中

m_List.SetImageList(&m_imagelist,LVSIL_SMALL);

//第四步,插入列表项时,根据图标的索引插入图标

int nCount = m_List.GetItemCount();

m_List.InsertItem(nCount,"北京",nCount);

m_List.SetItemText(nCount,1,"上海");

m_List.SetItemText(nCount,2,"广州");

nCount = m_List.GetItemCount();

m_List.InsertItem(nCount,"深圳",nCount);

m_List.SetItemText(nCount,1,"天津");

m_List.SetItemText(nCount,2,"武汉");

nCount = m_List.GetItemCount();

m_List.InsertItem(nCount,"杭州",nCount);

m_List.SetItemText(nCount,1,"南京");

m_List.SetItemText(nCount,2,"成都");

/*====================================================*/

//第一步:Create创建图像列表
m_hbmpList.Create(16,16,ILC_COLOR32|ILC_MASK,2,2);

//第二步:加载两个位图
CBitmap b1,b2;
b1.LoadBitmap(IDB_BITMAP1);
b2.LoadBitmap(IDB_BITMAP2);

//第三步:将加载的位图添加到图像列表中,透明色指定白色
m_hbmpList.Add(&b1,RGB(255,255,255));
m_hbmpList.Add(&b2,RGB(255,255,255));

//第四步:将CImageList对象绑定到CHeaderCtrl控件中
CHeaderCtrl* pHeader = m_List.GetHeaderCtrl();
pHeader->SetImageList(&m_hbmpList);

m_nCol = -1;//初始时没有列表头带有图标

m_bOrder = FALSE;

return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}


对于列表头图标进行显示,还需为控件添加LVN_COLUMNCLICK消息:

//单击列表标题的响应函数
void C列表项和列表头图标添加Dlg::OnColumnclickList(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);

NM_LISTVIEW* pList = (NM_LISTVIEW*)pNMHDR;

int nCol = pList->iSubItem;//点击的是哪个子列,索引从0开始

int nImageIndex = 0;

CHeaderCtrl* pHeader = m_List.GetHeaderCtrl();

HDITEM hDi = {HDI_FORMAT|HDI_IMAGE};

if (nCol != m_nCol)
{
if (m_nCol > -1)//单击不同列时删除旧图标
{
pHeader->GetItem(m_nCol,&hDi);

hDi.fmt &= ~HDF_IMAGE;

pHeader->SetItem(m_nCol,&hDi);
}

//显示新图标

m_nCol = nCol;

pHeader->GetItem(m_nCol,&hDi);

hDi.fmt |= HDF_IMAGE;

hDi.iImage = 0;

pHeader->SetItem(m_nCol,&hDi);
}
else//否则单击相同列,取反显示
{
m_bOrder = !m_bOrder;

nImageIndex = (m_bOrder == FALSE ? 0:1);

pHeader->GetItem(nCol,&hDi);

hDi.fmt |= HDF_IMAGE;

hDi.iImage = nImageIndex;

pHeader->SetItem(nCol,&hDi);
}

*pResult = 0;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: