前几天做一个聊天程序时在实现用户列表时用到了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++的对象意识不深,理解太肤浅。