3

私は次のようなメソッドを持つJuce Frameworkを使用しています:setColour

g.setColour (Colour (0xff2a2620));

代わりに、次のような読みやすいものを書きたいと思います。

g.setColour (Colour (lovelyBrown));、「0xff2a2620lovelyBrown」への「マッピング」。

メソッドのプロトタイプは次のとおりです。

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

あなたが言うように、ジュースは提供します...

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 (色 (トマト)); // 指定された色はOK
    g.setColour (色 (色::素敵なブラウン)); // おっと、あなたの 1 つ
  • より一般的には、enumorを使用して色を個別のタイプにすることで、微妙な結果が生じます。たとえば、独自の を記述せずenum classに単純にストリーミングすることはできません。赤のコンポーネントを逆にすることはできません。 Juce が提供する色に対して行われます。cout << lovelyBrownoperator<<lovelyBrown ^ 0xFF0000
于 2015-09-25T09:49:05.357 に答える
0
enum MyColour {
lovelyBrown = 0xff2a2620,
};

これは機能しますが、よりクリーンな(そして簡単な)ソリューションについてのトニーのアドバイスに従うことになりました。彼の答えを見る

于 2015-09-25T09:41:46.733 に答える