Funkcje callback FLTK

Callback - Akcja i Reakcja

#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Button.H>

void buton_callback( Fl_Widget* o, void*  ) {
   Fl_Button* b=(Fl_Button*)o;
   b->label("Jestem Kliknięty");
   b->redraw();
 }

int main(int argc, char **argv) {
  Fl_Window *window = new Fl_Window(600,300);
  //button zwykły
   Fl_Button *but = new Fl_Button(10,10,140,100,"Kliknij mnie!");
   but->callback( buton_callback );

  window->end();
  window->show(argc, argv);
  return Fl::run();
}
Powyższy przykład zawiera przycisk, który po kliknięciu zmieni swój tekst. Stosujemy tutaj funkcję FLTK callback do zmiany parametrów widgeta (niekoniecznie tego samego) w przypadku zajścia jakiegoś zjawiska. Domyślnie jest to np. kliknięcie w buttona lecz można zdefiniować kiedy funkcja callback ma zostać wywołana:
button->when(FL_WHEN_NEVER); // nigdy :)
button->when(FL_WHEN_CHANGED); // gdy zmieniony
button->when(FL_WHEN_RELEASE); // gdy puszczony
button->when(FL_WHEN_RELEASE_ALWAYS); // zawsze gdy puszczany
button->when(FL_WHEN_ENTER_KEY); // gdy wprowadzono klucz
button->when(FL_WHEN_ENTER_KEY_ALWAYS); // zawsze gdy wprowadzono klucz
button->when(FL_WHEN_CHANGED | FL_WHEN_NOT_CHANGED);

but->when(FL_WHEN_RELEASE);
but->callback( buton_callback );
Jeżeli dokonamy modyfikacji podanej na końcu to zobaczymy że tekst buttona zmieni się dopiero po puszczeniu przycisku.
Bardziej skomplikowany przykład obejmuje przekazywanie danych między widgetami:
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_Multiline_Input.H>
#include <FL/Fl_Help_View.h>

 void buton_callback( Fl_Widget* o , void* ) {
   Fl_Button* b=(Fl_Button*)o;
    Fl_Multiline_Input* iw = (Fl_Multiline_Input*) b -> parent() -> child(1);
    Fl_Help_View* ow = (Fl_Help_View*) b -> parent() -> child(2);
    ow->value( iw->value() );
   b->redraw();
 }

int main() {
  Fl_Window *window = new Fl_Window(600,300);
  //button zwykły
   Fl_Button *but = new Fl_Button(190,150,140,100,"Parsuj"); // child 0
   but->when(FL_WHEN_RELEASE);
   but->callback( buton_callback );

  // Fl_Multiline_Input - wielowierszowe wprowadzanie tekstu
  Fl_Multiline_Input *inp3 = new Fl_Multiline_Input(390,30,140,100,"Podaj kod HTML:"); // child 1
   
// wyświetla tekst, parsuje podstawowe tagi HTML
  Fl_Help_View *inp7 = new Fl_Help_View(30,30,140,100,"Wynik:"); // child 2
   
  window->end();
  window->show();
  return Fl::run();
}
W polu Fl_Multiline_Input podajemy tekst/HTML, klikamy w przycisk i w polu Fl_Help_View wyświtli się on a podstawowe tagi zostaną sparsowane. parent() to okno, a child() to utworzone widgety. Cały bajer sprowadza się do ustawienia nowego value() dla Fl_Help_View.
RkBlog

C/C++ i Java, 14 July 2008

Comment article
Comment article RkBlog main page Search RSS Contact