Mfc 从CImageList中提取CBitmap

Mfc 从CImageList中提取CBitmap,mfc,visual-c++,Mfc,Visual C++,我在一个函数中插入了CImageList中的位图,之后需要在另一个函数中更改一些图像。但我无法提取CBitmap。代码是这样的: CBitmap GetIndividualBitmap(CImageList oImgList, int nBmpNo) { IMAGEINFO imgInfo; imagelist.GetImageInfo(index,imgInfo); CBitmap bmp; bmp.FromHandle(imgInfo.hbmImage)

我在一个函数中插入了CImageList中的位图,之后需要在另一个函数中更改一些图像。但我无法提取CBitmap。代码是这样的:

CBitmap GetIndividualBitmap(CImageList oImgList, int nBmpNo)
{   
    IMAGEINFO imgInfo;
    imagelist.GetImageInfo(index,imgInfo);
    CBitmap bmp;
    bmp.FromHandle(imgInfo.hbmImage);
    return bmp;
}
CBitmap* GetIndividualBitmap(CImageList& oImgList, int nBmpNo) 
{
    IMAGEINFO imgInfo;
    oImgList.GetImageInfo( nBmpNo, &imgInfo );
    return CBitmap::FromHandle( imgInfo.hbmImage );
}

然而,我得到的只是一个黑屏。有人能指出我哪里出错了吗?

好的,您的代码中有很多错误

1) 您正在按对象传递图像列表,这意味着它将复制它。通过参考传递是一个更好的计划。
2) 您没有将指向IMAGEINFO结构的指针传递到GetImageInfo中。
3) 你误解了“FromHandle”的工作原理。FromHandle是一个静态函数,返回指向位图的指针。在您的代码中,您正在调用函数,然后忽略返回的CBitmap*并返回新构造对象的副本(即它不包含任何内容),这将导致您的黑屏

考虑到所有这些因素,您应该有如下代码:

CBitmap GetIndividualBitmap(CImageList oImgList, int nBmpNo)
{   
    IMAGEINFO imgInfo;
    imagelist.GetImageInfo(index,imgInfo);
    CBitmap bmp;
    bmp.FromHandle(imgInfo.hbmImage);
    return bmp;
}
CBitmap* GetIndividualBitmap(CImageList& oImgList, int nBmpNo) 
{
    IMAGEINFO imgInfo;
    oImgList.GetImageInfo( nBmpNo, &imgInfo );
    return CBitmap::FromHandle( imgInfo.hbmImage );
}

好的,代码中有很多错误

1) 您正在按对象传递图像列表,这意味着它将复制它。通过参考传递是一个更好的计划。
2) 您没有将指向IMAGEINFO结构的指针传递到GetImageInfo中。
3) 你误解了“FromHandle”的工作原理。FromHandle是一个静态函数,返回指向位图的指针。在您的代码中,您正在调用函数,然后忽略返回的CBitmap*并返回新构造对象的副本(即它不包含任何内容),这将导致您的黑屏

考虑到所有这些因素,您应该有如下代码:

CBitmap GetIndividualBitmap(CImageList oImgList, int nBmpNo)
{   
    IMAGEINFO imgInfo;
    imagelist.GetImageInfo(index,imgInfo);
    CBitmap bmp;
    bmp.FromHandle(imgInfo.hbmImage);
    return bmp;
}
CBitmap* GetIndividualBitmap(CImageList& oImgList, int nBmpNo) 
{
    IMAGEINFO imgInfo;
    oImgList.GetImageInfo( nBmpNo, &imgInfo );
    return CBitmap::FromHandle( imgInfo.hbmImage );
}

一切都是真的。然而,我相信你仍然需要获取位图的适当部分,正如我在上面的评论中所指出的。所有这些都是真实的。但是,我相信您仍然需要获取位图的适当部分,如我在上面的评论所示。