我正在尝试更改 Fl_Box 中显示的图像。
static Fl_RGB_Image *greenRgb;
static Fl_RGB_Image *redRgb;
static Fl_RGB_Image *blackRgb;
Fl_Box *makeTristate(char const *name) {
Fl_Box *ret = new Fl_Box(0, 0, 300, 32, name);
ret->labelsize(24);
ret->align(FL_ALIGN_RIGHT | FL_ALIGN_IMAGE_NEXT_TO_TEXT);
ret->image(whiteRgb);
return ret;
}
void setTristate(Fl_Box *tris, int state) {
Fl_RGB_Image *wanted;
if (state < 0) {
wanted = redRgb;
} else if (state > 0) {
wanted = greenRgb;
} else {
wanted = blackRgb;
}
if (wanted != tris->image()) {
LOG_PRINTF("changing %p (%s) from %p to %p", tris, tris->label(), tris->image(), wanted);
tris->image(wanted);
tris->redraw();
}
}
图像已正确加载。无论哪个图像在创建时首先在 Fl_Box 上设置,都会一直显示,即使 printf() 清楚地表明我将图像更改为其他一些好的图像。
就好像 redraw() 实际上并没有使盒子意识到它有一个新的图像并重新绘制自己。主循环正在运行;我有另一个图像(视频捕获),我每秒 30 次重新创建(删除旧的,创建一个新的),并且该框/图像重新显示本身就好了。
我使用 makeTristate() 创建并使用 setTristate() 更新的 Fl_Box-es 本身就在 Fl_Pack 中。绝望中,我试图wanted
在分配图像之前调用 uncache() ,但这无济于事。
我究竟做错了什么; 如何让 Fl_Box 的图像成为不同的图像并重新显示?
该系统是在 Jetson TX2 上运行的 Ubuntu 16.04。我正在使用 FLTK 1.3.4。我无法更新到任何更新的东西,因为这是 NVIDIA 为我正在运行的硬件发布的最新版本(“JetPack 3.2”)。该问题发生在由板载 NVIDIA 驱动程序驱动的本机连接显示器上,以及在具有不同显示器的网络上运行时。