如何向 FLTK 弹出对话框添加超时
Posted
技术标签:
【中文标题】如何向 FLTK 弹出对话框添加超时【英文标题】:How to add timeout to FLTK pop-up dialog 【发布时间】:2014-01-06 11:26:41 【问题描述】:我正在使用 FLTK 库并使用了来自 Fl_ask.h
的弹出函数 fl_input()
。我想要一个功能,如果用户在 3 秒内没有输入和数据,该函数应该返回。如何在不按OK
或cancel
的情况下使此函数返回。有没有办法处理这个弹出对话框?这是我正在使用的代码
const char *message = "Enter name here";
Fl::lock();
char *c = (char*)fl_input(message, "");
if(c == NULL)
c = "";
Fl::unlock();
【问题讨论】:
好的。似乎不可能得到这个函数的句柄。我将制作我自己的对话框。谁能给我看一个 add_timeout 的例子。 【参考方案1】:您不能使用 fl_input 轻松做到这一点,因为没有窗口句柄。查看 src/fl_ask.cxx 中的 fl_input 源。您将看到它调用 input_innards。如果您跟踪到 input_innards,您会看到它调用了 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 循环。
【讨论】:
以上是关于如何向 FLTK 弹出对话框添加超时的主要内容,如果未能解决你的问题,请参考以下文章
javascript里添加按钮button,然后就可以弹出一个对话框输入数据