CListCtrl控件列表项和列表头图标的显示

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;
}


猜你喜欢

转载自blog.csdn.net/u012372584/article/details/78029520
今日推荐