CListCtrlEx是基于CListCtrl,有关代码如下 void CListCtrlEx::AddItem(short i, char* name, char* text) 

LVITEM lvi; lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM; 
lvi.iItem = GetItemCount(); 
    lvi.iImage = i; 
lvi.iSubItem = 0; 
lvi.pszText = name; 
lvi.cchTextMax = 64; 
lvi.lParam = 0; 
InsertItem(&lvi); lvi.mask = LVIF_TEXT; 
lvi.pszText = text; 
lvi.cchTextMax = 32; 
lvi.iSubItem = 1; 
SetItem(&lvi); 
}然后在dlgBar对话框中放入列表控件m_olist。并在CMainFrame中调用m_olist代码如下: 
void CMainFrame::OnAddMember(WPARAM wParam, LPARAM lParam) 

CImageList m_imgList;
 m_imgList.Create ( 48, 48, ILC_COLOR16 | ILC_MASK, 4, 1 );
m_imgList.Add (HICON(::LoadImage (AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON1),
                              IMAGE_ICON, 48, 48, LR_DEFAULTCOLOR )));
 this->dlgBar.m_olist.SetImageList ( &m_imgList, LVSIL_SMALL );
CString* pStr = (CString*)wParam; //用来接收用户名的消息
this->dlgBar.m_olist.AddItem((short)lParam, pStr->GetBuffer(0), NULL); 
pStr->ReleaseBuffer(); } 
运行程序,结果图标没显示,只空出显示图标的位置。请高手指点。谢谢!!

解决方案 »

  1.   

    CImageList m_imgList;
     m_imgList.Create ( 48, 48, ILC_COLOR16 | ILC_MASK, 4, 1 );
    m_imgList.Add (HICON(::LoadImage (AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON1),
                                  IMAGE_ICON, 48, 48, LR_DEFAULTCOLOR )));
    ===CImageList m_imgList不能是临时变量。也就是说,它的生命期不能比m_olist短。因为m_olist只是记录这个m_imgList的一个引用类型,没有进行复制。如果你的m_imgList先无效,自然就不行了。因此,把m_imgList定义为成员变量是最合理的方式。
      

  2.   

    把m_imgList;换成类成员变量,加载一次就够了,不用每次都加载
      

  3.   

    CImageList m_imgList;
    这种局部变量,函数一退出就 Over 了;
    改成 CMainFrame 的成员变量即可。
      

  4.   

     CImageList m_imgList;
     定义出你的成员变量,而不是局部变量,不然局部变量析构了,你的图标就没了
      

  5.   

    谢谢各位,我在public定义CImageList m_imgList; 还是不行啊?
      

  6.   

    void CMainFrame::OnAddMember(WPARAM wParam, LPARAM lParam) 

        CImageList m_imgList;
     m_imgList.Create ( 48, 48, ILC_COLOR16 | ILC_MASK, 4, 1 );
    m_imgList.Add (HICON(::LoadImage (AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON1),
                                  IMAGE_ICON, 48, 48, LR_DEFAULTCOLOR )));
     this->dlgBar.m_olist.SetImageList ( &m_imgList, LVSIL_SMALL );
    CString* pStr = (CString*)wParam; //用来接收用户名的消息
    this->dlgBar.m_olist.AddItem((short)lParam, pStr->GetBuffer(0), NULL); 
    pStr->ReleaseBuffer(); } 
    ======
    首先将CImageList m_imgList放到CMainFrame的头文件中定义;
    其次将
    m_imgList.Create ( 48, 48, ILC_COLOR16 | ILC_MASK, 4, 1 );
    m_imgList.Add (HICON(::LoadImage (AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON1),
                                  IMAGE_ICON, 48, 48, LR_DEFAULTCOLOR )));
     this->dlgBar.m_olist.SetImageList ( &m_imgList, LVSIL_SMALL );
    放到CMainFrame的OnCreate函数中,可以放到函数的末尾,保证对象都已经创建完成。
    本函数中只保留最后三句。
      

  7.   

    另外就是你用LVSIL_SMALL ,那么你必须确定你这个图标有小图标,而不仅仅是大图标。
      

  8.   

    不是就IDI_ICON1这个图标吗?怎么还有大小之分?
      

  9.   

    我说的你都照做了吗?图标是否正确啊?你需要48*48的图标么?
    m_imgList.Add (HICON(::LoadImage (AfxGetResourceHandle(), MAKEINTRESOURCE(IDI_ICON1), 
                                  IMAGE_ICON, 48, 48, LR_DEFAULTCOLOR ))); 
    不要这么写。把LoadImage单独写成一行。获取返回值,看一下有没有Load成功啊。你得学会调试啊。靠我们来猜帮你解决问题么
      

  10.   

    算了happyparrot ,我能不能把CListCtrlEx文件发给你,你帮我调试一下?如果行的话,麻烦你把你的邮箱发给我。谢谢!!