アプリ版:「スタンプのみでお礼する」機能のリリースについて

CImage::ReleaseDC()のエラーで困っています。

ウインドウ上に複数の画像を表示し、それぞれ配置や大きさを
マウスのD&Dで変えられるようなアプリを作っています。
Visual Studio 2005 C++, MFC

画像はCImageクラスのm_ImageへLoadしてあります。
GetDCでハンドルを取得しているので、ReleaseDCにて開放を
行っていますが、そこで下のエラーになります。
[Second Chance Assertion Failed: File c:\program files\microsoft visual studio 8\vc\atlmfc\include\atlimage.h, Line 1217]
何か解決のヒントになる事がありましたら教えてください。

void CImageButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
(前略)
//ウィンドウDC互換Bitmap作成
CBitmap Bmp;
Bmp.CreateCompatibleBitmap(pDC, nWidth, nHeight);
//メモリDC作成
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
//メモリDCにBitmap選択
MemDC.SelectObject(&Bmp);
//メモリDCにストレッチ描画
MemDC.SetStretchBltMode(HALFTONE);
CDC* pImgDC = CDC::FromHandle(pBtnInfo->m_Image.GetDC());
HDC hImgDC = pImgDC->m_hDC;
pBtnInfo->m_Image.StretchBlt(MemDC.m_hDC, 0, 0, nWidth, nHeight, SRCCOPY);
pBtnInfo->m_Image.ReleaseDC();
(中略)
//四角形を描画
CPen focusPen(PS_DOT, nPenWidth, RGB(nR, nG, nB));
CPen* OldPen = MemDC.SelectObject(&focusPen);
MemDC.MoveTo(btnRect.left, btnRect.top);
MemDC.LineTo(btnRect.left, btnRect.bottom);
MemDC.LineTo(btnRect.right, btnRect.bottom);
MemDC.LineTo(btnRect.right, btnRect.top);
MemDC.LineTo(btnRect.left, btnRect.top);
MemDC.SelectObject(OldPen);
//メモリDCからウィンドウDCにビット転送
pDC->BitBlt(0, 0, nWidth, nHeight, &MemDC, 0 ,0, SRCCOPY);
(後略)

「CImage::ReleaseDC()の」の質問画像

A 回答 (1件)

(Press Retry to debug the application) って書いてありますから、「再試行(R)」を押してデバッグしましょう。


ソースついてますから、デバッグし放題ですよ。

atlimage.h を読む限り、CImage::ReleaseDC() のアサーションは

  hBitmap = HBITMAP( ::SelectObject( m_hDC, m_hOldBitmap ) );
  ATLASSERT( hBitmap == m_hBitmap );

で、hBitmap と m_hBitmap が同じじゃなきょダメよ、と言っているので、
GetDC() で m_hDC、m_hOldBitmap がセットされた以降、ReleaseDC() されるまでの間に
値がどの時点で変わっているのかを追っかけていけば、問題の箇所が分かるのでは、と…

当方、DC まわりはサッパリ分からんので、あんまりヘルプできません。
    • good
    • 1

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

このQ&Aを見た人はこんなQ&Aも見ています