fltk设置按钮的活动标签颜色

时间:2014-09-14 07:28:25

标签: fltk

我正在使用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()函数时,一切都没问题。

3 个答案:

答案 0 :(得分:1)

您所看到的是对比色(请参阅下面注释掉的代码)。按下按钮时FLTK执行此操作。它获取按钮的颜色,根据前景色和背景色计算出对比色。有关详细信息,请查看fl_contrast的帮助。

基本上,如果有足够的对比度,它会使用前景色,否则会为你的背景找到对比色。

你能做些什么?

  1. 什么也不做 - 就是这样
  2. 选择较浅的背景颜色,以满足对比度条件
  3. 使用自己的绘制方法制作自己的按钮类型

    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_COLORFL_SELECTION_COLOR

希望这种解决方法有所帮助。