【问题标题】:Direct2D drawing not working when returning from lock screen从锁定屏幕返回时 Direct2D 绘图不起作用
【发布时间】:2015-03-24 18:17:54
【问题描述】:

我有一个使用 Direct2D 可以正常工作的 MFC 应用程序...除了一件事:当我在应用程序运行时锁定我的计算机 (Windows) 时,当我解锁计算机时,显示器不再刷新。

请注意,应用程序运行正常,只需调整应用程序的大小即可使其再次运行。

这是我的代码的主要部分:

进入类视图构造函数

    // 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

【问题讨论】:

  • 您是否正确检查了ID2D1RenderTarget::EndDraw 的返回值?如果它返回D2DERR_RECREATE_TARGET,你将不得不重新创建你的渲染目标。还要确保您有一个WM_DISPLAYCHANGE 消息处理程序,该处理程序可以触发呈现/重新创建,如Creating a Simple Direct2D Application 所述。
  • 感谢您的反馈。我根本没有调用 EndDraw()。现在我添加了这个调用,只要按下 CTRL-ALT-DEL,我就会得到一个返回码:0x8899000c。我试图调用 ReCreate() 但这似乎不是解决它的正确方法。 hr = pRenderTarget->EndDraw(); if (FAILED(hr)) pRenderTarget->ReCreate(m_hWnd);

标签: windows mfc direct2d


【解决方案1】:

感谢 IInspectable 的提示!这是为我修复它的代码(在 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))*/);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 2015-03-16
    • 2018-01-19
    • 1970-01-01
    • 2020-05-24
    相关资源
    最近更新 更多