2014-10-23 6 views
1

Я делаю простое приложение FLTK (в Linux), которое должно отображать PNG-изображения в FL_Window. Следующий код:C++ FLTK Image redraw

Fl_PNG_Image* pngImg; 
Fl_Box* boxImage; 
boxImage = new Fl_Box(500, 470, 0, 0); 
pngImg = new Fl_PNG_Image("main.png"); 
boxImage->image(pngImg); 
boxImage->redraw();` 

Рисование в порядке. Но когда я это нравится: enter image description here enter image description here enter image description here

Мои изображения Уничтожает. Какой обратный вызов мне нужно вызвать, чтобы избежать разрушения изображения? Как правильно обновить окно? Как перезагрузить изображение с диска mannualy?

+0

Что точно вы подразумеваете под «перемещением окна вне экрана»? – user3353819

+0

Я не могу воссоздать ошибку, но я на Mac, которая может обрабатывать управление окнами по-разному. Эта строка 'boxImage = new Fl_Box (500, 470, 0, 0);' беспокоит меня: вы определяете поле с нулевым размером. Попробуйте 'boxImage = new Fl_Box (500, 470, sx, sy);' где 'sx' - это ширина изображения, а' sy' - высота изображения и отчет ... – user3353819

+0

Другое дело, 'fl_register_images()', но просто проверка ... – user3353819

ответ

2

Попробуйте это: (источник: http://osdir.com/ml/lib.fltk.general/2004-07/msg00396.html)

Примечание: Так как я не могу восстановить свою ошибку, я не уверен, что он будет решать это, но кажется вероятным, что по какой-то причине главное окно не является перерисовываться, когда это должно быть.

Подкласс родительского окна и получить его сделать вручную перерисовывать его содержимое и подталкивать FLTK сделать это как можно скорее с Fl :: чек() всякий раз, когда он перемещается так, что у вас есть что-то вроде

class Mywin : public Fl_Window { 
    void resize(int X, int Y, int W, int H) { 
     Fl_Window::resize(X,Y,W,H); 
     redraw(); 
     Fl::check(); 
    } 
public: 
    Mywin(int x,int y,int w, int h) : Fl_Window(x,y,w,h) { 
    } 
}; 

int main() { 


    Mywin* win = new Mywin(20,20,800,800); 
    Fl_Box* box = new Fl_Box(100,100,300,200);//for example 


    Fl_PNG_Image* pngImg = new Fl_PNG_Image("main.png"); 
    box->image(pngImg); 
    box->show(); 
    win->end(); 
    win->show(); 
    return (Fl::run()); 
}