Advanced  Services Fl_Box,  Fl_File_Chooser,  Fl_JPEG_Image Back Next Up Home


Vorspann


Hier kommen einige Programmbeispiele ohne nähere Erläuterungen.


Fl_Box



/*
   ein hauptfenster, das mehrere boxen enthält
   wichtig ist es, den typ der box anzugeben,
   sonst kann es passieren, daß die box garnicht angezeigt wird

   die boxtypen mit frame (FL_UP_FRAME etc.) übernehmen die hintergundfarbe des frames
   in dem sie liegen, man kann keine eigene farbe setzen

   boxen können ineinander geschachtelt werden

*/

#include <Fl.H>
#include <Fl_Window.H>
#include <Fl_Box.H>
#include <Fl_Button.H>
#include <Enumerations.H>   // Fl_Boxtype::FL_DOWN_BOX  etc.
#include <stdio.h>


void buttonAction(Fl_Widget* o, void*);


int main()
{
   Fl_Window win(200,200,700,700, "Hello Box");
   win.size_range(150,100);  // minimale größe dadurch resizable
   Fl_Color winColor = fl_rgb_color(220,230,240);
   win.color(winColor);

   // box anlegen
   Fl_Box box(Fl_Boxtype::FL_DOWN_BOX, 20, 40, 200, 150, "hallo");
   //hintergrundfarbe setzen
   Fl_Color boxColor = fl_rgb_color(240,230,220);
   box.color(boxColor);  // wird nicht angezeigt, doch, wenn man typ angibt
   box.label("Fl_Boxtype::FL_DOWN_BOX");  //

   // noch ne box anlegen
   Fl_Box box2(Fl_Boxtype::FL_ENGRAVED_BOX, 240, 40, 230, 150, "");
   //hintergrundfarbe setzen
   Fl_Color box2Color = fl_rgb_color(220,240,230);
   box2.color(box2Color);  // wird angezeigt wenn man typ angibt
   box2.label("Fl_Boxtype::FL_ENGRAVED_BOX");  //
   // ist die schrift zu lang wird sie trotzdem angezeigt und ragt über die box hinaus

   // box3 anlegen
   Fl_Box box3(Fl_Boxtype::FL_UP_FRAME, 490, 40, 190, 150, "");
   //hintergrundfarbe setzen
   //Fl_Color box3Color = fl_rgb_color(200,180,180);
   //box3.color(box3Color);  // wird nicht angezeigt
   // alle frametypen übernehmen die farbe des fensters !!
   box3.label("Fl_Boxtype::FL_UP_FRAME");  //

   // box4 anlegen
   Fl_Box box4(Fl_Boxtype::FL_BORDER_BOX, 20, 210, 450, 200, "");
   // wenn man den boxtype angibt wird der hintergrund gezeichnet
   //hintergrundfarbe setzen
   Fl_Color box4Color = fl_rgb_color(200,180,180);
   box4.color(box4Color);
   box4.label("Fl_Boxtype::FL_BORDER_BOX");  //
   box4.align(FL_ALIGN_INSIDE | FL_ALIGN_LEFT | FL_ALIGN_TOP);

   // box5 anlegen innerhalb box4, das geht
   Fl_Box box5(Fl_Boxtype::FL_EMBOSSED_BOX, 220, 310, 230, 50, "");
   //hintergrundfarbe setzen
   Fl_Color box5Color = fl_rgb_color(200,220,220);
   box5.color(box5Color);
   box5.label("Fl_Boxtype::FL_EMBOSSED_BOX");  //
   box5.labeltype(FL_EMBOSSED_LABEL);

   Fl_Button button(20, 0, 200, 30);   //  0,0 ist die linke obere ecke unterhalb der titelleiste
   button.label("change the color of small box");  // text auf dem button
   button.callback(buttonAction, &box5);  // hier wird der pointer auf die box mit übergeben

   win.show();

   return Fl::run();
}


/*
   reaktion auf den buttonclick
   über den void-pointer kann man auf wird die zu manipulierende box zugreifen
*/

void buttonAction(Fl_Widget* source, void* v)
{
   Fl_Box* boxP = (Fl_Box*)v;

   Fl_Color oldColor = boxP->color();
   Fl_Color grey = fl_rgb_color(200,200,200);
   Fl_Color boxColor = fl_rgb_color(200,220,220);

   if( oldColor == grey)
      boxP->color(boxColor);
   else
      boxP->color(grey);

   boxP->redraw();  // notwendig !
}


Und so sieht das aus:

boxen.jpg




Ein Bild anzeigen



/*
   ein bild laden und darstellen

   zusätzliche libraries werden gebraucht
   fltkimagesd.lib
   fltkjpegd.lib
   fltkpngd.lib
   fltkzd.lib

   auch wenn man nur JPG anzeigt werden alle libraries gebraucht

   insgesamt z.bsp:

   C:\fltk\fltk-1.1.9\lib\fltkd.lib
   C:\fltk\fltk-1.1.9\lib\fltkimagesd.lib
   C:\fltk\fltk-1.1.9\lib\fltkjpegd.lib
   C:\fltk\fltk-1.1.9\lib\fltkpngd.lib
   C:\fltk\fltk-1.1.9\lib\fltkzd.lib
   wsock32.lib comctl32.lib

   ein image muß in einer box angezeigt werden
   (ohne typangabe wird eine leere box wird nicht dargestellt)

   box->image(image);       //das FLTK-Bild "image" wird an die Box übergeben
   box->label(file);        //das Label der Box erhält den Pfad der Datei
   box->redraw();           //veranlasst das erneute Zeichnen der Box picture in unserem Hauptfenster

   das bild wird nur gezeichnet, wenn man es in eine box legt,
   das bild liegt dann aber "über der box"
   macht man die box kleiner als das bild, sieht man sie nicht

*/

#include <Fl.H>
#include <Fl_Window.H>
#include <Fl_Box.H>
#include <Fl_Shared_Image.H>  // fl_register_images() !
#include <Fl_JPEG_Image.H>
#include <Enumerations.H>   // für die boytypen
#include <stdio.h>


int main()
{
   fl_register_images();

   //pfad zu einer bilddatei
   char* file = "../quappi.jpg";
   // bildobjekt anlegen
   Fl_JPEG_Image* image = new Fl_JPEG_Image(file);

   // bildgröße ermitteln
   int height = image->h() ;
   int width = image->w() ;

   printf("breite = %d\nhoehe = %d\n", width, height);
   // mein bild hat w=350, h=461

   Fl_Window win(200,200, width+100, height + 100, "Hello Image");
   win.size_range(150,100);  // minimale größe dadurch resizable
   Fl_Color winColor = fl_rgb_color(220,230,240);
   win.color(winColor);

   // box zentrieren
   int boxWidth = width + 40;
   int boxHeight = height + 60;
   int x = (win.w() - boxWidth)/2;
   int y = (win.h() - boxHeight)/2;
   // box so groß machen, daß das bild reinpaßt und ein rahmen von 20 pixeln rundherum ist.
   // bei der höhe nochmal 20 pixel für die schrift dazu

   // box anlegen
   Fl_Box box(Fl_Boxtype::FL_DOWN_BOX, x, y, boxWidth, boxHeight, "hallo");

   //hintergrundfarbe setzen
   Fl_Color boxColor = fl_rgb_color(240,230,220);
   box.color(boxColor);

   // bild in die box
   box.image(image);     // attach jpg image to box
   box.label("max beckmann quappi in blau");  // erscheint unter dem bild

   win.show();

   return Fl::run();
}


Und so sieht das aus:

quappi.jpg



Einen Filechooser auf Buttonclick öffnen und ein Bild laden



/*
   einen filechooser öffnen auf buttonclick
   einen filechooser konfigurieren
   ein jpeg-bild darstellen

   weitere imageheader

    Fl_GIF_Image
    Fl_JPEG_Image
    Fl_PNG_Image
    Fl_PNM_Image
    Fl_XBM_Image
    Fl_XPM_Image
   Fl_Bitmap

*/

#include <Fl.H>
#include <Fl_Window.H>
#include <Fl_Box.H>
#include <Fl_Button.H>
#include <Fl_JPEG_Image.H>
#include <Fl_JPEG_Image.H>
#include <Fl_Shared_Image.H>  // für fl_register_images() !
#include <Fl_File_Chooser.H>
#include <Enumerations.H>   // für die boytypen
#include <stdio.h>


void buttonAction(Fl_Widget* o, void*);


int main()
{
   Fl_Window win(200,200,700,700, "Hello Image");
   win.size_range(150,100);  // minimale größe dadurch resizable
   Fl_Color winColor = fl_rgb_color(220,230,240);
   win.color(winColor);

   // box anlegen unterhalb des buttons, so breit wie das fenster
   Fl_Box box(Fl_Boxtype::FL_DOWN_BOX, 0, 30, 700, 700, "");
   //hintergrundfarbe setzen
   Fl_Color boxColor = fl_rgb_color(240,230,220);
   box.color(boxColor);

   Fl_Button button(0, 0, 100, 30);   //  x=0,y=0 ist die linke obere ecke unterhalb der titelleiste
   button.label("Bild laden");  // text auf dem button
   button.callback(buttonAction, &box);

   win.show();

   return Fl::run();
}


/*
   öffnet einen filechooser
   es muß die funktion gerufen werden, wenn man ein objekt anlegt ist es lokal
   und da die callbackfunktion sich sofort wieder beendigt, ist der filechooser
   gleich wieder futsch.
   über den void*-parameter wird die box übergeben, so kann man diese
   an die bildgröße anpassen

   über die methode
   Fl_Window* winP = boxP->window();
   bekommt man zugriff auf das hauptfenster

   damit ist es in buttonAction möglich
   1) ein neues bild in die box aufzunehmen
   2) die boxgröße der bildgröße anzupassen
   3) die fenstergröße der boxgröße anzupassen

   der filechooser ist übrigens hübsch hässlich...

*/

void buttonAction(Fl_Widget* source, void* v)
{
   static int i = 0;
   char dest[30] ;
   sprintf(dest, "button pressed %d", ++i);
   printf("%s\n", dest);

   // konfiguration des filechoosers
   char* title = "Datei öffnen";
   char* pattern = "Bild (*.{jpg,png,gif,bmp})\t";
   char* fName = "d:\\";
   int relative = 0;
   // filechooser öffnen
   char* choice = fl_file_chooser(title, pattern, fName, relative);
   printf("choice = %s\n", choice);

   if( choice==NULL) return;  // für den fall, daß die auswahl abgebrochen wird

   // keine prüfung, welche art bilddatei gewählt wurde
   Fl_JPEG_Image* image = new Fl_JPEG_Image(choice);
   int imHeight = image->h() ;
   int imWidth = image->w() ;

   Fl_Box* boxP = (Fl_Box*)v;
   Fl_Window* winP = boxP->window();
   // so bekommt man das hauptfenster !!

   int winHeight = image->h() ;
   int winWidth = image->w() ;
   int x = winP->x();
   int y = winP->y();

   boxP->image(image);
   boxP->resize( 0, 30, imWidth + 40, imHeight + 60);
   winP->resize(x, y, imWidth + 80, imHeight + 110);
   winP->size_range(150,100);  // minimale größe muß erneut gesetzt werden,
   // sonst geht eigenschaft resizable verloren.

   boxP->redraw();
   winP->redraw();

}



Und so sieht das aus:

filechooser.jpg

hase.jpg



Eine Unterklasse von Box zum Zeichnen Einrichten



/*

   FL_Box ableiten und zum Zeichnen einrichten

*/

#include <Fl.H>
#include <FL/fl_draw.H>
#include <Fl_Window.H>
#include <Fl_Box.H>

#include <stdio.h>

// eine unterklasse von Fl_Box zum Zeichnen herrichten
// sollte natürlich in eine eigene cpp mit eigenem header...

class DrawBox : public Fl_Box
{
public:
     DrawBox(int x, int y, int w, int h, const char*l=0) : Fl_Box(x, y, w, h, l)
    {
     }

    void draw()
    {
         // koordinatensystem zeichnen
        fl_color(FL_BLACK);
      fl_xyline(x()+10 , y()+h()-30 , x()+w()-30 ) ;  // x-achse
      fl_draw("x", x()+w()-20, y()+h()-27) ;

      fl_yxline(x()+30 , y()+h()-10, y()+40 ) ; // y-achse
      fl_draw("y", x()+28, y()+30) ;
     }
};


int main()
{
   Fl_Window win(200,200,700,700, "Hello Drawing");
    DrawBox drawBox(0, 0, win.w(), win.h());
    win.resizable(drawBox);
   win.show();
   return Fl::run();
}



Und so sieht das aus:

drawing.jpg

top Back Next Up Home