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

Posted

技术标签:

【中文标题】fltk 设置按钮的活动标签颜色【英文标题】:fltk setting button's active label color 【发布时间】:2014-09-14 07:28:24 【问题描述】:

我使用的是 fltk 1.3.2。 我用

设置按钮的标签颜色
_button->labelcolor(fl_rgb_color(162, 60, 62));

但是当我按下按钮时,颜色会改变。

我找不到设置活动标签颜色的函数。

有人知道怎么做吗?

编辑: 在创建窗口之前,我使用 Fl::background() 和 Fl::foreground() 函数。这就产生了问题。

编辑2:

这个例子说明了这个问题。

#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() 函数时,一切正常。

【问题讨论】:

这是在 Windows 上还是在 Linux 上 - 它可以在 Windows 上运行。 它在 os x 上。我很快就会尝试使用 Windows。 你能看到羽绒吗? FLTK允许你设置labelcolor、color、down_color、 我找到了 down_color 但不幸的是它没有用,我在 os x 上测试过。我现在在 Windows 上工作,尚未测试。 @cup 我也在 Windows 上试过。结果是一样的。如果我设置_button->labelcolor(FL_RED),它是红色的,但是当我点击它时,它变成白色。 【参考方案1】:

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

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

你能做些什么呢?

    什么都不做——就是这样 选择满足对比度条件的较浅的背景颜色

    使用自己的绘制方法制作自己的按钮类型

    类 KeepFGButton : 公共 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");
    

    ...

【讨论】:

谢谢@cup,我希望在未来的fltk版本中这可以变得更容易。我会选择不同的颜色来解决问题,我不想为此纠结。【参考方案2】:

尝试以下操作并告诉我,当您运行它时,标签是否变为白色。如果不是,那么您正在做的其他事情可能不太正确。如果是这样,我不知道是什么问题。

#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();

【讨论】:

您的代码运行良好。按钮标签为红色。之后我添加了我的代码差异(我添加了 b->box(FL_NO_BOX) 和 b->down_box(FL_NO_BOX) 函数),它也运行良好。最后我找到了罪人。我使用 Fl::background(0x60, 0x66, 0x60);和 Fl::foreground(0xAC, 0xAC, 0xAC);这个 Fl::background 弄错了。您可以在代码开头尝试使用 Fl:background() 吗? 你能不能只发布代码而不是描述它。从描述中很难分辨出哪个部分在前,哪个部分在后。 对不起,... int main(int argc, char ** argv) Fl::background(0x60, 0x66, 0x60); FL::前景(0xAC,0xAC,0xAC); Fl_Window *window = new Fl_Window(320, 130); ... 编辑您的原始问题并将其发布在此处。评论不太适合发布代码【参考方案3】:

这对于帮助作者来说肯定为时已晚,但如果这有助于其他人在 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);

现在像上面一样创建您的标签,显示将没有红色阴影。注意也可以覆盖标准的background2() 行为,它将FL_BACKGROUND_COLOR 重置为fl_contrast 产生的行为:

    Fl::set_color(FL_BACKGROUND2_COLOR, yourBgColor);

同样的技巧适用于其他难以重置的颜色,例如 FL_INACTIVE_COLORFL_SELECTION_COLOR

希望此解决方法有所帮助。

【讨论】:

以上是关于fltk 设置按钮的活动标签颜色的主要内容,如果未能解决你的问题,请参考以下文章

更改标签栏中活动整个部分的颜色 - iOS 7

如何更改ios7中非活动标签栏图标的颜色?

如何为状态 UIControlStateHighlighted 设置按钮标签文本颜色

无法在 SwiftUI 中的菜单内设置按钮标签的颜色

AngularJS - 选中时使用 ng-style 设置单选按钮标签的颜色

更改活动共享中按钮的色调颜色