Я строю программу MFC c ++.
Эта программа содержит класс под названием faceTracking. У этого класса обычно было только одно задание на рисование, поэтому я передавал только объект 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);
}
Итак, мой актуальный вопрос: почему не получается утверждение и почему нет реальной ошибки?
Вы говорите «при запуске», так что, вероятно, до того, как окно будет создано? В соответствии с местом, где происходит утверждение (ASSERT (:: IsWindow (m_hWnd));), m_hWnd (то есть окно, для которого вы вызываете GetDlgItem (), еще не создано. Это приведет к тому, что GetDlgItem () вернет значение null, что, вероятно, приведет к сбою вашего вызова d2DFactory-> CreateHwndRenderTarget (), а код, проверяющий возвращаемый HRESULT, будет следить за тем, чтобы после этого ничего плохого не произошло.
Чтобы избежать утверждения, я думаю (не зная больше о вашей программе), вы могли бы избежать этого, поставив
if (IsWindow(m_hWnd)) {
... create render target
}
вокруг части, которая делает цель рендеринга.
Других решений пока нет …