1

我正在使用 FLTK 库并使用fl_input()Fl_ask.h. 我想要一个功能,如果用户在 3 秒内没有输入和数据,该函数应该返回。如何在不按OKor的情况下使此功能返回cancel。有没有办法处理这个弹出对话框?这是我正在使用的代码

const char *message = "Enter name here";

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

1 回答 1

0

您不能使用 fl_input 轻松做到这一点,因为没有窗口句柄。查看 src/fl_ask.cxx 中的 fl_input 源。您将看到它调用 input_innards。如果您跟踪到 input_innards,您会看到它调用了 innards。如果你然后按照内脏,你会发现一个while循环,它读取

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);
...

制作一份 innards 并将新的重命名为 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->shown() 为 false 并退出 while 循环。

于 2014-01-09T10:33:06.533 回答