创建 D2D1 工厂和 Hwnd 渲染目标

Creating D2D1 Factory and Hwnd Render Target

我成功创建了一个空的 window,它会打开并坐在那里直到我关闭它。接下来,我想尝试使用 Direct 2-D 绘制一些简单的东西 window。我创建了一个 class 来初始化 Direct 2-D,然后绘制到 window,但是在我添加这个 class 之后,我的 window 将不再打开。在摆弄了一下之后,它现在正在打开但随后冻结,我收到一条消息说 "a problem occurred causing the program to misbehave," 和一个按钮 "close program."

window 从不打开到打开,然后在我添加 return false if not s_ok 后给了我错误 s_ok 如下所示

//creating factory
HRESULT d2dFactHRes = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, &Direct2DFactory);
    if (!S_OK)
        return false;

    //creating render target.
    HRESULT RenTargHRes = Direct2DFactory->CreateHwndRenderTarget(D2D1::RenderTargetProperties(D2D1_RENDER_TARGET_TYPE_DEFAULT, D2D1::PixelFormat(), 0.0F, 0.0F, D2D1_RENDER_TARGET_USAGE_NONE, D2D1_FEATURE_LEVEL_DEFAULT), D2D1_HWND_RENDER_TARGET_PROPERTIES(), &pRT);
    if (!S_OK)
        return false;

我设置了一个断点来尝试检查 EndDraw() 函数的 return 值,当我启动调试器时,我收到一条错误消息 "unhandled exception occured at 0x00E4264F, an access violation occurred while reading 0x00000000 from location 0xC0000005"

我认为这个错误发生在 BeginDraw 函数到达断点之前。

void Graphics::BeginDraw()
{
    pRT->BeginDraw(); //pRT is pointer to render target.
}

我不知道这是什么意思。我假设内存中没有它试图读取的内容?

如有任何建议,我将不胜感激。谢谢

问题是(大概)您的初始化代码永远不会运行完成。这是 if (!S_OK) return false; 声明,在创建设备工厂后立即退出。 S_OK 定义为 0,!0 始终为真(因为您的编译器警告过您,但没有用)。

最终结果是,pRT 永远不会分配指针,并且您第一次取消引用它时,系统会弹出访问冲突对话框。

您需要做的是评估 return 值(HRESULT)。在 COM 编程中,通常使用 SUCCEEDED, and FAILED 宏,例如:

if ( FAILED( d2dFactHRes ) )
    return false;