私はMFCc++プログラムを構築しています。
このプログラムには、faceTrackingというクラスが含まれています。このクラスには通常、描画ジョブが1つしかないため、描画する必要のあるMFCオブジェクトのみを渡しました。これはうまくいきました。
最近、プログラムが少し変更されたので、絵を描くだけでなく、画面にテキストを描くためにもこのクラスが必要になりました。そこで、いくつか変更を加えて、完全なMFCオブジェクトを渡し、getDlgItemを使用してrendertargetを作成し、正しいhwndをDirect2Dに渡します。
D2D1_RENDER_TARGET_PROPERTIES rtProps = D2D1::RenderTargetProperties();
rtProps.pixelFormat = D2D1::PixelFormat( DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_IGNORE);
rtProps.usage = D2D1_RENDER_TARGET_USAGE_GDI_COMPATIBLE;
hr = d2DFactory->CreateHwndRenderTarget(
rtProps,
D2D1::HwndRenderTargetProperties(GetDlgItem(hWnd,1010), size),
&renderTarget
);
私の見方では、これは何も変わりません。通常、FaceTrackerオブジェクトを作成するときに、これを行います。
faceTracker = new FaceTracking(getDlgItem(hWnd,1010), d2DFactory);
そして私はそれをこれに変更しました:
faceTracker = new FaceTracking(hWnd, d2DFactory);
したがって、違いはありません。しかし、それは可能です。プログラムは常に正常に実行され、起動すると次のエラーが表示されます。
無視を押すと、プログラムは正常に実行されます。これ以上のエラーはありません。アサーションが失敗するだけです。エラーは次のステートメントで発生します。
hr = d2DFactory->CreateHwndRenderTarget(
rtProps,
D2D1::HwndRenderTargetProperties(GetDlgItem(hWnd,1010), size),
&renderTarget
);
そしてここに投げられます:
CWnd* CWnd::GetDlgItem(int nID) const
{
ASSERT(::IsWindow(m_hWnd));
if (m_pCtrlCont == NULL)
return CWnd::FromHandle(::GetDlgItem(m_hWnd, nID));
else
return m_pCtrlCont->GetDlgItem(nID);
}
だから、私の実際の質問は、なぜアサーションが失敗するのか、そしてなぜ実際のエラーがないように見えるのかということです。