tab1.add(glWindow2);
window->show();
создает это изображение:

Но если я поставлю вызов add после window->show:
window->show();
tab1.add(glWindow2);
Вместо этого он выдает следующее:

И никакие провокации пользователя (переключение вкладок, сворачивание и разворачивание окна) никогда не приведут к тому, что вторая сфера будет видна. И все же, проверив вывод этой строки в отладчике:
Fl_Widget * const *kids = tab1.array();
Показывает, что tab1 действительно имеет двух дочерних элементов.
Итак, когда add работает и как он работает, и какая еще операция может потребоваться, чтобы она действительно вступила в силу? На самом деле речь идет о том, что я воскрешаю какой-то код 20-летней давности, который раньше работал, но около 10 лет назад он сломался именно в этом месте. Мне бы хотелось узнать, что изменилось.
Программа:
#include
#include
#include
#include
#include
#include
void glutWireSphere (GLdouble radius, GLint slices, GLint stacks);
class MyGlWindow : public Fl_Gl_Window {
private:
float blue;
public:
MyGlWindow(int x, int y, int w, int h, float bblue = 0.0f,
const char* l = 0) : Fl_Gl_Window(x, y, w, h, l) {
blue = bblue;
}
void draw() override {
if (!valid()) {
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glViewport(0, 0, w(), h());
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 5.0);
glEnable(GL_DEPTH_TEST);
valid(1);
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// Set up the camera
gluLookAt(0.0, 0.0, 4.5, // eye position
0.0, 0.0, 0.0, // look-at position
0.0, 1.0, 0.0); // up direction
// Draw a sphere
glColor3f(0.5, 1.0, blue);
glutWireSphere(0.8, 20, 20);
glFlush();
}
};
int main() {
Fl_Window* window = new Fl_Window(400, 800, "FLTK Sphere Example");
Fl_Tabs mainTabs(0,5,window->w(),window->h()-32);
Fl_Group tab1(0,20,window->w(),window->h()-32, "Tab 1");
MyGlWindow* glWindow = new MyGlWindow(10, 60, window->w() - 20, 400 - 20, 0.0);
tab1.end();
MyGlWindow* glWindow2 = new MyGlWindow(10, 450, window->w() - 20, 400 - 20, 1.0);
Fl_Group tab2(0,64,window->w(),window->h()-32, "Tab2");
MyGlWindow* glWindow3 = new MyGlWindow(10, 100, window->w() - 20, 400 - 20, 0.5);
tab2.end();
mainTabs.end();
window->resizable(window);
window->end();
tab1.add(glWindow2);
window->show();
Fl_Widget * const *kids = tab1.array();
return Fl::run();
}
Подробнее здесь: https://stackoverflow.com/questions/785 ... ake-effect
Мобильная версия