Рисование Direct2D не работает при возврате с экрана блокировки
У меня есть приложение MFC, которое работает правильно с использованием Direct2D... за исключением одного: когда я блокирую свой компьютер (Windows) во время работы приложения, дисплей больше не обновляется, когда я разблокирую компьютер.
Обратите внимание, что приложение работает нормально и просто изменяет размер приложения, чтобы оно снова заработало.
Вот основные части моего кода:
в конструктор класса View
// Enable D2D support for this window:
EnableD2DSupport();
И ничья часть
afx_msg LRESULT CMyView::OnDraw2d(WPARAM wParam, LPARAM lParam)
{
CHwndRenderTarget* pRenderTarget = (CHwndRenderTarget*)lParam;
ASSERT_VALID(pRenderTarget);
if (pRenderTarget == NULL)
return -1;
pRenderTarget->FillRectangle(m_rect, m_pLinearGradientBrush);
...
Мое приложение основано на этом примере, который не содержит ни BeginDraw, ни EndDraw: https://code.msdn.microsoft.com/windowsdesktop/MFC-Direct2D-Hello-World-9aa6ae00
1 ответ
Спасибо за подсказку! Вот код, который исправил это для меня (в конце CMyView::OnDraw2d).
...
hr = pRenderTarget->EndDraw();
if (FAILED(hr))
{
pRenderTarget->ReCreate(m_hWnd);
delete m_pTraceRenderTarget;
m_pTraceRenderTarget = NULL;
}
Для обычного случая я предполагаю, что pRenderTarget->ReCreate(m_hWnd); звонка должно хватить. Но в моем случае это не сработало, потому что у меня была вторая CompatibleRenderTarget. Выпустив его, я заставляю его заново создать свой код:
if (m_pTraceRenderTarget == NULL)
{
m_pTraceRenderTarget = new(CBitmapRenderTarget);
pRenderTarget->CreateCompatibleRenderTarget(*m_pTraceRenderTarget/*, CD2DSizeF((100.0), (100.0))*/);
}