C++ FLTK FL_INPUT 检测何时按下输入然后将文本添加到 FL_TEXT_DISPLAY

Posted

技术标签:

【中文标题】C++ FLTK FL_INPUT 检测何时按下输入然后将文本添加到 FL_TEXT_DISPLAY【英文标题】:C++ FLTK FL_INPUT detect when enter pressed then add text to FL_TEXT_DISPLAY 【发布时间】:2020-11-03 06:49:10 【问题描述】:

我想检测何时在 FL_INPUT 中按下回车并使用 C++ 将其文本添加到 FL_Text_Display

请帮助我,我不知道该怎么做,这就是我得到的全部

#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Text_Buffer.H>
#include <FL/Fl_Text_Display.H>
#include <FL/Fl_Input.H>

using namespace std;

int main(int argc,char **argv) 

  Fl_Window win(320,240,"BIC");

  Fl_Text_Buffer txtbuf;

  win.begin();
    Fl_Text_Display ted(2,2,320-2,240-2-32-2);
    Fl_Input        inp(2,240-2-32,320-2,32);
  win.end();
  
  ted.buffer(txtbuf);
  
  win.resizable(ted);
  
  win.show();
  
  return Fl::run();

【问题讨论】:

【参考方案1】:

您必须继承 Fl_Input 并覆盖虚拟 int 句柄(int)方法。

class MyInput : public Fl_Input 
   public:   
    MyInput(int x, int y, int w, int h, const char* title=0) : Fl_Input(x, y, w, h, title) 

   virtual int handle(int e) override 
        switch(e) 
            case FL_ENTER: foo(); return 1;
            default: return 0;
        
    
;

【讨论】:

【参考方案2】:

派生一个新类是可能的,但 OP 的问题通过回调更容易解决。这就是回调的设计目的。修改后的示例代码如下:

#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Text_Buffer.H>
#include <FL/Fl_Text_Display.H>
#include <FL/Fl_Input.H>

// input callback (called when ENTER is pressed)
void input_cb(Fl_Widget *w, void *v) 
  Fl_Input *inp = (Fl_Input *)w;
  Fl_Text_Display *ted = (Fl_Text_Display *)v;
  Fl_Text_Buffer *tbuf = ted->buffer();
  tbuf->append(inp->value());
  tbuf->append("\n"); // append newline (optional)
  ted->insert_position(tbuf->length());
  ted->show_insert_position();
  inp->value("");
  inp->take_focus();


int main(int argc, char **argv) 
  Fl_Window win(320, 240, "BIC");
  Fl_Text_Buffer txtbuf;
  win.begin();
  Fl_Text_Display ted(2, 2, 320 - 2, 240 - 2 - 32 - 2);
  Fl_Input inp(2, 240 - 2 - 32, 320 - 2, 32);
  win.end();

  inp.callback(input_cb, (void *)&ted); // set callback
  inp.when(FL_WHEN_ENTER_KEY);          // when ENTER is pressed

  ted.buffer(txtbuf);
  txtbuf.append("first line\n");
  win.resizable(ted);
  win.show();
  return Fl::run();

涉及到定位到缓冲区末尾以在输入时显示新文本并将输入焦点设置回输入小部件的代码,但我试图使示例完整。但是没有错误处理。

【讨论】:

以上是关于C++ FLTK FL_INPUT 检测何时按下输入然后将文本添加到 FL_TEXT_DISPLAY的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 FLTK 将 const char* 转换为 CLR/C++ 中的字符串以获得 FL_Input 或其他小部件的值?

VS 2015 和 FLTK 回调问题

创建自定义 fltk 对话框/模态窗口

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

如何在 FLTK 中远离 Fl_Button?

如何检测何时按下 Enter 或按下提交 [重复]