0

我正在尝试更改 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 驱动程序驱动的本机连接显示器上,以及在具有不同显示器的网络上运行时。

4

1 回答 1

0

所以,事实证明我忘记了导致这种情况的 FLTK 行为。

redraw()只会使小部件的框无效,而不是其标签区域。

因为我没有FL_ALIGN_INSIDE在对标签的调用中设置,align()并且图像最终在标签区域之外,但是我没有注意到,因为窗口中没有太多可以与这些东西对齐的东西。

添加FL_ALIGN_INSIDE到呼叫以align()解决问题。而且,更一般地,请记住redraw(),如果标签在小部件之外,则不会使小部件的标签区域无效。

于 2018-04-22T18:05:07.303 回答