4

我正在使用以下代码将图像添加到 CImageList:

CImageList ImageList;

ImageList.Create(64, 64, ILC_COLOR32, 0, 1);

      Find image path and load image . . .
HBITMAP hBitmap = LoadBitmapFromFile(finder.GetFilePath(), NULL, 64, 64);

int nImage = ImageList.Add(CBitmap::FromHandle(hBitmap), RGB(0,0,0));

HBITMAP LoadBitmapFromFile(const char* pszFilePath, HDC hDC, long lMaxHeight, long lMaxWidth)
{
    // Macro that MFC needs to manage its state within a DLL
    AFX_MANAGE_STATE(AfxGetStaticModuleState())

    // The item object which will be used to read in the file
    CxImage image;
    // Load the image from the file
    if(image.Load(pszFilePath))
    {
        ResizeImage(image, lMaxHeight, lMaxWidth);

        // Get a handle to a bitmap version of the image which the given DC can use
        return image.MakeBitmap(hDC);
    }
    return NULL;
}

void ResizeImage(CxImage& image, long lMaxHeight, long lMaxWidth)
{
    const DWORD ulImgHeight = image.GetHeight();
    const DWORD ulImgWidth = image.GetWidth();

    long nHeightDif = ulImgHeight - lMaxHeight;
    long nWidthDif = ulImgWidth - lMaxWidth;
    if(nHeightDif > 0 || nWidthDif > 0)
    {
        double rScaleFactor = 1.0;
        if(nHeightDif > nWidthDif)
            rScaleFactor = (double)lMaxHeight / (double)ulImgHeight;
        else
            rScaleFactor = (double)lMaxWidth / (double)ulImgWidth;

        long nNewHeight = (long)(ulImgHeight * rScaleFactor);
        long nNewWidth = (long)(ulImgWidth * rScaleFactor);

        image.Resample2(nNewWidth, nNewHeight);
    }
}

Add 方法似乎是在添加图像,但会重复为新图像返回相同的索引值。当图像列表显示在列表框中时,所有添加的图像都显示相同的图像并返回相同的索引,但列表中图像下方显示的文件名是正确的。

我已经尝试了几件事来确定 wnat 正在发生,但都无济于事。这个问题似乎与图像大小或形状(h. vs. w.)无关。我已经通过在图片控件上显示图像验证了正确的图像附加到加载图像的 HBITMAP,但列表控件上的图像不正确。

如果我使用以下方法添加图像:

int nImage = ImageList.Add(CBitmap::FromHandle(hBitmap), (CBitmap *)NULL);

没有加载任何重复的图像。而不是重复索引 Add 返回 -1。我找不到有关 CImageList 错误的文档。有谁知道可能会发生什么?

4

0 回答 0