多次调用如下函数(大约在600次以上)
void CStencilBar::ImageListAdd(CImageList *plist,CString csImageAddress)
{
HBITMAP hBitmap; CBitmap *pBitmap; pBitmap=new  CBitmap;
else{
hBitmap=(HBITMAP)LoadImage(NULL,csImageAddress,IMAGE_BITMAP,32,32,LR_LOADFROMFILE);//csImageAddress是位图文件完整路径字符串
}
pBitmap->Attach (hBitmap); RGBTRIPLE* rgb  = (RGBTRIPLE*)(pBitmap); COLORREF rgbMask = RGB(rgb[0].rgbtRed, rgb[0].rgbtGreen, rgb[0].rgbtBlue); int iret = plist.Add (pBitmap,rgbMask); delete(pBitmap);
}会出现plist中加入位图失败的现象,具体检查发现:位图路径没有错误,得到的句柄也不是null的
pBitmap也不是Null的,就是无法加入到CimageList中。我曾经尝试过观察plist.Add后返回的索引,发现add前和add后的imagelist中位图数量没有增加。并且每次出现问题的位图都不同难道是loadimage API的问题????

解决方案 »

  1.   

    还是不行,我在delete(pBitmap);
    之前调用了pBitmap->Detach();
      

  2.   

    会不会是系统资源耗尽了?windows能容纳的各种资源都是有限的,有可能是添加了太多的imagelist
      

  3.   

    plist.Add(CDC::FromHandle(hBitma), rgbMask);
      

  4.   

    Before add a bitmap into Imagelist, the Imagelist should be first created.
      

  5.   

    mynamelj(隐姓埋名,从此绝迹在互联网之上) 
    你的方法无法编译通过yjgx007(who's superior) 
    我相信之前我已经create了,否则一个image也加不进去
      

  6.   

    关于设置颜色遮罩的地方我改了一下,你可以改回你的。
    主要是这里不需要new CBitmap对象指针。
    我做了1000次调用测试,正常。void CTestDlgDlg::ImageListAdd(CImageList *plist,CString csImageAddress)
    {
    HBITMAP hBitmap = (HBITMAP)::LoadImage(NULL, csImageAddress,IMAGE_BITMAP,32,32,LR_LOADFROMFILE);//csImageAddress是位图文件完整路径字符串
    CBitmap bmp;
    bmp.Attach(hBitmap);
    int iret = plist->Add(&bmp, RGB(203, 228, 252));
    bmp.Detach();
    }
      

  7.   

    嗯,落了一句话,加上
    bmp.Detach();
    DeleteObject(hBitmap);在Detach后面DeleteObject,这样GDI总数就不会涨了。
      

  8.   

    littlepboy(vc小p孩):
    我试过你的方法,还是存在我说的问题。可能问题不是出在这段代码里面
    我再仔细的检查一下数据。其实我不太明白new和不new有什么区别?
      

  9.   

    没有必要频繁的分配内存就不要分配。
    Add时ImageList对象会自己分配内存。
    所以位图对象可以是局部的。
      

  10.   

    那可能是其他的问题,不过你还是改下好,把new去掉。
      

  11.   


    唉!依然找不到问题再那里啊~。再发一遍通过loadimage从硬盘上得到一个位图的句柄hBitmap然后
    CBitmap pBitmap;
    pBitmap.Attach (hBitmap);
    imagelist.Add(&pBitmap,RGB(0,0,0));
    pBitmap.Detach();发现add之前和add之后imagelist.GetimageCount的数值没有变化!可以保证句柄不是空的,add返回的索引也不是空的。困扰很长时间了,郁闷~~
      

  12.   

    plist.Add(CDC::FromHandle(hBitma), rgbMask);
    改为:
    plist.Add(CBitmap::FromHandle(hBitma), rgbMask);