0

这是我的功能:

void CreateRenderTarget(HWND, ID2D1HwndRenderTarget*);

它是如何工作的:

void D2DRes::CreateRenderTarget(HWND hwnd, ID2D1HwndRenderTarget* pRT)
{
    RECT rc;
    GetClientRect(hwnd,&rc);

    pFactory->CreateHwndRenderTarget(
            D2D1::RenderTargetProperties(),
            D2D1::HwndRenderTargetProperties(
                hwnd,
                D2D1::SizeU(
                    rc.right - rc.left,
                    rc.bottom - rc.top)),
                &pRT);
}

它是这样调用的:

pD2DRes->CreateRenderTarget(map.GetHWnd(),map.GetpRT());

从 CreateRenderTarget() 返回后,map.pRT 为 NULL。怎么会?

编辑:有我的 GetpRT() 函数:

ID2D1HwndRenderTarget* MapEditor::GetpRT()
{
    return pRT;
}
4

2 回答 2

2

第一个问题:

一从归来CreateRenderTarget()map.pRT就是NULL。怎么会?

因为您没有通过引用传递指针。为了通过引用传递它,签名CreateRenderTarget()应该是:

void CreateRenderTarget(HWND, ID2D1HwndRenderTarget*&);
//                                                  ^

除非您这样做,否则您CreateRenderTarget()将处理作为参数传递的指针的副本,并且对其值的更改不会影响原始指针。

第二个问题:

你写:

[...]有我的GetpRT()功能:

ID2D1HwndRenderTarget* MapEditor::GetpRT()
{
    return pRT;
}

请注意,这GetpRT也应该返回对内部指针的引用pRT,否则上述更改将不起作用(您将通过引用传递原始pRT.

因此,您应该相应地修改其签名:

ID2D1HwndRenderTarget*& MapEditor::GetpRT()
//                    ^
{
    return pRT;
}
于 2013-04-01T11:41:17.643 回答
0

这是一个非常奇怪的代码。您正在按值传递所有内容,并希望修改函数中的值。

如果您打算修改传递给函数的指针,原型应如下所示:

无效 CreateRenderTarget(HWND, ID2D1HwndRenderTarget*& pRT);

于 2013-04-01T11:47:15.273 回答