2014-09-14 6 views
0

Я использую fltk 1.3.2. я установить цвет метки баттона сfltk кнопка активной кнопки ярлыка

_button->labelcolor(fl_rgb_color(162, 60, 62)); 

, но при нажатии на кнопку, цвет меняется.

Я не мог найти функцию, как установить цвет активной метки.

Кто-нибудь знает, как это сделать?

Редактировать: Перед созданием окна я использую функции Fl :: background() и Fl :: переднего плана(). Это создает проблему.

Редакция 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(), все в порядке.

+0

Является ли это на Windows, или Linux - это работает на Windows. – cup

+0

он находится на os x. Я постараюсь с Windows в ближайшее время. –

+0

Не могли бы вы видеть downcolor?FLTK позволяет установить цвет ярлыка, цвет, down_color, – cup

ответ

1

Что вы видите, это контрастный цвет (см. Приведенный ниже код). FLTK делает это при нажатии кнопки. Он получает цвет кнопки, выдает контрастный цвет на основе цветов переднего плана и фона. Посмотрите на помощь для fl_contrast для получения более подробной информации.

В принципе, если есть достаточно контраста, он будет использовать цвет переднего плана, иначе он найдет контрастный цвет для вашего фона.

Что вы можете сделать?

  1. ничего не делать - это, как это
  2. выбрать более светлый цвет фона, который будет удовлетворять контрастные условиям
  3. сделать свой собственный тип кнопки со своим собственным методом вытяжки

    классом KeepFGButton: общественным Fl_Button { общественности: KeepFGButton (целое х, у INT, Int W, Int ч, Const символ * с) : Fl_Button (х, у, ш, ч, с) { }

    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"); 
    

    ...

+0

Спасибо, @cup, я надеюсь, что в будущих версиях fltk это можно сделать проще. Я выберу другой цвет, чтобы решить проблему, я не хочу бороться с этим. –

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(); 
} 
+0

ваш код работает хорошо. Наклейка кнопки красная. После этого я добавляю разницу в моем коде (я добавляю функции b-> (FL_NO_BOX) и b-> down_box (FL_NO_BOX)), и он также работает хорошо. Наконец я обнаружил виновных. Я использую Fl :: background (0x60, 0x66, 0x60); и Fl :: передний план (0xAC, 0xAC, 0xAC); этот Fl :: background делает это неправильно. Не могли бы вы попробовать с Fl: background() в начале кода? –

+0

Можете ли вы просто опубликовать код, а не описывать его. Трудно сказать из описания, какая часть на первом месте, а какая часть - следующая. – cup

+0

Извините, ... int main (int argc, char ** argv) {Fl :: background (0x60, 0x66, 0x60); Fl :: передний план (0xAC, 0xAC, 0xAC); Fl_Window * window = new Fl_Window (320, 130); ... –