【问题标题】:FLTK Fl_Box won't change its image()FLTK Fl_Box 不会改变它的 image()
【发布时间】:2018-04-23 02:05:07
【问题描述】:

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

【问题讨论】:

    标签: fltk nvidia-jetson


    【解决方案1】:

    所以,原来我忘记了导致这种情况的 FLTK 行为。

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

    因为我没有在对align() 的调用中设置FL_ALIGN_INSIDE,所以标签和图像最终位于标签区域之外,但我没有注意到,因为这些东西并没有太多需要排队的地方窗户。

    FL_ALIGN_INSIDE 添加到对align() 的调用中解决了该问题。而且,更一般地,请记住redraw() 不会使小部件的标签区域无效,如果标签位于小部件之外。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-27
      • 2012-09-27
      • 1970-01-01
      • 1970-01-01
      • 2016-09-11
      相关资源
      最近更新 更多