您不能使用 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 循环。