MFC ListCtrl控件任意列添加图片

首先,先将需要使用到的icon加入到资源文件(下图的IDI_ICON2和IDI_ICON3)。

MFC ListCtrl控件任意列添加图片_第1张图片

在dialog中新建一个ListCtrl,并且在Dlg.cpp中的DoDataExchange函数中进行绑定。

void CTestDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST, m_list);
}

这样准备工作就完了,接着在Dlg::OnInitDialog()中添加代码如下。

	//设置扩展样式,其中的LVS_EX_SUBITEMIMAGES没有的话没法在非第一列添加图片
	m_list.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_SUBITEMIMAGES | LVS_EX_FULLROWSELECT);
	//创建ImageList,其中前3个参数分别为x,y,位图颜色
	//如果图像出来的颜色不对可以试着改下第3项
	m_IconList.Create(120, 128, ILC_COLORDDB | ILC_MASK, 30, 30);
	//向ImageList添加图片
	m_IconList.Add(AfxGetApp()->LoadIcon(IDI_ICON2));
	m_IconList.Add(AfxGetApp()->LoadIcon(IDI_ICON3));
	//将ImageList设置到ListCtrl中
	m_list.SetImageList(&m_IconList, LVSIL_SMALL);
	//添加列
	m_list.InsertColumn(0, _T("第1列"), LVCFMT_CENTER, 125, 0);
	m_list.InsertColumn(1, _T("第2列"), LVCFMT_CENTER, 150, 1);
	m_list.InsertColumn(2, _T("第3列"), LVCFMT_CENTER, 120, 2);
	m_list.InsertColumn(3, _T("第4列"), LVCFMT_CENTER, 200, 3);
	//添加属性
	LV_ITEM lvitem;
	for (int i = 0; i < 2; i++) {
		//添加元素,设置第2列上的图片(虽然这里是第1列但下面会交换)
		memset((char *)&lvitem, '\0', sizeof(LV_ITEM));
		lvitem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE;
		lvitem.iItem = i; lvitem.iSubItem = 0; lvitem.iImage = i;
		//lvitem.pszText = _T("文字");
		m_list.InsertItem(&lvitem);
		//设置第1、3列
		m_list.SetItemText(i, 1, _T("one"));
		m_list.SetItemText(i, 2, _T("three"));
		//设置第4列
		memset((char *)&lvitem, '\0', sizeof(LV_ITEM));
		lvitem.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_STATE;
		lvitem.iItem = i; lvitem.iSubItem = 3; lvitem.iImage = 0;
		lvitem.pszText = _T("four");
		m_list.SetItem(&lvitem);
	}
	//获得HeadCtrl
	CHeaderCtrl *headerCtrl = m_list.GetHeaderCtrl();
	//获取当前顺序
	int cnt = headerCtrl->GetItemCount();
	LPINT order = (LPINT)malloc(cnt * sizeof(int));
	headerCtrl->GetOrderArray(order, cnt);
	//交换顺序
	int temp;
	temp = order[0];
	order[0] = order[1];
	order[1] = temp;
	//设置新顺序并释放
	headerCtrl->SetOrderArray(cnt, order);
	free(order);

效果如下图。

MFC ListCtrl控件任意列添加图片_第2张图片

由于第1列是绑定了ImageCtrl的,所以一定是会显示图片的。因此为了第1列不显示图片,需要利用HeadCtrl将第1列与第2列交换位置来实现仅仅使第2、4列显示图片而不在第1列显示图片。

这样的话,就可以在任意想要的列上添加图片了。

你可能感兴趣的:(c++)