0

私は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);
}

だから、私の実際の質問は、なぜアサーションが失敗するのか、そしてなぜ実際のエラーがないように見えるのかということです。

4

1 に答える 1

0

あなたは「それを開始するとき」と言うので、おそらくウィンドウが作成される前ですか?アサーションが発生する場所 (ASSERT(::IsWindow(m_hWnd));) によると、m_hWnd (つまり、GetDlgItem() を呼び出すウィンドウ) はまだ作成されていません。これにより、GetDlgItem() が null を返すことになり、おそらく d2DFactory->CreateHwndRenderTarget() の呼び出しが失敗し、返された HRESULT を調べるコードによって、後で問題が発生しないことが確認されます。

アサーションを避けるために、(プログラムについて詳しく知らなくても)次のように置くことでそれを避けることができると思います

if (IsWindow(m_hWnd)) {
    ... create render target
}

レンダーターゲットとなる部分の周り。

于 2013-01-08T16:33:55.733 に答える