我正在使用fltk 1.3.2。 我用
设置了按钮的标签颜色_button->labelcolor(fl_rgb_color(162, 60, 62));
但是当我按下按钮时,颜色会改变。
我无法找到设置活动标签颜色的功能。
有谁知道怎么做?
编辑: 我在创建窗口之前使用Fl :: background()和Fl :: foreground()函数。这就产生了问题。
EDIT2:
此示例显示了该问题。
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Button.H>
#include <iostream>
void HitMe(Fl_Widget* w)
{
std::cout << "Ouch" << std::endl;
}
int main(int argc, char ** argv)
{
Fl::background(0x60, 0x66, 0x60);
Fl_Window *window = new Fl_Window(320,130);
Fl_Button *b = new Fl_Button(10, 10, 130, 30, "A red label");
b->labelcolor(fl_rgb_color(162, 60, 20));
b->callback(HitMe);
window->end();
window->show(argc,argv);
return Fl::run();
}
当我注释掉Fl :: background()函数时,一切都没问题。
答案 0 :(得分:1)
您所看到的是对比色(请参阅下面注释掉的代码)。按下按钮时FLTK执行此操作。它获取按钮的颜色,根据前景色和背景色计算出对比色。有关详细信息,请查看fl_contrast的帮助。
基本上,如果有足够的对比度,它会使用前景色,否则会为你的背景找到对比色。
你能做些什么?
使用自己的绘制方法制作自己的按钮类型
class KeepFGButton:public Fl_Button { 上市: KeepFGButton(int x,int y,int w,int h,const char * s) :Fl_Button(x,y,w,h,s) { }
void draw() {
if (type() == FL_HIDDEN_BUTTON) return;
Fl_Color col = value() ? selection_color() : color();
draw_box(value() ? (down_box() ? down_box() : fl_down(box())) : box(), col);
draw_backdrop();
// Remove the code that changes the contrast
//if (labeltype() == FL_NORMAL_LABEL && value()) {
// Fl_Color c = labelcolor();
// labelcolor(fl_contrast(c, col));
// draw_label();
// labelcolor(c);
//}
//else
draw_label();
if (Fl::focus() == this) draw_focus();
}
};
int main(int argc,char ** argv) { Fl :: background(0x60,0x66,0x60);
Fl_Window *window = new Fl_Window(320, 130);
Fl_Button *b = new KeepFGButton(10, 10, 130, 30, "A red label");
...
答案 1 :(得分:0)
尝试以下操作,让我知道,当您运行它时,标签是否变为白色。如果它没有,那么你可能正在做的其他事情并不完全正确。如果是的话,我不知道问题是什么。
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Button.H>
#include <iostream>
void HitMe(Fl_Widget* w)
{
std::cout << "Ouch" << std::endl;
}
int main(int argc, char ** argv) {
Fl_Window *window = new Fl_Window(320,130);
Fl_Button *b = new Fl_Button(10, 10, 130, 30, "A red label");
b->labelcolor(fl_rgb_color(162, 60, 20));
b->callback(HitMe);
window->end();
window->show(argc,argv);
return Fl::run();
}
答案 2 :(得分:0)
这对帮助作者肯定为时已晚,但是如果这可以帮助其他人寻找FLTK中仍然重要的问题的答案,我将提供我的解决方案:
如果您深入研究FLTK 1.3.4-2的源代码(截至本文时为当前稳定版本),则有两个内置的色图索引,在调用阴影框或框的图形时会引用这些索引: FL_DARK3
(用于方框)和FL_DARK2
(用于Fl_Scroll
中的滚动条背景色)。您可以查看this FLTK documentation,了解如何在运行时将这些颜色重置为所需的颜色。特别是,当背景很暗时,就会看到这个丑陋的红色默认乱七八糟的东西,对我来说,将它们设置为覆盖框颜色稍亮的版本,效果很好:
Fl_Color boxColor = 0x88888800;
Fl_Color boxShadowColor = 0xaaaaaa00;
Fl::set_color(FL_DARK3, boxShadowColor);
Fl::set_color(FL_DARK2, boxShadowColor);
现在按照上面的步骤创建标签,显示屏将没有红色阴影。 N.b.也可以覆盖标准的background2()
行为,该行为会将FL_BACKGROUND_COLOR
重置为fl_contrast
产生的行为:
Fl::set_color(FL_BACKGROUND2_COLOR, yourBgColor);
同一技巧适用于其他难以重设的颜色,例如FL_INACTIVE_COLOR
和FL_SELECTION_COLOR
。
希望这种解决方法有所帮助。