`
suoyihen
  • 浏览: 1362397 次
文章分类
社区版块
存档分类
最新评论

ListCtrl使用ImageList插入BMP文件

 
阅读更多

今天在论坛上面看到一个帖子,楼主使用ImageList添加BMP文件,然后在ListCtrl中使用,代码如下:

  1: CImageList* m_imagelist;
  2: m_imagelist = new CImageList();
  3: m_imagelist->Create(32, 32, ILC_COLOR32, 0, 4);
  4: HBITMAP hBitmap;
  5: CBitmap *pBitmap;
  6: CString FilePathName = "D://测试//4.BMP";
  7: pBitmap = new   CBitmap;
  8: //从文件导入位图
  9: hBitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),FilePathName,
 10:     IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
 11: pBitmap->Attach(hBitmap);
 12: m_imagelist->Add(pBitmap, RGB(0,0,0));
 13: 
 14: m_list.SetImageList(m_imagelist,LVSIL_STATE);

看上去没有什么问题,于是我自己建了一个工程,把代码拷上去测试,发现确实不行,没办法,我开始检查一行行代码,先看Create函数,查看MSDN,上面的解释也没有很特别的地方,再看CBitmap加载BMP文件的过程,也没有问题,ImageList::Add函数使用似乎也是对的,接着看m_list.SetImageList(m_imagelist,LVSIL_STATE);发现后面MSDN的原型:

CListCtrl::SetImageList

This method assigns an image list to a list view control.

CImageList* SetImageList( 
CImageList* pImageList, 
int nImageListType ); 
Parameters
pImageList
Specifies the pointer to the image list to assign.
nImageListType
Specifies the type of image list. It can be one of these values:
  • LVSIL_NORMAL Image list with large icons.
  • LVSIL_SMALL Image list with small icons.
  • LVSIL_STATE Image list with state images.
Return Value

A pointer to the previous image list.

看上去也没有什么问题,但是我不死心,就一个个参数设置,发现用LVSIL_NORMAL效果确实不同,但是BMP还是没有显示,同时我发现Add后,ImageList::GetImageCount的返回值居然还是0!看来是加载没成功,没办法了,只有拿出最后的杀手锏google了。

在众多结果中找呀找,发现了我干兴趣的http://tc.0728.org/News/145181.html,这个上面有人提到也Create时的尺寸有关系,尺寸必须与加载的BMP完全一样,我一看,我用的是30*30的,确实不一样,改了后发现Add后,ImageList::GetImageCount为1了!看来现在BMP已经加载进了ImageList里面,但是一运行程序,发现函数没有显示。后面我又改变CListCtrl::SetImageList的第二个参数,发现改成LVSIL_SMALL后BMP能正常显示了。我的代码如下:

  1: m_imagelist = new CImageList();
  2: m_imagelist->Create(30,30,ILC_COLOR32,0,4);
  3: 
  4: HBITMAP hBitmap;
  5: CBitmap *pBitmap;
  6: CString FilePathName = "D://face.bmp";   //在资源的IDB_BITMAP1文件就是face.bmp导入的
  7: pBitmap = new   CBitmap;
  8: //从文件导入位图
  9: hBitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),FilePathName,
 10:                IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
 11: pBitmap->Attach(hBitmap);
 12: m_imagelist->Add(pBitmap, RGB(0,0,0));
 13: 
 14: if (m_imagelist->GetImageCount() == 0)
 15: {
 16:   CString strMsg;
 17:   strMsg.Format("加入BMP失败!%d", GetLastError());
 18:   AfxMessageBox(strMsg);
 19: }
 20: 
 21: m_list.SetImageList(m_imagelist,LVSIL_SMALL );
 22: int Item = m_list.InsertItem(0, "2010-11-05", 0);

唉!不容易呀,虽然最后BMP可以显示了,但是我心里面也出现了好多不理解的地方,为什么SetImageList后面的参数不一样BMP不会正常显示呢?难道是我的用法不对?为什么ImageList::Create的尺寸设置会导致ImageList::Add添加不进去呢?在MSDN上为什么没有针对的说明呢?希望对这个比较了解的朋友能为我解惑,谢了!

最后附上我测试程序的下载http://download.csdn.net/source/3249605

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics