LINUX.ORG.RU

FLTK не могу понять, как работает resize ?


0

1

Доброго времени суток, кто работал с FLTK, растолкуйте на пальцах, как работает resize? Не могу понять, а мануал на сайте какой-то куцый :( Значит, у меня окно, на котором лежит, меню, два скроллбара и табы. Ресайзю окошко, но вместе с ним, изменяется размер табов и нижнего скроллбара + вложженый в таб GL_Window тоже не до конца растягивается.

#include <FL/Fl.H>
#include <FL/Fl_Gl_Window.H>
#include <FL/Fl_Scroll.H>
#include <FL/Fl_Box.H>
#include <FL/Fl_Menu_Bar.H>
#include <FL/Fl_Tabs.H>
#include <FL/Fl_Double_Window.H>
#include <FL/gl.h>


#define CLIENT_WIDTH 1024
#define CLIENT_HEIGHT 700
#define SCROLL_SIZE 16
#define MENUBAR_SIZE 24

extern int FL_NORMAL_SIZE;

class MyGlWindow : public Fl_Gl_Window {
    // DRAW METHOD
    //      OpenGL window: (w,h) is upper right, (-w,-h) is lower left, (0,0) is center
    //
    void draw() {
        // First time? init viewport, etc.
        if (!valid()) {
            valid(1);
            glLoadIdentity();
            glViewport(0,0,w(),h());
            glOrtho(0, w(), 0, h(), -1, 1);
        }

        glClearColor(0.916, 0.928, 0.948, 0.0);
        glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
        // Draw white 'X'
        glColor3f(0.0, 0.0, 0.0);
        glBegin(GL_QUADS);
            glVertex2f(10, 10);
            glVertex2f(10, 30);
            glVertex2f(30, 30);
            glVertex2f(30, 10);
        glEnd();

        glBegin(GL_LINE_STRIP); glVertex2f(100, 100); glVertex2f(200,150); glEnd();
    }

    void resize(int X,int Y,int W,int H) {
        Fl_Gl_Window::resize(X,Y,W,H);
        glLoadIdentity();
        glViewport(0,0,W,H);
        glOrtho(0,W,0,H,-1,1);
        redraw();
    }
public:
    // CONSTRUCTOR
    MyGlWindow(int X,int Y,int W,int H,const char*L=0)
        : Fl_Gl_Window(X,Y,W,H,L) {
            box(FL_DOWN_BOX);
    }
};


// MAIN
int main() {
    Fl::scheme("gtk+");
    FL_NORMAL_SIZE = 12;
    Fl_Window win(CLIENT_WIDTH, CLIENT_HEIGHT, "OpenGL X");
    Fl_Menu_Bar* menu = new Fl_Menu_Bar(0, 0, CLIENT_WIDTH, MENUBAR_SIZE);
    menu->label("AAA");
    menu->add("&File/&Open",  "^o", NULL);
    menu->add("&File/&Save",  "^s", NULL, 0, FL_MENU_DIVIDER);
    menu->add("&File/&Preferences",  "^q", NULL, 0, FL_MENU_DIVIDER);
    menu->add("&File/&Quit",  "^q", NULL);

    menu->add("&Edit/&Cut",  "^c", NULL);
    menu->add("&Edit/&Copy",  "^co", NULL);
    menu->add("&Edit/&Paste",  "^p", NULL, 0, FL_MENU_DIVIDER);
    menu->add("&Edit/&Rotate",  "^p", NULL);

    menu->add("&View/Zoom In",  "^zi", NULL);
    menu->add("&View/Zoom Out",  "^zo", NULL);
    menu->add("&View/Fit size",  "^f", NULL, 0, FL_MENU_DIVIDER);
    menu->add("&View/Grid enable",  "^zo", NULL, 0, FL_MENU_TOGGLE);
    menu->add("&View/Grid size",  "^zo", NULL,0, FL_MENU_DIVIDER | FL_SUBMENU );
    menu->add("&View/Add view",  "^zi", NULL);
    menu->add("&View/Close current view",  "^zi", NULL);

    menu->add("&Draw/&Line",  "Ctrl+F6", NULL);
    menu->add("&Draw/&Rectangle",  "^F2", NULL);
    menu->add("&Draw/&Circle",  "^F3", NULL);
    menu->add("&Draw/&Arc",  "^F4", NULL);
    menu->add("&Draw/&Polygon",  "^F5", NULL);
    menu->add("&Draw/&Text",  "^F6", NULL);

    /* add submenu */
    for ( int t=0; t<menu->size(); t++ ) {                // walk array of items
        Fl_Menu_Item *item = (Fl_Menu_Item*)&(menu->menu()[t]);       // get each item
        printf("item name: %s\n", item->label());
        if(item->submenu()) {
            if(strcmp(item->label(), "Grid size") == 0) {
               // item.add("aaa",  "Ctrl+F6", NULL);
              //  item.add("bbb", 0, NULL, NULL);
              //item->labelcolor(fl_rgb_color(200, 0, 0));
               //item->labelfont(FL_ITALIC | FL_BOLD);

               //item->add("AAA", "", NULL,0, FL_SUBMENU_POINTER);
// подменю - отдельная песня, хз как правильно добавлять
               menu->add("&View/Grid size/0.24 mm ",  "", NULL);
               menu->add("&View/Grid size/0.5 mm ",  "", NULL);
               menu->add("&View/Grid size/1 mm",  "", NULL);
               menu->add("&View/Grid size/2 mm ",  "", NULL);
               menu->add("&View/Grid size/10 mm ",  "", NULL);

            }
        }
    }


    Fl_Tabs *tabs = new Fl_Tabs(0, MENUBAR_SIZE, CLIENT_WIDTH-SCROLL_SIZE, CLIENT_HEIGHT-SCROLL_SIZE);
    tabs->selection_color(fl_rgb_color(162 , 169, 175));
        Fl_Group group1(0, MENUBAR_SIZE*2, CLIENT_WIDTH-SCROLL_SIZE, CLIENT_HEIGHT-SCROLL_SIZE, "Super group 1");
            MyGlWindow mygl(0, MENUBAR_SIZE*2+5, CLIENT_WIDTH-SCROLL_SIZE, CLIENT_HEIGHT-SCROLL_SIZE-MENUBAR_SIZE*2-5);
        group1.end();
       // group1.resizable(mygl);
    tabs->end();

     // MyGlWindow mygl(0, 0, win.w(), win.h());
     Fl_Scrollbar vscroll(CLIENT_WIDTH-SCROLL_SIZE, MENUBAR_SIZE, SCROLL_SIZE, CLIENT_HEIGHT-SCROLL_SIZE-MENUBAR_SIZE);
     Fl_Scrollbar hscroll(0, CLIENT_HEIGHT-SCROLL_SIZE, CLIENT_WIDTH-SCROLL_SIZE, SCROLL_SIZE);
     hscroll.type(FL_HORIZONTAL);
     hscroll.slider_size(0.5);

     win.end();
     win.resizable(tabs);
     win.show();
     return(Fl::run());
}

Система ресайза вроде как гибкая, но постичь дзен я пока не смог :(

★★★★★
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.