ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 8.2 文件和目录对话框 如果想让用户选择文件和目录,你可以使用下面这两种对话框:wxFileDialog和wxDirDialog. wxFileDialog wxFileDialog用来让用户选择一个或多个文件.它还有一个专门用来打开文件或者保存文件的变体. 下图演示了windows平台上文件对话框的样子: ![](img/mht8C73%281%29.tmp) GTK+ 版本: ![](img/mht8C85%281%29.tmp) GTK+ 2.4以上版本: ![](img/mht8C88%281%29.tmp) Mac Os X版本: ![](img/mht8C9B%281%29.tmp) 创建一个文件对话框需要传递的参数包括一个父窗口,一个显示在对话框标题栏的消息文本,默认的目录,默认文件名,通配符,对话框类型和显示位置(有些平台上忽略这个参数).然后调用其ShowModal函数并且判断函数返回值,如果返回值为wxID_OK则表明用户确认了文件的选择. 目录名和文件名组成一个文件全路径.如果目录名为空,则默认为当前工作目录,如果文件名为空,则没有默认文件名. 通配符用来确定哪种类型的文件应该显示在对话框中.通配符可以用"|"分割多种文件类型,并且可以提供文件类型的描述文字,具体格式如下所示: ``` BMP files (*.bmp)|*.bmp|GIF files (*.gif)|*.gif ``` 如果在文件名文本区输入一个带有通配符("*","?")的文件名,然后点确定按钮,将会导致只有符合这个通配名的文件名被显示. wxFileDialog的类型 如下表所示: | wxSAVE | 指定为一个保存文件对话框. | |:--- |:--- | | wxOPEN | 指定为一个打开文件对话框(默认行为). | | wxOVERWRITE_PROMPT | 对于保存文件对话框,如果目标文件已经存在,则提示是否覆盖. | | wxFILE_MUST_EXIT | 用户只能选择已经存在的文件. | | wxMULTIPLE | 用户可以选择多个文件. | wxFileDialog的成员函数 Getdirectory返回默认的目录名或者单选文件对话框中选中文件的所在的目录名,使用SetDirectory设置默认目录. GetFilename返回不包括目录部分的默认文件名或者单选文件对话框中选中的文件的文件名.使用SetFilename设置默认文件名. GetFilenames使用wxArrayString类型返回多选文件对话框中所有选中的文件名.通常,这些文件名是不含有路径的, 但是在windows平台上,如果选中的是一个快捷方式文件,windows可能会增加上一个全路径,因为应用程序无法通过通过增加当前的目录的方式来得到其全路径.使用GetPaths可以得到包含全路径在内的已选中文件的列表. GetFilterIndex用来返回默认的基于0的过滤器的索引.过滤器通常以一个下拉框的方式显示.使用SetFilterIndex设置默认的过滤器索引. GetMessage返回对话框的标题文本. 使用SetMessage函数来设置标题文本. GetPath以全路径的方式返回单选文件框中默认文件或者选中文件名.对于多选框,应使用GetPaths函数. GetWildcard返回指定的通配符, SetWildcard用来设置通配符. wxFileDialog例子 下面的代码用来创建和显示一个用来打开BMP或者GIF类型文件的对话框: ``` #include "wx/filedlg.h" wxString caption = wxT("Choose a file"); wxString wildcard = wxT("BMP files (*.bmp)|*.bmp|GIF files (*.gif)|*.gif"); wxString defaultDir = wxT("c:\\temp")); wxString defaultFilename = wxEmptyString; wxFileDialog dialog(parent, caption, defaultDir, defaultFilename, wildcard, wxOPEN); if (dialog.ShowModal() == wxID_OK) { wxString path = dialog.GetPath(); int filterIndex = dialog.GetFilterIndex(); } ``` wxDirDialog wxDirDialog用来让用户选择一个本地或者网络文件夹.如果在构造函数中设置了可选类型wxDD_NEW_DIR_BUTTON,则对话框将显示一个用来创建新文件夹的按钮. 下图演示了windows平台上的目录对话框的样子,这是windows系统提供的原生控件: ![](img/mht8C9E%281%29.tmp) linux平台上通常使用GTK+版本的wxDirDialog,如下图所示: ![](img/mht8CB0%281%29.tmp) Mac平台上的wxDirDialog和文件选择对话框非常相似,如下图所示: ![](img/mht8CB3%281%29.tmp) 创建一个目录对话框需要传递的参数包括:一个父窗口,一个标题文本,一个默认路径,一个窗口类型以及一个位置和大小(最后两个参数在某些平台上被忽略),然后调用ShowModal函数,判断返回值是否为wxID_OK以确定用户是否进行了选择. wxDirDialog成员函数 SetPath和GetPath用来获得和设置用户选择的目录. SetMessage和GetMessage用来获取和设置标题文本. wxDirDialog使用举例 ``` #include "wx/dirdlg.h" wxString defaultPath = wxT("/"); wxDirDialog dialog(parent, wxT("Testing directory picker"), defaultPath, wxDD_NEW_DIR_BUTTON); if (dialog.ShowModal() == wxID_OK) { wxString path = dialog.GetPath(); wxMessageBox(path); } ```