提问人:Kaloschke 提问时间:1/11/2022 更新时间:1/11/2022 访问量:174
C++ FLTK 如何从计时器函数内部重绘框
C++ FLTK How to redraw a box from inside an timerfunction
问:
如何从例程中调用 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());
}
问候
答:
1赞
Matthias Melcher
1/11/2022
#1
您在超时中添加图像的方式是正确的。但是,您将映像分配给堆栈:,因此当您离开计时器时,该映像将与堆栈一起自动删除。当实际绘制框时,图像不再存在。Fl_PNG_Image png(filename);
FLTK 不会复制映像。它只是链接到它。
您必须编写并修复其余代码才能使用指针,并确保在最后删除图像。Fl_PNG_Image *png = new Fl_PNG_Image(filename);
评论
0赞
Kaloschke
1/11/2022
这就是解决方案。我非常非常感激。
0赞
Albrecht Schlosser
1/11/2022
#2
您声明了 and 作为全局变量(在 中使用),但您也声明了具有相同名称的局部变量,其中“隐藏”了全局变量。png1
png2
get_new_pic()
main()
请从中的两个赋值中删除,以便这些赋值按预期使用全局变量。Fl_PNG_Image *
main()
提示:您还应该为框分配一个纯色背景,例如
box1->box(FL_FLAT_BOX);
评论
0赞
Kaloschke
1/12/2022
匪夷所思。非常感谢!
评论