3

我正在使用具有如下方法的Juce 框架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”的方法?

4

3 回答 3

2

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

#include <cstdint>
enum class Colours : std::uint32_t {
    lovelyBrown = 0xff2a2620,
    lovelyOther = 0xff2a26FF
};
于 2015-09-25T09:41:52.883 回答
2

就像你说的 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。(您要么需要信任自己/其他人以保持列表在源代码中排序,要么在首次使用之前进行运行时排序,因此分别存在更多风险/麻烦+离域化)。


笔记:

  • using 的一个问题enum class Colours是,当您使用包含的颜色名称时,它们必须以 为前缀Colours::,因此与 Juce 提供的颜色名称存在差异:
    g.setColour(颜色(番茄));// 确定提供的颜色
    g.setColour(颜色(颜色::lovelyBrown)); // 哎呀,你的一个
  • 更一般地说,使用enumenum class使颜色成为一种不同的类型,这会产生微妙的后果:例如,您不能在cout << lovelyBrown不编写自己的情况下将它们流式传输operator<<,您不能将红色组件反转为 lalovelyBrown ^ 0xFF0000等 - 再次,这些事情可以为 Juce 提供的颜色完成。
于 2015-09-25T09:49:05.357 回答
0
enum MyColour {
lovelyBrown = 0xff2a2620,
};

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

于 2015-09-25T09:41:46.733 回答