转换正确性 - ID2D1Brush 到 ID2D1SolidColorBrush (DirectX)

Cast correctness - ID2D1Brush to ID2D1SolidColorBrush (DirectX)

我需要创建一个 ID2D1SolidColorBrush 并且我有一个指向 ID2D1Brush 的指针。我使用 ID2D1HwndRenderTarget 创建纯色画笔:

ID2D1Brush* brush = nullptr;

myRenderTarget->CreateSolidColorBrush(color, 
                 reinterpret_cast<ID2D1SolidColorBrush**>(&brush));

以上代码有效,但我想知道 reinterpret_cast 是否是正确的选择。

你应该使用 QueryInterface method to obtain any different interface that is no a base interface of the one that you get. Also, I suggest using some COM smart pointers, like _com_ptr_t or those generated by #import or CComPtr<>.

更新

好的,我看到了 ID2D1SolidColorBrush inherits from ID2D1Brush。在那种情况下,如果我被迫不使用智能指针,我会使用这样的东西:

ID2D1SolidColorBrush * solid_brush = nullptr;
myRenderTarget->CreateSolidColorBrush(color, &solid_brush);
ID2D1Brush * brush = solid_brush;

绝对不要用reinterpret_cast

更新

不要使用 dynamic_cast 转换回派生接口。请改用 QueryInterface。 稍微解释了这一点。

有完全相同的要求,将 ID2D1SolidColorBrushID2D1LinearGradientBrush 实例放入 ID2D1Brush 的映射中。

对于任何想知道@wilx 在接受的答案中提到的 QueryInterface 方法如何工作的人,这就是方法(测试代码):

Microsoft::WRL::ComPtr<ID2D1Brush> BrushRegistry::CreateSolid
(
    Microsoft::WRL::ComPtr<ID2D1BitmapRenderTarget> dxTarget,
    D2D1::ColorF brushColor
)
{
    Microsoft::WRL::ComPtr<ID2D1Brush> genericBrush = nullptr;
    Microsoft::WRL::ComPtr<ID2D1SolidColorBrush> specificBrush = nullptr;
    DX::ThrowIfFailed(
        dxTarget->CreateSolidColorBrush(brushColor, &specificBrush)
    );

    specificBrush->QueryInterface<ID2D1Brush>(&genericBrush);
    return genericBrush;
}

如果您没有 ID2D1BitmapRenderTarget,它也可以与 ID2D1DeviceContext 一起使用。