如何知道 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 是哪种类型的画笔?的主要内容,如果未能解决你的问题,请参考以下文章