如何在FLTK弹出对话框中添加超时

时间:2014-01-06 11:26:41

标签: fltk

我使用的是FLTK库,并使用了来自fl_input()的弹出式功能Fl_ask.h。我想要一个功能,如果用户没有输入和数据3秒钟,该功能应该返回。如何在不按OKcancel的情况下返回此功能。无论如何要获得此弹出对话框的句柄?这是我正在使用的代码

const char *message = "Enter name here";

Fl::lock();
char *c = (char*)fl_input(message, "");
if(c == NULL)
    c = "";
Fl::unlock();

1 个答案:

答案 0 :(得分:0)

使用fl_input无法轻松完成此操作,因为窗口没有句柄。看看src / fl_ask.cxx中的fl_input源代码。你会看到它调用input_innards。如果你追踪到input_innards,你会看到它调用内脏。如果你跟随内脏,你会发现一个循环读取

while (message_form->shown()) Fl::wait();

制作fl_ask.cxx的副本,比如说timed_ask.cxx。使所有fl_例程保持静态。更改fl_input如下:

const char* timed_input(double timeout, const char *fmt, const char *defstr, ...) {

  if (avoidRecursion) return 0;

  va_list ap;
  va_start(ap, defstr);
  const char* r = timed_input_innards(timeout, fmt, ap, defstr, FL_NORMAL_INPUT);
  va_end(ap);
  return r;
}

复制input_innards并将新的命名重命名为timed_input_innards(除非你想删除它们,否则这会使其他fl_routines保持高兴。)

static const char* timed_input_innards(double timeout, const char* fmt, va_list ap,
             const char* defstr, uchar type) {
...
int r = timed_innards(timeout, fmt, ap, fl_cancel, fl_ok, 0);
...

复制内脏并将新内容重命名为timed_innards

static int timed_innards(double timeout, const char* fmt, va_list ap,
  const char *b0,
  const char *b1,
  const char *b2)
{
    ...
    Fl::add_timeout(timeout, hide_form, message_form);
    while (message_form->shown()) Fl::wait();
    ...
}

添加超时例程

void hide_form(void* data)
{
    // You could do this or use message_form directly
    Fl_Window* form = reinterpret_cast<Fl_Window*>(data);
    form->hide();
}

这将导致message_form-&gt; shown()为false并退出while循环。

相关问题