1. 程式人生 > >CListCtrl控制元件列表項和列表頭圖示的顯示

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