Рисование 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))*/);
}
Другие вопросы по тегам