【问题标题】:ASSERT fail on creating D2D rendertargetASSERT 创建 D2D 渲染目标失败
【发布时间】:2012-12-22 08:31:55
【问题描述】:

我正在构建一个 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);
}

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

【问题讨论】:

    标签: c++ mfc assert direct2d


    【解决方案1】:

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

    为了避免断言,我认为(在不了解您的程序的情况下)您可以通过放置来避免这种情况

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      • 2013-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多