如何向 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 秒内没有输入和数据,该函数应该返回。如何在不按OKcancel 的情况下使此函数返回。有没有办法处理这个弹出对话框?这是我正在使用的代码

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 弹出对话框添加超时的主要内容,如果未能解决你的问题,请参考以下文章

是否可以向浏览器“打开文件”对话框添加额外的控制?

如何弹出QQ临时对话框实现不添加好友在线交谈效果

如何弹出QQ临时对话框实现不添加好友在线交谈效果

javascript里添加按钮button,然后就可以弹出一个对话框输入数据

VS2017 MFC应用中添加模态对话框时为其添加类弹出如下错误

vc 如何点下按钮弹出一个子对话框并在子对话框上显示图片