转换正确性 - 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
。 稍微解释了这一点。
有完全相同的要求,将 ID2D1SolidColorBrush
和 ID2D1LinearGradientBrush
实例放入 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
一起使用。
我需要创建一个 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
。 稍微解释了这一点。
有完全相同的要求,将 ID2D1SolidColorBrush
和 ID2D1LinearGradientBrush
实例放入 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
一起使用。