上篇博文中,寫了一遍關於ListCtrl控件的基本用法和引用兩個重繪類進行一些美化。
今天的項目中,需要用到在控件中插入圖標作爲狀態顯示用,於是網上查找了一些資料,將方法記錄下來:
先看效果圖:
圖片沒有找到好看的大家見諒,實現的功能是根據運行狀態,顯示不同的圖標表示運行狀態和停止狀態兩種。
實施方法如下:
首先是添加一個listCtrl控件和添加變量,這就不說了。
1、然後在XXXDlg.h頭文件中定義一個變量:CImageList m_IconList;
2、在XXXDlg.cpp的OnInitDialog()函數中,添加以下代碼:
//添加圖標
m_IconList.Create(25,25,1,10,4);
m_IconList.Add(AfxGetApp()->LoadIcon(IDI_ICON2));
m_IconList.Add(AfxGetApp()->LoadIcon(IDI_ICON1));
m_list.SetImageList(&m_IconList,LVSIL_SMALL);
CRect rt;
GetClientRect(&rt);
m_list.InsertColumn(0,_T("序號"),LVCFMT_LEFT,rt.Width()/8);
m_list.InsertColumn(1,_T("IEDName"),LVCFMT_LEFT,rt.Width()/5);
m_list.InsertColumn(2,_T("IP"),LVCFMT_LEFT,rt.Width()/5);
m_list.InsertColumn(3,_T("註釋"),LVCFMT_LEFT,rt.Width()/4);
m_list.InsertColumn(4,_T("網卡"),LVCFMT_LEFT,rt.Width()/5);
m_list.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT |
LVS_EDITLABELS| LVS_EX_SUBITEMIMAGES ); //一定要設置LVS_EX_SUBITEMIMAGES
注意:第一、m_list.SetImageList(&m_IconList,LVSIL_SMALL)的時候,後面必須選LVSIL_SMALL類型,否則顯示不出來。第二,圖片用的是ICON類型,m_IconList.Create(25,25,1,10,4);前兩個參數是顯示的圖標大小,可以自己隨意設置,可不受原圖標的實際像素的限制。第三、就是類型設置的時候,需要添加LVS_EX_SUBITEMIMAGES
3、添加List數據
//輸出list數據
void CIPSetDlg::ShowList()
{
m_list.DeleteAllItems();
CString strindex;
for (int i=0;i<m_ListVec.size();i++)
{
strindex.Format(" %d",m_ListVec[i].index);
LV_ITEM lvitem;
memset((char *)&lvitem,'\0',sizeof(LV_ITEM));
lvitem.mask=LVIF_TEXT|LVIF_IMAGE|LVIF_STATE;
lvitem.iItem=i;
lvitem.iSubItem=0;
lvitem.stateMask=0;
lvitem.iImage=m_ListVec[i].RunState; //控制調用的圖片
lvitem.pszText=strindex.GetBuffer(0);
int iDX=m_list.InsertItem(&lvitem);
//給其他列設置圖標,2爲列數,1爲圖標
// m_list.SetItem(iDX,2,LVIF_IMAGE,NULL,1,0,0,0);
m_list.SetItemText(i,1,m_ListVec[i].IEDName);
m_list.SetItemText(i,2,m_ListVec[i].IP);
m_list.SetItemText(i,3,m_ListVec[i].Desc);
m_list.SetItemText(i,4,m_ListVec[i].Adapter);
}
}
至此,就完成了圖標的添加,網上說了很多,有些還是有些誤導,以上經過實用沒有問題。