循环通过常量枚举#define

时间:2015-02-11 00:36:27

标签: c++ loops enums const

我的c ++代码中有一个const枚举,我想知道我是否可以循环使用这些颜色,例如对此枚举的每个成员的整数引用

const enum Colors
{
#define WHITE(alpha)            D3DCOLOR_ARGB(alpha, 255, 255, 255)//
#define RED(alpha)              D3DCOLOR_ARGB(alpha, 255, 000, 000)//
#define GREEN(alpha)            D3DCOLOR_ARGB(alpha, 000, 255, 000)//
#define BLUE(alpha)             D3DCOLOR_ARGB(alpha, 000, 000, 255)//
#define BLACK(alpha)            D3DCOLOR_ARGB(alpha, 000, 000, 000)//
#define PURPLE(alpha)           D3DCOLOR_ARGB(alpha, 125, 000, 255)//
#define GREY(alpha)             D3DCOLOR_ARGB(alpha, 44,44, 46)    //
#define YELLOW(alpha)           D3DCOLOR_ARGB(alpha, 255, 255, 000)//
#define ORANGE(alpha)           D3DCOLOR_ARGB(alpha, 255, 165, 000)//
#define DEEPSKYBLUE(alpha)      D3DCOLOR_ARGB(alpha, 30, 144, 255) //
#define CHOCOLATE2(alpha)       D3DCOLOR_ARGB(alpha, 238, 118, 33) //
};

此列表不完整 - >我的枚举中有很多颜色

所以我真的很想知道我是否可以使用键盘快捷键遍历所有颜色,这可以循环显示这个枚举...

#define WHITE(alpha)            D3DCOLOR_ARGB(alpha, 255, 255, 255) = 1//<< something like that

我试过了,但这是不可能的......

2 个答案:

答案 0 :(得分:1)

首先,你不应该混合#define个宏和enum - 这些是完全不同的,你的代码等于 -

// Why was there `const`..?
enum Colors
{
    /* empty enum */
};

#define WHITE(alpha)            D3DCOLOR_ARGB(alpha, 255, 255, 255)//
#define RED(alpha)              D3DCOLOR_ARGB(alpha, 255, 000, 000)//
#define GREEN(alpha)            D3DCOLOR_ARGB(alpha, 000, 255, 000)//
#define BLUE(alpha)             D3DCOLOR_ARGB(alpha, 000, 000, 255)//
#define BLACK(alpha)            D3DCOLOR_ARGB(alpha, 000, 000, 000)//
#define PURPLE(alpha)           D3DCOLOR_ARGB(alpha, 125, 000, 255)//
#define GREY(alpha)             D3DCOLOR_ARGB(alpha, 44,44, 46)    //
#define YELLOW(alpha)           D3DCOLOR_ARGB(alpha, 255, 255, 000)//
#define ORANGE(alpha)           D3DCOLOR_ARGB(alpha, 255, 165, 000)//
#define DEEPSKYBLUE(alpha)      D3DCOLOR_ARGB(alpha, 30, 144, 255) //
#define CHOCOLATE2(alpha)       D3DCOLOR_ARGB(alpha, 238, 118, 33) //

所以,从现在开始,我将忽略enum Colors并谈论这些宏。


我建议你将值存储到数组中。

COLOR_TYPE colors[] = {
    WHITE(0),
    RED(0),
    ...
};

请注意alpha为零。由于数组只能存储值(而不是宏函数),我应该用某些东西修复alpha

然后,您可以像这样使用它:

color[42] & (alpha << 24)

如果你感到一团糟,你可以制作另一个宏

#define GET_COLOR(n, alpha) (color[(n)] & ((alpha) << 24))

或内联函数(推荐使用..)

inline COLOR_TYPE GetColor(int n, uint8_t alpha)
{
    return color[n] & (alpha << 24);
}

答案 1 :(得分:0)

我找到了一种方法,但我不知道那是否好:

首先我做了一个颜色类如下:

class MyColor
{
public:
    string name;
    int a, r, g, b;
    D3DCOLOR color;
    MyColor();
    MyColor(string name, int a, int r, int g, int b);
    void changeAlpha(int a);
};

MyColor::MyColor()
{

}
MyColor::MyColor(string name, int a, int r, int g, int b)
{
    this->name = name;
    this->a = a;
    this->r = r;
    this->g = g;
    this->b = b;
};

void MyColor::changeAlpha(int a)
{

    this->color = D3DCOLOR_ARGB(a, r, g, b);
}

然后我将我的所有定义复制到声明如下的向量中:

vector<MyColor*> colorArray
{
    new MyColor("WHITE", 255, 255, 255, 255),
    new MyColor("RED", 255, 255, 000, 000),
    new MyColor("GREEN", 255, 000, 255, 000),
    new MyColor("BLUE", 255, 000, 000, 255),
    new MyColor("BLACK", 255, 000, 000, 000),

    new MyColor("PURPLE", 255, 125, 000, 255),
    new MyColor("GREY", 255, 44, 44, 46),
    new MyColor("YELLOW", 255, 255, 255, 000),
    new MyColor("ORANGE", 255, 255, 165, 000),
    new MyColor("DEEPSKYBLUE", 255, 30, 144, 255),
    new MyColor("GOLD2", 255, 238, 201, 0),
    new MyColor("SQUA", 255, 0, 255, 255),
    new MyColor("DARKGREY", 255, 62, 62, 62),
    //... not all is here ;)
};

我添加了一些静态方法来按名称查找颜色,并将alpha设置为:

static MyColor* findColor(string colorName, int ALPHA)
{
    for (MyColor* COLOR : colorArray)
    {
        if (COLOR->name == colorName)
        {

            COLOR->a = ALPHA;
            COLOR->color = D3DCOLOR_ARGB(COLOR->a, COLOR->r, COLOR->g, COLOR->b);
            return COLOR;

        }
    }
    return new  MyColor("ElectricLime", 255, 204, 255, 000);
}

最后在我需要使用它们的课程中,我可以称之为

//button constructor
    Button::Button(string text, string name, XMFLOAT2 position, XMFLOAT2 size, CallbackFunction callback)
    {
        this->position = position;
        this->bounds = size;
        this->text = text;
        this->name = name;
        this->callback = callback;
        this->backColor = findColor("BLACK", 255);

        this->textColor = findColor("BLUE", 255);

        this->borderColor = findColor("BLUE", 255);
    }

所以我真的问这是否是一个很好的解决方案,但现在它完成了工作,我可以循环我的颜色......