#include <Fl/Enumerations.H>
class Color
{
public:
static Color amber () {return fl_rgb_color (255, 204, 0);}
static Color lighter_gray () {return fl_rgb_color (40, 40, 40); }
static Color light_gray () {return fl_rgb_color (179, 179, 179);}
static Color gray () {return fl_rgb_color (100, 100, 100);}
static Color light_blue () {return fl_rgb_color (107, 107, 255);}
static Color white () {return FL_WHITE;}
static Color off_white() { return fl_rgb_color(225, 225, 225); }
static Color cream() { return fl_rgb_color(204, 236, 255); }
static Color black () {return FL_BLACK;}
static Color red () {return FL_RED;}
static Color green () {return FL_GREEN;}
static Color dark_green () {return fl_rgb_color (0, 169, 45);}
static Color blue () {return FL_BLUE;}
static Color background () {return FL_BACKGROUND_COLOR;}
Color (const Fl_Color& c = Color::black ()) : fl_color_ (c) {}
operator Fl_Color () const {return fl_color_;}
void make_current () const;
private:
Fl_Color fl_color_;
};这是F1/Enumerations.h中重要部分的摘录
enum Fl_Color { // standard colors
// These are used as default colors in widgets and altered as necessary
FL_FOREGROUND_COLOR = 0,
FL_BACKGROUND2_COLOR = 7,
FL_INACTIVE_COLOR = 8,
FL_SELECTION_COLOR = 15,
// boxtypes generally limit themselves to these colors so
// the whole ramp is not allocated:
FL_GRAY0 = 32, // 'A'
FL_DARK3 = 39, // 'H'
FL_DARK2 = 45, // 'N'
FL_DARK1 = 47, // 'P'
FL_BACKGROUND_COLOR = 49, // 'R' default background color
FL_LIGHT1 = 50, // 'S'
FL_LIGHT2 = 52, // 'U'
FL_LIGHT3 = 54, // 'W'
// FLTK provides a 5x8x5 color cube that is used with colormap visuals
FL_BLACK = 56,
FL_RED = 88,
FL_GREEN = 63,
FL_YELLOW = 95,
FL_BLUE = 216,
FL_MAGENTA = 248,
FL_CYAN = 223,
FL_DARK_RED = 72,
FL_DARK_GREEN = 60,
FL_DARK_YELLOW = 76,
FL_DARK_BLUE = 136,
FL_DARK_MAGENTA = 152,
FL_DARK_CYAN = 140,
FL_WHITE = 255
};
#define FL_FREE_COLOR (Fl_Color)16
#define FL_NUM_FREE_COLOR 16
#define FL_GRAY_RAMP (Fl_Color)32
#define FL_NUM_GRAY 24
#define FL_GRAY FL_BACKGROUND_COLOR
#define FL_COLOR_CUBE (Fl_Color)56
#define FL_NUM_RED 5
#define FL_NUM_GREEN 8
#define FL_NUM_BLUE 5
FL_EXPORT Fl_Color fl_inactive(Fl_Color c);
FL_EXPORT Fl_Color fl_contrast(Fl_Color fg, Fl_Color bg);
FL_EXPORT Fl_Color fl_color_average(Fl_Color c1, Fl_Color c2, float weight);
inline Fl_Color fl_lighter(Fl_Color c) { return fl_color_average(c, FL_WHITE, .67f); }
inline Fl_Color fl_darker(Fl_Color c) { return fl_color_average(c, FL_BLACK, .67f); }
inline Fl_Color fl_rgb_color(uchar r, uchar g, uchar b) {
if (!r && !g && !b) return FL_BLACK;
else return (Fl_Color)(((((r << 8) | g) << 8) | b) << 8);
}
inline Fl_Color fl_rgb_color(uchar g) {
if (!g) return FL_BLACK;
else return (Fl_Color)(((((g << 8) | g) << 8) | g) << 8);
}
inline Fl_Color fl_gray_ramp(int i) {return (Fl_Color)(i+FL_GRAY_RAMP);}
inline Fl_Color fl_color_cube(int r, int g, int b) {
return (Fl_Color)((b*FL_NUM_RED + r) * FL_NUM_GREEN + g + FL_COLOR_CUBE);}关于返回FL_COLOR枚举的静态类定义,我一直不能理解下面的类中发生了什么。我不明白Fl_Color怎么会有任何关于颜色类的知识,以及编译器怎么会知道如何将Fl_Color转换成颜色。我确实意识到颜色有一个隐式的Fl_Color转换,但我不认为转换是双向的。这是怎么回事?编译器是否只是调用构造函数并将返回值作为第一个参数传递?
发布于 2009-12-04 02:55:57
返回Color的静态方法都返回对fl_rgb_color的调用结果。
fl_rgb_color返回一个Fl_Color,而Color有一个没有标记为explicit的单参数构造函数,并且引用了一个常量Fl_Color,因此这是一个有效的隐式转换。
fl_rgb_color的返回值是临时的,但是因为Color通过const引用接受Fl_Color参数,所以将临时参数绑定到构造函数参数是合法的。它的生命周期一直持续到Color对象(本身也是返回值的临时对象)的构造完成为止。
发布于 2009-12-04 02:53:51
在返回之前在F1_color上隐式运行颜色构造函数
发布于 2009-12-04 02:55:43
颜色的构造函数接受一个Fl_Color参数,因此编译器将在必要时隐式地使用它将Fl_Color转换为颜色。对于只接受单个参数且未使用explicit关键字标记的C++构造函数来说,这是正常行为。
https://stackoverflow.com/questions/1842050
复制相似问题