ASSERT在创建D2D rendertarget时失败

时间:2013-01-08 13:17:27

标签: c++ mfc assert direct2d

我正在构建一个MFC c ++程序。

该程序包含一个名为faceTracking的类。这个类通常只有一个绘图作业,因此我只传递了它需要绘制的MFC对象。这很好。

最近程序改变了一点,现在我需要这个类不仅可以绘制图片,还可以在屏幕上绘制一些文本。所以我改变了一些东西,现在我传递完整的MFC对象,并在创建rendertarget时使用getDlgItem将正确的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);

所以它应该没有区别。但它确实: 程序总是正常运行,现在启动时会出现以下错误:

Assertion error 如果我按忽略该程序运行正常。没有更多的错误,它只是一个断言失败。 错误发生在以下声明中:

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

所以,我的实际问题是:为什么断言失败,为什么似乎没有实际错误?

1 个答案:

答案 0 :(得分:0)

你说'开始',所以可能在窗口创建之前?根据断言发生的位置(ASSERT(:: IsWindow(m_hWnd));),m_hWnd(即,您正在调用GetDlgItem()的窗口)尚未创建。这将导致GetDlgItem()返回null,这可能导致您的d2DFactory-> CreateHwndRenderTarget()调用失败,并且检查返回的HRESULT的代码将确保之后不会发生任何不良。

为避免断言,我认为(不了解您的计划更多)您可以通过放置

来避免这种情况
if (IsWindow(m_hWnd)) {
    ... create render target
}

围绕构成渲染目标的部分。