C++ 创建D2D1工厂和Hwnd渲染目标

C++ 创建D2D1工厂和Hwnd渲染目标,c++,windows,winapi,direct2d,C++,Windows,Winapi,Direct2d,我成功地创建了一个空窗口,它将打开并一直坐在那里直到我关闭它。接下来,我想尝试使用Direct 2-D在该窗口上绘制一些简单的东西。我创建了一个类,该类将初始化Direct 2-D,然后绘制到窗口,但添加该类后,我的窗口将不再打开。在对它进行了一点修改之后,它现在打开了,但随后冻结了。我收到一条消息,说“出现了一个问题,导致程序出现错误”,还有一个按钮“关闭程序” 窗口从未打开变为打开,然后在我添加返回值false if not s_ok(如果不是s_ok)后给出错误,如下所示 //creati

我成功地创建了一个空窗口,它将打开并一直坐在那里直到我关闭它。接下来,我想尝试使用Direct 2-D在该窗口上绘制一些简单的东西。我创建了一个类,该类将初始化Direct 2-D,然后绘制到窗口,但添加该类后,我的窗口将不再打开。在对它进行了一点修改之后,它现在打开了,但随后冻结了。我收到一条消息,说“出现了一个问题,导致程序出现错误”,还有一个按钮“关闭程序”

窗口从未打开变为打开,然后在我添加返回值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()函数的返回值,当我启动调试器时,我收到一个错误,上面说“在0x00E4264F发生未处理的异常,从位置0xC0000005读取0x00000000时发生访问冲突”

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

void Graphics::BeginDraw()
{
    pRT->BeginDraw(); //pRT is pointer to render target.
}
我不知道这意味着什么。我猜它试图读取的东西不在内存中

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

问题在于(大概)您的初始化代码从未运行到完成。如果(!s_OK)返回false,则返回
语句,该语句在创建设备工厂后立即退出
S_OK
定义为0,
!0
始终为真(正如编译器警告的那样,这是徒劳的)

净效果是,
pRT
从未分配指针,当您第一次取消引用它时,系统会弹出访问冲突对话框

您需要做的是计算返回值(
HRESULT
)。在COM编程中,通常使用、和宏,例如:

if ( FAILED( d2dFactHRes ) )
    return false;

请构造一个。您可能会在创建问题时找到问题的解决方案。如果你不这样做,它仍然会成为一个更好的问题。我不确定我是否知道你所说的“…在创建问题的同时找到问题的解决方案”是什么意思。我尝试只包含与问题相关的代码,我相信这与类有关。拥有类
图形
对说明问题没有任何意义。类似地,
Graphics::Draw()
的实现也没有添加任何说明问题的内容。继续删除代码片段,直到您拥有仍然显示问题所需的绝对最少代码。我发布了一个带有说明的链接。这段代码中没有任何东西会导致窗口不显示。问题可能出在其他地方。此外,还必须检查
EndDraw()
的返回值,因为您可能需要重新创建渲染目标和所有特定于设备的对象(如笔刷)。您还必须在成功的
EndDraw()
之后调用
validateInstrument()
,因为否则Windows将继续发送
WM\u PAINT
消息。好的,我会研究一下。我将尝试修改代码和问题中的一些内容。实际上,现在的情况是,窗口打开,然后另一个窗口弹出,并用一个按钮显示“关闭程序”。谢谢。实际上,我在呈现目标的参数中发现了一个问题。修好后,我修好了S_OK线路,现在可以工作了。我误解了苏OK在做什么。“如果(d2dFactHRes!=S_OK)返回false;”也可以吗?@kazama:在这种情况下(如果文档是准确的),也可以。但是,有2^31个不同的成功代码,一些COM实现返回的成功代码不是
S_OK
。使用宏可确保您正在处理所有可能的错误/成功代码(如果需要,如本例所示)。