Adapted from Stephen J.
Chenney's Tutorial
Modified by Yu-Chi Lai at 2005
Modified by Chi Man Liu in 2007
This tutorial will introduce you to use the command arguments.
Lets get started.
#include <iostream> // For output operation #include <FL/Fl.H> // For Fundatmental FLTK operation #include <FL/Fl_Window.H> // For the Fl_Winow class #include <FL/Fl_Double_Window.H> // For the Fl_Double_Window class #include <FL/Fl_Value_Slider.H> // For the Slider class #include <FL/Fl_Button.H> // For the button class #include "EventBox.h" // For our own widget class event box
// Set up the container window win = new Fl_Window(300, 300, "Example Window"); ... // Add components into window and also initialize each component. // The end of window component definition win->end(); // make the window show up win->show(); return Fl::run();
// Put in our own widget box = new EventBox(40, 20, 220, 220); // make the box show up box->show(); // Put in Slider and text indicator // The time slider slider = new Fl_Value_Slider(20, 270, 250, 25); // Set up the type of the slider slider->type(FL_HOR_SLIDER); // Set up the boundary of the slider slider->bounds(1.0, 24.0); // Set up the default value slider->value(25.0); // Set up the callback function slider->callback(Slider_Callback); // Show up the slider slider->show(); // put a button in button = new Fl_Button(220, 270, 75, 25, "Change"); button->callback(Button_Callback);
Fl_Window* win = NULL; // The main window pointer Fl_Button* button = NULL; // The button pointer EventBox* box = NULL; // The pointer to the box Fl_Value_Slider* slider = NULL; // The pointer to the slider who will change label size
//**************************************************************************** // // * The slider callback function //============================================================================= void Slider_Callback(Fl_Widget *w) //============================================================================= { int label_size = (int)slider->value(); printf("The label size is %d\n", label_size); box->labelsize(label_size); box->damage(1); }
//**************************************************************************** // // * The button callback function //============================================================================= void Button_Callback(Fl_Widget *w) //============================================================================= { static int flag = true; // Flag to control whether print out "Hello" or "Bye" if(flag) { box->label("Bye"); flag = false; } else { box->label("Hello"); flag = true; } box->damage(1); }
Step 2: Add eventBox Class in
For our own widget, we need to add in two extra files, eventBox.cpp and eventBox.h. Inside the eventBox.h, we need to overwrite the Fl_Box's default functions for the constructor and event handler. Thus we declare it inside the class
#ifndef __EVENTBOX_H #define __EVENTBOX_H #include <FL/Fl_Box.H> class EventBox: public Fl_Box // Inherit the Fl_Box class { public: // Constructor EventBox(int t, int l, int width, int height); // Event handler int handle(int e); }; #endif
Inside the eventBox.cpp, we first need to add the declaration header of these function.
#include "EventBox.h"
We have constructor to set up the default values for fields inside the box.
//*********************************************************************** // // * Constructor //======================================================================= EventBox::EventBox(int t, int l, int width, int height) :Fl_Box(FL_UP_BOX, t, l, width, height, "") //======================================================================= { // Set up the label labelfont(FL_ITALIC); // Set up the label size labelsize(24); // Set up the label style labeltype(FL_SHADOW_LABEL); // Set up text inside the box label("Hello"); }
Then, we have event handler. We use a switch{...} to choose the event we would like to put action on. We give a detail comment next to each interesting event beside the case ...:
//*********************************************************************** // // * Handle the event happening in this box //======================================================================= int EventBox::handle(int e) //======================================================================= { switch(e) { case FL_ENTER: // When the cursor enters this box // Change the color to red color (FL_RED); // Change the label to black labelcolor(FL_BLACK); // Notify window to redraw is needed damage(1); return 1; case FL_LEAVE: // When the cursor leave this box // Change the color to gray color(FL_GRAY); // Change the label to black labelcolor(FL_BLACK); // Notify window to redraw is needed damage(1); return 1; case FL_PUSH: // When mouse button is pushing // Change the color to blue labelcolor(FL_BLUE); // Notify window to redraw is needed damage(1); return 1; case FL_RELEASE: // When release the mouse button // Change the label color to black labelcolor(FL_BLACK); damage(1); return 1; case FL_DRAG: // When drag the mouse button // Set the label to yellow labelcolor(FL_YELLOW); damage(1); return 1; default: return Fl_Box::handle(e); }; }