首先,先将需要使用到的icon加入到资源文件(下图的IDI_ICON2和IDI_ICON3)。
在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);
效果如下图。
由于第1列是绑定了ImageCtrl的,所以一定是会显示图片的。因此为了第1列不显示图片,需要利用HeadCtrl将第1列与第2列交换位置来实现仅仅使第2、4列显示图片而不在第1列显示图片。
这样的话,就可以在任意想要的列上添加图片了。