次のコードを使用して、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 がまったく役に立たないことを確認するために、いくつかのことを試しました。この問題は、画像のサイズや形状 (高さ対幅) とは関係がないようです。画像コントロールに画像を表示することで、画像が読み込まれる HBITMAP に正しい画像が添付されていることを確認しましたが、リスト コントロールの画像は正しくありません。
次を使用して画像を追加する場合:
int nImage = ImageList.Add(CBitmap::FromHandle(hBitmap), (CBitmap *)NULL);
複製されたイメージはロードされません。反復インデックスの代わりに、Add は -1 を返します。CImageList のエラーに関するドキュメントが見つかりません。何が起こっているのか知っている人はいますか?