前幾天做一個聊天程序時在實現用戶列表時用到了CListCtrl控件,突然想在每列前面加上一個圖標或圖片。然而能實現ICON圖標加載,卻不能顯示圖片。今天終於找到原因了,主要原因是局部對象問題。
先看代碼實現:
- void CMyListView::OnInitialUpdate()
- {
- CListView::OnInitialUpdate();
- //創建ListCtrl
- m_ListCtrl.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT|LVS_EDITLABELS,
- CRect(0,0,400,200),
- this, 0);
- //設置ListCtrl的風格
- m_ListCtrl.SetExtendedStyle(m_ListCtrl.GetExtendedStyle()|
- LVS_EX_SUBITEMIMAGES );
- //------加載位圖;
- Bitmap[0].LoadBitmap(IDB_BITMAP1);
- Bitmap[1].LoadBitmap(IDB_BITMAP2);
- Bitmap[2].LoadBitmap(IDB_BITMAP3);
- Bitmap[3].LoadBitmap(IDB_BITMAP4);
- //Ⅰ.將位圖添加到ImageList裏面
- m_Imagelist.Create(24, 24,ILC_COLOR4|ILC_MASK, 4, 4); //----- 實例圖象框;
- for (int i = 0 ; i < 4 ; i ++)
- {
- m_Imagelist.Add(&Bitmap[i], RGB(0, 0, 0));
- }
- //Ⅱ.將ImageList和ListCtrl關聯,關鍵之二
- m_ListCtrl.SetImageList(&m_Imagelist,LVSIL_SMALL);
- //3、初始化列表表頭
- m_ListCtrl.InsertColumn(0,_T("T1"),LVCFMT_LEFT,80);
- m_ListCtrl.InsertColumn(1,_T("A1"),LVCFMT_LEFT,32);
- m_ListCtrl.InsertColumn(2,_T("A2"),LVCFMT_LEFT,32);
- //4、listctrl 創建數據--
- CString str;
- for(int j = 0;j < 4 ;j ++)
- {
- m_ListCtrl.InsertItem(j,NULL,1);
- LVITEM item; //Item結構,很全的東西
- item.iItem = j; //Item索引
- item.iSubItem = 0; //SubItem索引
- //Ⅲ.設定顯示的格式
- item.mask = LVIF_IMAGE|LVIF_TEXT; //顯示文本和圖片
- //Ⅳ.設定對應圖片的索引值
- item.iImage = j; //圖片索引值
- item.pszText = _T("Virqin"); //在當前Item要顯示的文本
- m_ListCtrl.SetItem(&item); //設定Item
- }
- }
以上代碼就能實現在列表第一列顯示圖片,共四行,以及圖片後面跟着文字"Virqin"。現在要說的倒不是它實現後的效果,說說我遇到的問題吧,最初我把Bitmap和m_ImageList兩個對象都是在當前函數裏定義的,因爲是局部變量,當本函數執行完後對象就會被析構,所以圖像列表和位圖都被析構了。
我總結一下出現我這樣問題的根本原因還是對C++的對象意識不深,理解太膚淺。