[转]向CimageList中加入位图

在MFC中CImageList类封装了图象列表控件的功能,图象列表控件是相同大小图象的一个集合,用于应用程序中大规模图标的存储,该控件是不可见控件,通常与其它控件一起使用,来为其它控件提供图标资源。图象的每个集合中均以0为图象索引基数,可以把这些图标看成是以数组方式存储的,图像列表通常由大图标或位图构成,其中包含位图模式,实际上,所有的在同一个图象列表中的图标都被存储在一个屏幕设备的位图中。

通常向CImageList对象中添加图像元素的方法是:首先把图标或位图调入资源文件中,然后调用CImageList:Add方法加入到图象列表控件中,将位图装入资源导致可执行文件增大,不利于软件发行,而且只能使用资源中有限的位图,无法选取其它位图。要弥补使用资源位图的不足,就必须直接使用BMP位图文件。

使用下列代码即可实现:

HBITMAP hBitmap;

CBitmap *pBitmap;

CImageList *pImageList;

pImageList=new CImageList;

pImageList->Create (32,32,ILC_COLOR4,5,2);

pBitmap=new  CBitmap;

hBitmap=(HBITMAP)LoadImage(NULL,FilePathName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);//FilePathName 是位图文件完整路径字符串

pBitmap->Attach (hBitmap);

pImageList->Add (pBitmap,RGB(0,0,0));

下面结合一个实例详细说明的用法:

例程解析:

例程基于一个对话框,单击对话框中的‘添加bmp’按钮弹出文件选择框,选择一个bmp文件,即可把选种bmp文件加入到列表控件中。在MFC中,CLIstCtrl类封装了列表控件,主要用来以各种方式显示一组数据记录供用户进行各种操作,列表中的记录可以包括多个数据项,也可以包括表示数据内容的大小图标,用来表示数据记录的各种属性,Windows资源管理器的右侧框架就是一个非常典型的列表控件。

      新建MFC AppWiazrd[exe]工程,工程名称

ImageListAddBmp,点OK,选中Dialog based 点下一步,剩下的几步用缺省值,一直按下一步直到完成,工程建立完毕。按以下步骤设置几个变量,填写事件代码:

 

1. 在IDD_IMAGELISTADDBMP_DIALOG对话框中加入ClistCtrl控件和一个按纽,按纽Caption为“添加bmp”。

2. 使用类向导添加CtrlList控件变量m_ListCtrl。

3. 在CimageListAddBmpDlg类中添加下面两个公用变量:
int index;
CImageList *pImageList;

4. 在BOOL CImageListAddBmpDlg::OnInitDialog()初始化函数中,
// TODO: Add extra initialization here

语句后面添加以下代码
  index=0;
  pImageList=new CImageList;
  pImageList->Create (32,32,ILC_COLOR4,5,2);
  m_ListCtrl.SetImageList (pImageList,LVSIL_NORMAL );

 

5. 在IDD_IMAGELISTADDBMP_DIALOG对话框中双击‘添加bmp’按钮,加入Onbutton1单击事件代码:
void CImageListAddBmpDlg::OnButton1() 
{
// TODO: Add your control notification handler code here
  CString  FilePathName,FileName;
 CFileDialog dlg(TRUE);///TRUE为OPEN对话框,FALSE为SAVE AS对话框
 if(dlg.DoModal()==IDOK)
  {
    FilePathName=dlg.GetPathName();
    HBITMAP hBitmap;
    CBitmap *pBitmap;
    pBitmap=new CBitmap;
  hBitmap=(HBITMAP)LoadImage(NULL,FilePathName,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
    pBitmap->Attach (hBitmap);
    pImageList->Add (pBitmap,RGB(0,0,0));
    FileName=dlg.GetFileName ();
    m_ListCtrl.InsertItem (index,FileName,index);
    index++;
  }
}

到这里你可以编译运行了,在VC6.0下编译通过。

posted on 2012-09-17 10:35  龙猫先生  阅读(224)  评论(0编辑  收藏  举报

导航