首先,先將需要使用到的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列顯示圖片。
這樣的話,就可以在任意想要的列上添加圖片了。