我正在尝试更改在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()创建的Fl_Box和用setTristate()更新的Fl_Box都在Fl_Pack中。无奈之下,我试着在赋值之前调用wanted镜像上的uncache(),但这并不管用。
我做错了什么?如何将Fl_Box的图像转换为不同的图像并重新显示?
该系统是运行在Jetson TX2上的Ubuntu16.04。我使用的是FLTK 1.3.4。我不能更新到更新的版本,因为这是英伟达为我运行的硬件发布的最新版本("JetPack 3.2")。该问题既发生在由板载NVIDIA驱动程序驱动的本机连接的显示器上,也发生在使用不同显示器的网络上。
发布于 2018-04-23 02:05:07
所以,事实证明我忘记了导致这种情况的FLTK行为。
redraw()只会使小部件的框无效,而不会使其标签区域无效。
因为我没有在对align()的调用中设置FL_ALIGN_INSIDE,所以标签和图像最终出现在标签区域之外,但是我没有注意到,因为在窗口中没有太多东西可以排列在一起。
将FL_ALIGN_INSIDE添加到对align()的调用修复了该问题。而且,更一般地,请记住,如果标签在小部件之外,redraw()不会使小部件的标签区域无效。
https://stackoverflow.com/questions/49963086
复制相似问题