0

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

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

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

所以应该没什么区别。但确实如此:程序总是运行良好,现在启动它会出现以下错误:

断言错误 如果我按忽略程序运行正常。没有更多的错误,这只是一个断言失败。错误发生在此语句中:

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 回答