如何知道 ID2D1Brush 是哪种类型的画笔?

Posted

技术标签:

【中文标题】如何知道 ID2D1Brush 是哪种类型的画笔?【英文标题】:How to know which type of brush is ID2D1Brush? 【发布时间】:2015-05-25 15:07:31 【问题描述】:

我之前使用CreateSolidColorBrush 或CreateLinearGradientBrush 创建了一个ID2D1Brush。

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

ID2D1Brush* brush = ...

if (brush is ID2D1SolidColorBrush)


else if (brush is ID2D1LinearGradientBrush)


【问题讨论】:

QueryInterface for ID2D1SolidColorBrush? @RomanR。我已经使用了 QueryInterface,但它不会返回任何错误,例如,如果我有一个纯色画笔并查询线性渐变画笔。 【参考方案1】:

只有在您选择在每个渲染过程中执行此操作时,查询才会受到影响,并且可能正是您所需要的。

ID2D1Brush* brush = nullptr;
// ...

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

    // ...

我使用这种策略,其中基类将保存给定的资源(例如背景画笔)并允许用户(或开发人员)根据自己的喜好进行设置。在这种情况下(使用线性渐变画笔,夹紧是必要的。祝你好运。

【讨论】:

【参考方案2】:

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

您的资源是静态的,您知道每一件事是什么,因此您不会在运行时查询。 您在ID2D1SolidColorBrush 周围使用包装类,您可以在其中存储有关画笔的更多信息。使用对您的应用有意义的画笔类型enum

与在性能方面跟踪自己相比,查询是一个糟糕的选择。

【讨论】:

这似乎是一个糟糕的解决方案。 @Nick 我认为它要么是 QuerryInterface(),它是一些运行时开销,要么是包装器,它是一些编码开销。对于图形引擎,我会选择第二个。

以上是关于如何知道 ID2D1Brush 是哪种类型的画笔?的主要内容,如果未能解决你的问题,请参考以下文章

你是哪种设计师?

编码类型,如何确定[关闭]

Python爬虫解密神器,无需知道哪种类型加密,全自动解密工具

python 获取列表元素有几种方式,常见的是哪种?

F22用的是哪种航炮?

如何判断 Chrome 使用的是哪种字体? [复制]