mfccfiledialog只打开选定的文件
MFC CFileDialog open only select files
使用CFileDialog作为打开的文件,我需要允许用户只选择显示在对话框列表区域中的文件,例如通过单击它。我们不希望用户能够在"文件名"控件中键入名称。OPENFILENAME (OFN)结构体有几个不同的标志(http://msdn.microsoft.com/en-US/library/ms646839%28v=vs.80%29.aspx),但我没有看到阻止用户输入文件名的标志。
我看到的最接近的东西是OFN_FILEMUSTEXIST,但它只指定文件存在;它仍然允许用户输入名称。
有没有办法做到这一点,而不继承一个新的类?
更多信息
我们需要防止他们输入文件名,因为他们可能打开一个不合适的文件名。使用lpszFilter
参数,我们过滤文件名,因此它只显示文件名(而不是扩展名)中带有ABC的文件。所以如果他们输入一个文件名,他们可以输入像myCoolFileDEF.ext
这样的东西。如果文件存在,它将继续并让他们打开它(对话框将关闭,没有错误消息),即使他们只应该打开文件名中带有ABC的文件。
由于您正在使用MFC,只需继承CFileDialog并禁用文件名编辑控件和组合框。我不认为使用CFileDialog和编写另一个OFNHookProc回调的意义,虽然你可以从GetOpenFileName开始,如果你想。
正如前面的回答所指出的,您可以在对话框中查找文件名控件并禁用它。这不是没有惩罚-如果你打开CFileDialog钩子回调逻辑,你得到的是"旧风格"的文件对话框在Vista和以上版本,而不是"新风格"的一个。"new style"文件对话框在可定制的内容方面有很多限制,而且,据我所知,它没有提供一种受支持的方式来获取文件名控制。
读到你的问题,我的第一直觉是你过度设计了你的解决方案:如果你提供了一个过滤器,那么用户必须去相当多的麻烦来选择错误的文件类型,大多数用户不会这样做。如果是这样,很可能用户比你的程序更了解。如果是我,我会使用过滤器,然后在文件对话框关闭后,检查返回的文件名—如果它不匹配所需的模式,我会设置一个消息对话框,询问用户是否真的确定,如果他们坚持认为他们是,那么无论如何都要打开文件。
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 读取文件的最后一行并输入到链接列表时出错
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 如何将内容数组写入文本文件?
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到