C++FLTK如何从计时器函数内部重新绘制方框


如何从例程中调用box.redraw?我有一个计时器回调,从中我必须为box1分配一个新图片。我的程序在这一点上崩溃了。
...
Fl_Window *win = NULL;
Fl_Box *box1 = NULL;
static void get_new_pic(void*) {         // Timer callback
const char *filename = "pic2.png";
Fl_PNG_Image png(filename);  
box1->image(png);        
box1->redraw(); // this kicks the application
Fl::repeat_timeout(2,CB_Hole_Info);
}
int main() {
win = new Fl_Window(240,240);                 // make a window
box1 = new Fl_Box(0,0,240,180);            // widget that will contain image
const char *filename = "pic1.png";
Fl_PNG_Image png(filename);  
box1->image(png);        
Fl::add_timeout(2, get_new_pic, buff);        // setup a timer
win->show();
return(Fl::run());
} 

问候

您在超时时添加图像的方式是正确的。但是,您在堆栈上分配了图像:Fl_PNG_Image png(filename);,因此当您离开计时器时,图像会自动与堆栈一起删除。当实际绘制方框时,图像不再存在。

FLTK不复制图像。它只是链接到它。

您必须编写Fl_PNG_Image *png = new Fl_PNG_Image(filename);并修复代码的其余部分才能使用指针,并确保图像在最后被删除。

您将png1png2声明为全局变量(在get_new_pic()中使用(,但也在main()中声明了具有相同名称的局部变量;影子;全局变量。

请从main()中的两个赋值中删除Fl_PNG_Image *,以便这些赋值按预期使用全局变量。

提示:您还应该为类似的框指定一个实心背景

box1->box(FL_FLAT_BOX);

最新更新