debugging - Direct2D 在主窗口中渲染,但不在子窗口中渲染

标签 debugging winapi direct2d

我正在学习如何使用 Direct2D 和 DirectWrite。我编写了一个示例应用程序,它使用这些库直接在主(顶级)窗口中呈现内容。效果很好。

现在我正在尝试重写另一个应用程序中子窗口的绘画代码。原始代码使用 GDI 并且工作正常。但是当我将其转换为使用 Direct2D 时,根本没有任何显示(子窗口显示为黑色)。

我已将绘制代码简化为客户区的简单填充。

LRESULT PlotWnd::OnPaint(UINT, WPARAM, LPARAM, BOOL &) {
    ATL::CComPtr<ID2D1Factory> pD2DFactory;
    HRESULT hr = ::D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &pD2DFactory);
    assert(SUCCEEDED(hr));
    ATL::CComPtr<ID2D1HwndRenderTarget> pRT;
    RECT rc;
    GetClientRect(&rc);
    D2D1_SIZE_U size = D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top);
    hr = pD2DFactory->CreateHwndRenderTarget(
        D2D1::RenderTargetProperties(/* D2D1_RENDER_TARGET_TYPE_SOFTWARE */),
        D2D1::HwndRenderTargetProperties(m_hWnd, size), &pRT);
    assert(SUCCEEDED(hr));

    pRT->BeginDraw();
    pRT->Clear(D2D1::ColorF(D2D1::ColorF::Beige));
    hr = pRT->EndDraw();
    assert(SUCCEEDED(hr));
    ValidateRect(nullptr);

    return 0;
}

所有 Direct2D 调用均成功并显示 S_OK,因此我有点不知道在哪里查找问题。此时,我可以看到我的工作实验与该程序之间唯一显着的区别是,在这个实验中,我仅在一个子窗口中使用 Direct2D。

所以我的问题是:在子窗口中使用 Direct2D 时是否存在我遗漏的问题?有什么进一步调试的技巧吗?

更新:我删除了静态信息以避免混淆。我在每次绘制时都完全设置和拆除 Direct2D。恰好有一个具有实际尺寸的绘制调用。

如果我切换到软件渲染(通过在渲染目标属性中使用 D2D1_RENDER_TARGET_TYPE_SOFTWARE),问题就会消失 - 我会按预期得到米色填充。

这让我怀疑我的图形驱动程序已经过时。但我现在已经更新了我的图形驱动程序,但它仍然以同样的方式失败。当软件渲染按预期工作时,还有什么可能导致硬件渲染失败?

更新 2:我仍在尝试重现这是一个小型的、独立的示例。与此同时,我注意到,简单地启动 Spy++ 有时会导致窗口实际渲染到屏幕上(一次)。

最佳答案

好吧,对于初学者来说,您应该在应用程序启动时创建工厂,并使用窗口(HWND)创建渲染目标。这些不应该是仅在 OnPaint (WM_PAINT) 执行期间存在的“临时”对象。

关于debugging - Direct2D 在主窗口中渲染,但不在子窗口中渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20942971/

相关文章:

c# - 如何在 Win 7 visual studio 2012 中禁用 C# 中的 #if DEBUG

javascript - 如何从 JScript 或 Testcomplete 调用 Windows API?

c++ - 形状中的 Flash "CurveTo"和 "LineTo"

c++ - WinMain 的返回值

c - 我怎样才能在 C 中获得一个进程句柄而不是它的名字?

c# - 从 Win32 图标指针创建 Direct2D BitmapSource

c++ - 无法使用Direct2D png的DirectX9绘制图像 Sprite

php - 如何打印对象的所有属性

java - 如何测量预编译java类的执行时间?

visual-studio-2010 - 调试外部程序的库? (Visual Studio 2010)