CListCtrl控制元件列表項和列表頭圖示的顯示
阿新 • • 發佈:2019-02-01
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; }