【问题标题】:C++: Is there a simple way of 'mapping' the hex colour `0xff2a2620` to a more readable string 'lovelyBrown'?C++:是否有一种简单的方法可以将十六进制颜色“0xff2a2620”“映射”到更易读的字符串“lovelyBrown”?
【发布时间】:2015-12-23 02:29:52
【问题描述】:

我正在使用Juce Framework,它有一个setColour 方法,如下所示:

g.setColour (Colour (0xff2a2620));

我想写一些更易读的东西,比如:

g.setColour (Colour (lovelyBrown));,“映射”0xff2a2620 到“lovelyBrown”。

方法的原型是:

explicit Colour (uint32 argb) noexcept; 其中uint32 是:

/** A platform-independent 32-bit unsigned integer type. */ typedef unsigned int uint32;

Juce 已经有很好的可读颜色名称,例如:

const Colour Colours::tomato (0xffff6347);,使用一种方法来查找给定名称的颜色:

static JUCE_API Colour findColourForName (const String& colourName, const Colour& defaultColour);

但是,我不想修改或子类化他们的 Colors 类。我想知道是否有更简单的“映射”0xff2a2620 到“lovelyBrown”的方法?

【问题讨论】:

标签: c++ hex typedef unsigned-integer juce


【解决方案1】:

正如你所说的 Juce 提供...

const Colour Colours::tomato (0xffff6347);

...您可以添加自己的颜色:

const Colour lovelyBrown (0xff2a2620);

如果您希望函数在运行时从颜色名称映射到值,一种简单而可靠的方法是:

std::map<std::string, Colour> colourMap;
colourMap["lovelyBrown"] = lovelyBrown;
// add more here...

一个稍快的替代方法是有一个连续的数组或vector 的排序颜色名称,并使用lower_bound 进行搜索。如果您不确定该怎么做,您可能不应该... ;-P。 (您要么需要信任自己/其他人以保持列表在源代码中排序,要么在首次使用之前进行运行时排序,因此分别存在更多风险/麻烦+离域)。


注意:

  • 使用enum class Colours 的一个问题是,当您使用包含的颜色名称时,它们必须以Colours:: 为前缀,因此与Juce 提供的颜色名称存在差异:李>
g.setColour(颜色(番茄)); // 确定提供的颜色 g.setColour(颜色(颜色::lovelyBrown)); // 哎呀,你的一个
  • 更一般地说,使用enumenum class 会使颜色成为不同的类型,这会产生微妙的后果:例如您不能在不编写自己的operator&lt;&lt; 的情况下将它们流式传输到cout &lt;&lt; lovelyBrown,您不能像lovelyBrown ^ 0xFF0000 等那样反转红色分量-再一次,这些事情可以为Juce 提供的颜色完成。

【讨论】:

  • 谢谢,但正如我所说,我不想编辑 Juce 类,因为我经常从 Github 中提取。我使用了一个简单的枚举
  • @DaveChambers:我的回答中没有任何内容建议编辑 Juce 类......你为什么提到它?
  • 托尼,我欠你一个道歉。我只是将g.setColour (Colour (Colour::lovelyBrown)); 添加到我自己的文件中,包含该文件,它的工作方式如下:g.fillAll (Colour (lovelyBrown)); 这是完美的最佳解决方案。干杯!戴夫
  • @DaveChambers:不用担心 - 如果有帮助,我们会很高兴。干杯。
【解决方案2】:

使用 C++11 枚举(这样您的枚举将是 uint32_t):

#include <cstdint>
enum class Colours : std::uint32_t {
    lovelyBrown = 0xff2a2620,
    lovelyOther = 0xff2a26FF
};

【讨论】:

  • 感谢您的回答,但它必须是 MyColours 或类似的,以避免与 Juce 类“颜色”发生冲突,我收到错误 ....No matching conversion for functional-style cast from 'MyColours' to 'juce::Colour' 我自己用一个简单的枚举回答了同样的问题和你一样!
  • 当然,命名只是一个例子。无论如何,您已经找到了解决方案,这很好。
【解决方案3】:
enum MyColour {
lovelyBrown = 0xff2a2620,
};

这可行,但我最终遵循了托尼的建议,寻求更清洁(且简单!)的解决方案。看看他的回答

【讨论】:

    猜你喜欢
    • 2010-11-19
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 2016-12-19
    相关资源
    最近更新 更多