我正在构建一个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);
所以它应该没有区别。但它确实: 程序总是正常运行,现在启动时会出现以下错误:
如果我按忽略该程序运行正常。没有更多的错误,它只是一个断言失败。 错误发生在以下声明中:
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);
}
所以,我的实际问题是:为什么断言失败,为什么似乎没有实际错误?
答案 0 :(得分:0)
你说'开始',所以可能在窗口创建之前?根据断言发生的位置(ASSERT(:: IsWindow(m_hWnd));),m_hWnd(即,您正在调用GetDlgItem()的窗口)尚未创建。这将导致GetDlgItem()返回null,这可能导致您的d2DFactory-> CreateHwndRenderTarget()调用失败,并且检查返回的HRESULT的代码将确保之后不会发生任何不良。
为避免断言,我认为(不了解您的计划更多)您可以通过放置
来避免这种情况if (IsWindow(m_hWnd)) {
... create render target
}
围绕构成渲染目标的部分。