プロが教えるわが家の防犯対策術!

MFCを使ってダイアログアプリを作っています。

やっていることは、CImageListへ画像ファイルの縮小画像(128x128へリサイズ済)を追加し、
CListViewで縮小画像を表示させようとしているのですが、画像が追加されたりされなかったりします。

以下処理内容です。
全部で20個の画像を追加します。(これはフォルダ内にある画像ファイルの数に依存します)

1回の登録する処理では、CImageListが1個、画像ロード用のCImageが1個、CImageの画像を
コピーして縮小画像の転送ソースとして利用するためのCBitmap(+CDC)が1個と、縮小画像を
格納するためのCBitmap(+CDC)が1個あります。
(クラスメンバー CImageList m_ListImages; CBitmap m_BmpBase, CBitmap m_BmpDrawの3つ、
CImageはローカル変数で確保)
※m_BmpBaseとm_BmpDrawには、Blt()を使う為にCDCが1つずつ付けてあります

実行手順)
・画像ファイルをCImageで読み込む
・CImageのBitBlt()でCBitmap(m_BmpBase)へ転送
・CImageの画像をDestroy()で削除
・m_BmpBaseの画像をStretchBlt()で縮小させて、別のCBitmap(m_BmpDraw)に格納
・m_BmpBaseとm_BmpDrawに関連付けたCDCをDeleteDC()で削除
・m_BmpBaseをDeleteObject()で削除
・CImageListへAdd()でCBitmap(m_BmpDraw)を追加
・m_BmpDrawをDeleteObject()で削除

上記動作を20回(20ファイル)行います。

これを実行させると、CImageListへ格納された画像の個数は、5個しか格納されていませんでした。

最初の5個が登録されたと言う訳では無く、1個格納毎にGetItemCount()で格納数を取得して、
テキストファイルに書き出させた所、1,1,1,1,1,2,2,3,3,3,4,4,4,4,4,5,5,5,5,5と、登録2~5個目、7個目、
9~10個目、12~15個目、17~20個目の登録が失敗しているみたいなのです。
また、CImageListへのAdd()のリターン値は-1(失敗)ではなく、0以上の値が返ってきています。

登録できた画像はCListViewに表示されています。

ここで質問ですが、この様にAdd()のリターン値は正常登録を示す番号を返してくるのにも関わらず、
登録ができていない(格納された画像が増えない)原因は何があるのでしょうか?

A 回答 (1件)

CImageクラスが使えるなら CImageクラス2個とCBitmapのポインタ1つでよさそうですが …



CImage img;
CImage Thumb(128, 128, 24);

img.Destroy();
img.Load(sName);
if ( img.IsNull() ) {
  HDC hDC = Thumb.GetDC();
  img.StretchBlt( hDC, 0, 0, 128, 128 );
  Thumb.ReleaseDC();
  CBitmap* pBmp = CBitmap::FromHandle((HBITMAP)Thumb);
  m_ListImages.Add(pBmp, RGB(0,0,0));
}
といった具合で

何処でエラーになっているのかを特定してみましょう
サムネイルを生成する段階なのか 元のイメージを読み込む段階なのか
イメージリストへの追加で発生するのか
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!