Ошибка ASSERT при создании D2D rendertarget

Я строю программу 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);
}

Итак, мой актуальный вопрос: почему не получается утверждение и почему нет реальной ошибки?

0

Решение

Вы говорите «при запуске», так что, вероятно, до того, как окно будет создано? В соответствии с местом, где происходит утверждение (ASSERT (:: IsWindow (m_hWnd));), m_hWnd (то есть окно, для которого вы вызываете GetDlgItem (), еще не создано. Это приведет к тому, что GetDlgItem () вернет значение null, что, вероятно, приведет к сбою вашего вызова d2DFactory-> CreateHwndRenderTarget (), а код, проверяющий возвращаемый HRESULT, будет следить за тем, чтобы после этого ничего плохого не произошло.

Чтобы избежать утверждения, я думаю (не зная больше о вашей программе), вы могли бы избежать этого, поставив

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

вокруг части, которая делает цель рендеринга.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]