C++ 如何知道ID2D1Brush是哪种类型的刷子?

C++ 如何知道ID2D1Brush是哪种类型的刷子?,c++,inheritance,casting,directx,direct2d,C++,Inheritance,Casting,Directx,Direct2d,我以前使用或创建了一个 我需要知道我的指针是ID2D1SOLIDCORBRUSH还是ID2D1LinearGradientBrush。我该怎么办 ID2D1Brush* brush = ... if (brush is ID2D1SolidColorBrush) { } else if (brush is ID2D1LinearGradientBrush) { } 在C++中,您可以自己跟踪内容。这不是C#。因此有两种情况: 您的资源是静态的,并且您知道每件事情是什么,所以您不需要在运行时

我以前使用或创建了一个

我需要知道我的指针是
ID2D1SOLIDCORBRUSH
还是
ID2D1LinearGradientBrush
。我该怎么办

ID2D1Brush* brush = ...

if (brush is ID2D1SolidColorBrush)
{
}
else if (brush is ID2D1LinearGradientBrush)
{
}

C++
中,您可以自己跟踪内容。这不是
C#
。因此有两种情况:

  • 您的资源是静态的,并且您知道每件事情是什么,所以您不需要在运行时查询
  • ID2D1SOLIDCORBRUSH
    周围使用一个包装类,在该类中存储有关画笔的更多信息。使用对应用程序有意义的笔刷类型的枚举

就性能而言,查询与跟踪自己相比是一个糟糕的选择。

只有在每次渲染过程中选择这样做时,查询才会受到影响,这可能正是您所需要的

ID2D1Brush* brush = nullptr;
// ...

ID2D1LinearGradientBrush *linearGradientBrush = nullptr;
if (S_OK == brush->QueryInterface(__uuidof(ID2D1LinearGradientBrush), (void**)&linearGradientBrush))
{
    // ...
}

我使用这种策略,其中基类将持有给定的资源(例如背景画笔),并允许用户(或开发人员)将其设置为他们的首选项。在这种情况下(使用线性渐变笔刷时,夹紧是必要的。祝你好运。

QueryInterface
对于
ID2D1SolidColorBrush
?@RomanR。我已经使用了QueryInterface,但如果我有一个纯色笔刷,我查询线性渐变笔刷,它不会返回任何错误。这似乎是一个糟糕的解决方案。@Nick我认为它不是t他是
queryinterface()
,这是一些运行时开销,或者包装器是一些编码开销。对于图形引擎,我选择第二种。