FLTK Fl_File_Chooser的使用

FLTK Fl_File_Chooser的使用

默认的Fl_File_Chooser的界面是这样的。
FLTK Fl_File_Chooser的使用_第1张图片
可以构造函数参数可以选择单个文件、多个文件、文件夹以及创建新文件。

如何获取选择的(多个)文件,需要写Fl_File_Chooser的回调函数。

//下标是从1开始的,使用0开始的下标也不报错,看到官方文档的实例代码才找到原因
void FileChooser_cb(Fl_File_Chooser* fc, void* data)
{
	for (int i = 1; i <= fc->count(); i++)
	{
		const char* currentFilename = fc->value(i);
		cout << currentFilename << endl;
	}
}
****构造函数****
第一个参数是默认路径,第二个参数是过滤器filter 可以用 | 增加其他文件拓展名,,第三个参数	选择单个文件SINGLE,多个文件MULTI,创建CREATE,文件夹(存在,一个)DIRECTORY
//main函数
int main(int argc, char* argv[])
{

	Fl_File_Chooser fc(".", "TIF (*.tif)", Fl_File_Chooser::MULTI,"File Chooser");
	fc.callback(FileChooser_cb);
	fc.show();
	return Fl::run();
}

如何得到选择的文件名困扰了我许久,仔细研究实例代码终于发现端倪。
Chooser不能直接返回选中的文件名,这里指点击确定按钮后。如果使用上面的回调函数,寻找文件过程中点到的其他文件夹或者误点的其他文件,文件名都被会被 value 函数返回,这样就没办法判断自己选中的文件名了。
得到最终选定的文件名,需要配合 visible 函数使用。

void show_callback(void)
{
      int	i;			// Looping var
      int	count;			// Number of files selected
      char	relative[FL_PATH_MAX];	// Relative filename

      if (filter->value()[0])
          fc->filter(filter->value());
      fc->show();
      //精髓就在这里
      while (fc->visible()) {
          Fl::wait();
      }
      count = fc->count();
      if (count > 0)
      {
            files->clear();

            for (i = 1; i <= count; i ++)
            {
                  if (!fc->value(i))
                    break;
                  fl_filename_relative(relative, sizeof(relative), fc->value(i));
                  files->add(relative,Fl_File_Icon::find(fc->value(i), Fl_File_Icon::PLAIN));
            }
            files->redraw();
      }
}

上面是demo的源码,等到Chooser隐藏起来,再来获取选中的文件名。

你可能感兴趣的:(c++,fltk)