创建D2D1工厂和Hwnd渲染目标

时间:2017-06-07 13:02:35

标签: c++ windows winapi direct2d

我成功创建了一个空窗口,可以打开并坐在那里直到我关闭它。接下来,我想尝试使用Direct 2-D在该窗口中绘制简单的东西。我创建了一个初始化Direct 2-D然后绘制到窗口的类,但在我添加这个类后,我的窗口将不再打开。稍微摆弄一下后,它现在打开但随后冻结,我收到一条消息,说“发生问题导致程序行为异常”,并且有一个按钮“关闭程序。”

窗口从未打开到打开,然后在我添加返回false后给出错误,如果不是下面的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()函数的返回值,当我启动调试器时,我收到错误消息“0x00E4264F发生了未处理的异常,从位置读取0x00000000时发生访问冲突0000005"

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

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

我不知道这意味着什么。我假设某些东西不在记忆中它试图阅读?

我很感激任何建议。感谢。

1 个答案:

答案 0 :(得分:0)

问题是(大概)您的初始化代码永远不会运行完成。它是在创建设备工厂后立即提前解决的if (!S_OK) return false;语句。 S_OK定义为0,!0始终为真(因为编译器警告你,徒劳无功)。

净效应是,pRT永远不会指定指针,并且第一次取消引用它时,系统会弹出访问冲突对话框。

您需要做的是评估返回值(HRESULT' s)。在COM编程中,通常使用SUCCEEDEDFAILED宏,例如:

if ( FAILED( d2dFactHRes ) )
    return false;