首页 > 解决方案 > 在 Visual C++ 中的 MFC 中打开/保存文件时可选择的文件格式

问题描述

我的英语不是很完美,对不起。

我正在使用带有 MFC 的 Visual C++ 2019 社区。

CFileDialog课堂上,我希望选择文件编码:UTF-16(小/大端),UTF-8,ANSI 等,在保存时,有或没有签名(2 或字节什么标志编码,在文件的开头)。应该联系它以打开/保存按钮。在 的文档中CFileDialog,我只能添加单独的按钮,而不是像 Visual Studio、LibreOffice 等那样扩展打开/保存按钮。我该怎么做?我是 MFC 和桌面程序的初学者,但不是 C++ 的初学者。谢谢你。

标签: mfc

解决方案


在对您的问题的评论中,您说:

是的,我知道。但是没有地方可以写这个。打开菜单的处理程序是 MFC 的内置部分。在源代码处,CFileDialog是不会发生的。我添加了处理程序OnFileOpen()。这个没有参数,现在是空的,打开的菜单项管理得很好。所以,我不知道我在哪里输入OFN_ALLOWMULTISELCT

如果您查看技术说明 22,它会提到:

ID_FILE_OPEN打开现有文档。

笔记

您必须将其连接到您的 -CWinApp派生类的消息映射以启用此功能。

CWinApp::OnFileOpen有一个非常简单的调用实现, CWinApp::DoPromptFileName后跟CWinApp::OpenDocumentFile要打开的文件的文件或路径名。CWinApp实现例程DoPromptFileName打开标准对话框并用FileOpen从当前文档模板获得的文件扩展名填充它。

一种常见的定制ID_FILE_OPEN是定制FileOpen 对话框或添加额外的文件过滤器。推荐的自定义方法是用您自己的 FileOpen对话框替换默认实现,并CWinApp::OpenDocumentFile使用文档的文件或路径名进行调用。无需调用基类。

如您所见,它指出:

CWinApp实现例程DoPromptFileName打开标准对话框并用FileOpen从当前文档模板获得的文件扩展名填充它。

DoPromptFileName似乎是一个未记录的功能。您可以:

  • 调试到 MFC 源代码以查看它的作用并在您自己的应用程序类中覆盖它,
  • 继续推出您自己的CWinApp::OnFileOpen覆盖,它使用您自己的CFileDialog.

我建议您还阅读CFileDialog构造函数文档,因为它将帮助您进行基本的自定义。但是,在我看来,您需要按照@sergiol 在评论中所说的去做并显示您自己的CFileDialog(使用前面描述的任何一种方法)并添加您自己的组合与您的编码选项。然后进行相应处理。

请注意,我没有这种级别的定制经验,但它应该能让你继续前进。


推荐阅读