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_COLOR
和 FL_SELECTION_COLOR
。
希望此解决方法有所帮助。
【讨论】:
以上是关于fltk 设置按钮的活动标签颜色的主要内容,如果未能解决你的问题,请参考以下文章
如何为状态 UIControlStateHighlighted 设置按钮标签文本颜色