Доброго времени суток, кто работал с 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());
}
Система ресайза вроде как гибкая, но постичь дзен я пока не смог :(