FLTK 子窗口未在 Linux 上重绘

Posted

技术标签:

【中文标题】FLTK 子窗口未在 Linux 上重绘【英文标题】:FLTK child window not redrawing on Linux 【发布时间】:2016-08-28 05:39:25 【问题描述】:

我正在开发一个希望发布的不错的开源项目,但是我遇到了一些问题,即子窗口在损坏后无法重绘。详情请看这张图:

这是我用来显示这个的代码:

void showMessageWindow (std::string strMessage, std::string strTitle)

    Fl_Window* msgWin = new Fl_Window(400, 255, NULL);
    if (strTitle == "")
        msgWin->label("Window Title");
    msgWin->box(FL_BORDER_FRAME);
    msgWin->set_non_modal();

    Fl_PNG_Image* img = new Fl_PNG_Image("/home/obaker/Pictures/info-icon.png");
    Fl_Box* ibox = new Fl_Box(20, 20, 48, 48);
    ibox->image(img);

    Fl_Multiline_Output* mOut = new Fl_Multiline_Output(90, 20, 275, 175, NULL);    
    mOut->box(FL_NO_BOX);
    mOut->wrap(true);
    mOut->readonly(true);
    mOut->cursor_color(FL_BACKGROUND_COLOR);    
    mOut->value(strdup(strMessage.c_str()));

    Fl_Button* btn = new Fl_Button(150, 210, 100, 35, "OK");
    btn->box(FL_GTK_UP_BOX);
    btn->shortcut(FL_Enter);
    btn->callback(msgBoxClose, msgWin);

    msgWin->add(ibox);
    msgWin->add(mOut);
    msgWin->add(btn);

    msgWin->show();

我曾尝试使用 Fl_Double_Window 代替 Fl_Window,但它看起来更糟:

虽然看起来“前卫”和“酷”,但它不适合我的项目。 :-)

我正在 Debian Linux 8、64 位、AMD Radeon HD 6670 显卡、8 GB RAM 上进行开发和测试。 Debian 提供的 FLTK 版本是 1.3 (1.3.2-6)。

父窗口是一个 Fl_Double_Window,它自己重绘就好了。

有什么人可以推荐强制这个子窗口在损坏时重新绘制自己?

提前感谢您! :-)

【问题讨论】:

【参考方案1】:

在 Chris 在 FLTK 论坛上的指导下,我能够解决这个问题。

必要的更改是:

msgWin->box(FL_BORDER_BOX)

而不是

msgWin->box(FL_BORDER_FRAME)

“用于输出的 FL_NO_BOX 也可能导致绘图伪影。更好 将输出背景颜色设置为窗口背景颜色:"

mOut->box(FL_FLAT_BOX);
mOut->color(msgWin->color());

感谢您的所有帮助! :-)

【讨论】:

以上是关于FLTK 子窗口未在 Linux 上重绘的主要内容,如果未能解决你的问题,请参考以下文章

FLTK窗口未在while循环c ++中显示

Expo AuthSession 新窗口未在 Web 上重定向

带有按钮回调的新窗口未在 fltk 中打开

是否可以使用标准 C++ 线程而不是 FLTK 超时来更新窗口?

如何使用 FLTK 在 Windows、Mac OS X 和 Linux 中使窗口透明?

FLTK 模态窗口