我有一张bmp,是7个图标连在一起的图片,http://hiphotos.baidu.com/learnmfc/pic/item/3cddd84390caf90a9213c65d.jpg,
我想用imagelist获得这7个图标,并且显示在工具栏上,代码如下:
         CImageList cImageList;
CBitmap cBitmap;
BITMAP bmBitmap;

if (!cBitmap.Attach(LoadImage(AfxGetResourceHandle(), MAKEINTRESOURCE(IDB_BITMAP7),
  IMAGE_BITMAP, 0, 0,
  LR_DEFAULTSIZE|LR_CREATEDIBSECTION)) ||
    !cBitmap.GetBitmap(&bmBitmap))
{
return FALSE;
   TRACE("\n\nshit");
} CSize cSize(bmBitmap.bmWidth, bmBitmap.bmHeight); 
int nNbBtn = cSize.cx/48;

if (!cImageList.Create(48, cSize.cy, ILC_COLOR24|ILC_MASK, nNbBtn, 1))
return FALSE;

if (cImageList.Add(&cBitmap,RGB(0,0,0)) == -1)
return FALSE; cBitmap.Detach(); m_toolBar.CreateEx(this,TBSTYLE_FLAT); m_toolBar.SetButtons(arr,7);
//关联图像列表
m_toolBar.GetToolBarCtrl().SetImageList(&cImageList);
m_toolBar.SetSizes(CSize(60,60),CSize(48,cSize.cy));
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);现在的问题是,工具栏上是没有图片的,我也不知道怎么回事.
问题1:红色代码部分能不能把7个连在一起的图标分为7个图标,给cImageList【0】,cImageList【1】。。?如果不能该怎么做?如果是一张张图片分别给cImageList我会的,但是7个连在一起的图标(就1张bmp图片)怎么做就不知道了,谢谢大家。

解决方案 »

  1.   

    楼主 看你那个路径是JPG格式的额 不知道是不是为了给我们浏览上传故意转换的 如果是BMP的那应该是没问题的CImageList::CreateBOOL Create( int cx, int cy, UINT nFlags, int nInitial, int nGrow );
    BOOL Create( UINT nBitmapID, int cx, int nGrow, COLORREF crMask );
    BOOL Create( LPCTSTR lpszBitmapID, int cx, int nGrow, COLORREFcrMask );
    BOOL Create( CImageList& ImageList1, int nImage1, CImageList& ImageList2, int nImage2, int dx, int dy );返回值:如果成功,则返回非零值,否则为0。参数: cx 每个图象的尺寸,以像素为单位。  
    cy 每个图象的尺寸,以像素为单位。  
    nFlags 确定创建的图象列表类型。此参数可能为以下值的组合,但只能有一个ILC_COLOR值。 值 含义  
    ILC_COLOR 如果没有其它ILC_COLOR* 标记被确定,则使用缺省行为。典型地,缺省为ILC_COLOR4;但对于旧的显示驱动程序,缺省为ILC_COLORDDB  
    ILC_COLOR4 使用4位(16色)设备独立位图(DIB)部分作为图象列表的位图  
    ILC_COLOR8 使用8位DIB部分。彩色表格使用的颜色与半色调调色板的一样  
    ILC_COLOR16 使用16位(32/64K色)DIB部分  
    ILC_COLOR24 使用24位DIB部分  
    ILC_COLOR32 使用32位DIB部分  
    ILC_COLORDDB 使用设备独立位图  
    ILC_MASK 使用掩码。图象列表包含两个位图,其中一个是用做掩码的位图。如果不包括此值,图象列表只包含一个位图  
     
    nInitial 图象列表最初包含的图象数。  
    nGrow 当系统需要改变列表为新图象准备空间时,图象列表可生成的图象数。此参数替代改变的图象列表所能包含的新图象数。  
    nBitmapID 与图象列表联系的位图的源ID。  
    crMask 用于生成一个掩码的颜色。此指定的位图中的颜色的每个像素变为黑色,掩码中相应位设置为1。  
    lpszBitmapID 包含图象的源ID的字符串。  
    ImageList1 CImageList对象的参考。  
    nImage1 第一个存在的图象的索引。  
    ImageList2 CImageList对象的参考。  
    nImage2 第二个存在的图象的索引。  
    dx 每个图象的尺寸,用像素表示。  
    dy 每个图象的尺寸,用像素表示。  说明:
    需要两步构造一个CImageList。首先调用构造函数,然后调用Create,创建图象列表并附加给CImageList对象。请参阅:CImageList::CImageList, COLORREF 
      

  2.   

    其实我是怀疑这么写:
    if (!cImageList.Create(48, cSize.cy, ILC_COLOR24|ILC_MASK, nNbBtn, 1)) 
    return FALSE; if (cImageList.Add(&cBitmap,RGB(0,0,0)) == -1) 
    return FALSE; 能不能把7个连在一起的图标切割开来,分别给给cImageList【0】,cImageList【1】。。,因为网上的其他很多方法都是很烦的,我觉得这样比较简单,道理是也说的通,但是工具栏上什么也没显示,就不知道为什么了,请教大家了,谢谢。是bmp图片,上传到网上,自动转为jpg。
      

  3.   

    CImageList cImageList; <-这是一个局部对象。如果不调用Detach,工具栏的图像在cImageList对象析构时被删除。解决方法:......
    RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); cImageList.Detach(); <-加上这句。
      

  4.   

    crMask 用于生成一个掩码的颜色。此指定的位图中的颜色的每个像素变为黑色,掩码中相应位设置为1。
    请问一下,这句话是什么意思?
    cImageList.Add(&cBitmap,RGB(0,0,0)) 我的理解就是,把RGB所设定的颜色给设为透明,实际效果也是如此,但是msdn什么意思啊,哪有把它变为黑色啊,还有 掩码中相应位设置为1,怎么说的我很糊涂啊。这个到底什么意思?
      

  5.   

    还有,我把在基于对话框的编译成功的代码,放到基于多文档的程序中,结果工具栏上的图标呈现出一种浮雕的效果,很奇怪,而且无法点击,大家能帮我看一下吗?
    http://oryx.5d6d.com/viewthread.php?tid=34&extra=page%3D1&frombbs=1