我试图更改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(&#34; JetPack 3.2&#34;)。 在本机连接的显示器上,由板载NVIDIA驱动程序驱动,以及使用不同的DISPLAY在网络上运行时,都会出现问题。
答案 0 :(得分:0)
所以,事实证明我忘记了造成这种情况的FLTK行为。
.git
只会使窗口小部件的框无效,而不会使其标签区域无效。
因为我没有在redraw()
的通话中设置FL_ALIGN_INSIDE
,标签和图片最终都在标签区域之外,但我没有注意到,因为没有&#39;在窗口中与这些东西对齐。
将align()
添加到FL_ALIGN_INSIDE
的调用中解决了问题。而且,更一般地说,请记住align()
如果标签位于小部件之外,则不会使小部件的标签区域无效。