`
saybody
  • 浏览: 903766 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

MFC最近文件列表的问题和改进方法

阅读更多

在改进cnbook时发现MFC的一个小问题。MFC框架支持最近文件列表。我们不用写一行代码就可以实现文件列表功能。

在资源文件的菜单资源中,ID_FILE_MRU_FILE1表示最近文件列表:

		MENUITEM "最近文件",                 ID_FILE_MRU_FILE1,GRAYED
		MENUITEM SEPARATOR
		MENUITEM "退出(&X)",                       ID_APP_EXIT

MFC会在这个位置插入文件列表。默认情况下,最近文件列表是文件菜单的第一级菜单项。在最近文件比较多时,会造成文件菜单过长,不美观。所以,有时我们希望把最近文件列表放在子菜单项中,例如:

		POPUP "最近文件(&F)"
		BEGIN
			MENUITEM "最近文件",                 ID_FILE_MRU_FILE1,GRAYED
		END
		MENUITEM SEPARATOR
		MENUITEM "退出(&X)",                       ID_APP_EXIT

但运行结果却不是我们所期待的:

通过查看MFC的源代码,我们可以找到负责文件列表显示的函数CRecentFileList::UpdateMenu。大概看一下这个函数,就会发现这个函数没有考虑最近文件列表放在子菜单项中的情况。它总是在前一个菜单项的后面插入最近文件的菜单项,即使前一个菜单项在上一级。这就造成将ID_FILE_MRU_FILE1作为子菜单的第一项时会发生错误。

Todd C. Gleason在1998年使用VC5时就发现了这个问题并提出了解决办法。不过,在VC8中这个问题依然存在。Todd C. Gleason的解决办法就是:

  • 写一个CRecentFileList的派生类(VIRecentFileList),重载函数UpdateMenu,增加对子菜单项的支持。只要将文件VIRecentFileList.cpp和VIRecentFileList.h加入工程就可以了。

  • 在App类中重载LoadStdProfileSettings函数,使用VIRecentFileList类。在.h中增加:

    protected:
    	void LoadStdProfileSettings(UINT nMaxMRU);
    

    在.c中首先包含VIRecentFileList.h:

    #include "VIRecentFileList.h"
    

    然后实现LoadStdProfileSettings函数:

    static const TCHAR _afxFileSection[] = _T("Recent File List");
    static const TCHAR _afxFileEntry[] = _T("File%d");
    static const TCHAR _afxPreviewSection[] = _T("Settings");
    static const TCHAR _afxPreviewEntry[] = _T("PreviewPages");
    
    void CMruApp::LoadStdProfileSettings(UINT nMaxMRU)
    {
     ASSERT_VALID(this);
     ASSERT(m_pRecentFileList == NULL);
    
     if (nMaxMRU != 0)
     {
      // create file MRU since nMaxMRU not zero
    
      // Here's the important part--overriding CRecentFileList
      m_pRecentFileList = new VIRecentFileList(0, _afxFileSection, _afxFileEntry, nMaxMRU);
    
      m_pRecentFileList->ReadList();
     }
     // 0 by default means not set
     m_nNumPreviewPages = GetProfileInt(_afxPreviewSection, _afxPreviewEntry, 0);
    }
    

好了,看看结果是不是我们想要的:

Todd的代码是用于VC5环境的,在VC6或VC8使用要做一些细微改动。另外在清空文件列表后:

void CTextProApp::OnClrMru()
{
	int i;
	for (i = 0; i < m_pRecentFileList->m_nSize; i++) {
		m_pRecentFileList->m_arrNames[i].Empty();
	}
}

MFC和Todd的UpdateMenu函数都不能正确显示。我也做了些修改。完整的例子可以从这里下载。

分享到:
评论

相关推荐

    MFC实现文件传输

    在IT行业中,MFC(Microsoft Foundation Classes)是一个C++库,由微软开发,用于构建Windows应用程序。...通过深入研究这个案例,开发者不仅可以理解MFC的工作原理,还能掌握实际开发中解决类似问题的方法。

    MFC 写文件的例子

    在Microsoft Foundation Classes (MFC)库中,写文件是一个常见的任务,它允许程序将数据存储到磁盘上以便后续读取或持久化信息。...这个例子是一个很好的起点,对于想要了解MFC文件操作的人来说,它提供了实践经验。

    MFC UTF-8文件批量转成GB2312 解决中文乱码问题

    总的来说,解决这个问题需要深入理解字符编码,熟练运用MFC的文件操作类和Windows API,以及良好的编程习惯,确保代码的稳定性和用户体验。在项目中,可以将上述步骤封装成一个函数或类,方便重复使用和维护。

    MFC 动态库文件

    解决方法是将这些必要的动态库文件与可执行程序一起打包,确保目标计算机上有这些文件,从而使得程序能够正常运行。 在"压缩包子文件的文件名称列表"中,"windows运行库文件"很可能包含了上述提到的一些或全部关键...

    MFC文件粉碎代码

    ### MFC 文件粉碎代码...通过以上分析可以看出,这段代码实现了基于MFC框架的文件粉碎功能,符合美国标准的操作流程,同时提供了一定程度上的灵活性和自定义选项。开发者可以根据实际需求进一步扩展和完善相关功能。

    MFC 打开word、ppt、pdf文件

    此外,注意在程序运行过程中正确管理和释放资源,避免内存泄漏和其他潜在问题。 在压缩包`test_openfile_160119`中,可能包含了一些示例代码或资源,帮助开发者理解如何在MFC项目中实际应用这些技术。如果想要...

    FTP基于MFC对话框实现与服务器文件传输

    "FtpClient.sln"和"FtpClient.v12.suo"是Visual Studio解决方案文件和用户选项文件,包含了项目的编译配置和用户设置;而其他如".pdb"文件是调试符号文件,用于在开发过程中帮助调试代码;"ipch"目录可能是临时编译...

    mfc文件浏览器实现文件拷贝功能多线程

    为了解决这个问题,我们需要使用多线程。 MFC支持多线程编程,通过CWinThread类实现。为了在后台线程中执行拷贝任务,我们需要创建一个派生自CWinThread的类,并重写其Run()函数。在这里,我们可以调用CopyFile系列...

    MFC Socket 文件传输器

    总结,"MFC Socket 文件传输器"是结合了MFC的图形界面能力和Socket的网络通信能力的实用工具。通过理解上述技术点,开发者可以构建自己的文件传输应用,满足不同场景下的需求。在实际开发中,还需考虑性能优化、并发...

    MFC 拖拽文件到列表显示,并删除文件

    本文将详细讲解如何利用MFC实现拖拽文件到列表控件显示,以及如何处理占用中无法删除的文件问题。 首先,我们需要在MFC应用程序中启用拖放功能。这涉及到对MFC框架的CListCtrl类进行扩展,以接收并处理拖放到列表...

    mfc面向连接的文件传输程序

    在IT行业中,MFC(Microsoft Foundation Classes)是一个C++库,由微软...通过使用MFC,开发者可以更便捷地构建这样的程序,同时也要关注网络安全和用户体验等方面,以打造一个高效、稳定、安全的文件传输解决方案。

    MFC实现文件拖拽功能

    为了解决这个问题,我们需要对CListCtrl进行子类化,并实现自定义的拖放功能。 拖放操作在Windows编程中是通过Windows消息机制和OleDragDrop接口来实现的。下面将详细介绍如何实现这个功能: 1. **子类化CListCtrl...

    文件管理系统 vc mfc

    总之,"文件管理系统vc mfc"是一个基于VC++和MFC的项目,它利用了MFC提供的类库和框架,实现了文件和目录的管理,包括基本的文件操作、目录浏览、搜索功能等。开发者通过良好的设计和编程技巧,创建了一个实用的文件...

    mfc Ini文件读写操作例程

    在Microsoft的MFC(Microsoft Foundation Classes)库中,Ini文件是一种常见的配置文件格式,用于存储应用程序的设置和数据。在Windows环境下,Ini文件提供了一种简单的方法来保存和读取用户配置,比如窗口大小、...

    MFC遍历指定文件夹下的所以文件及占空间大小

    在Windows编程环境中,Microsoft Foundation Classes (MFC) 是一个C++类库,它为开发者提供了构建Windows应用程序的框架。在MFC中遍历指定文件夹...然而,如果你的项目已经基于MFC,那么上述方法是一个有效的解决方案。

    系统文件补丁mfc

    在这种情况下,`mfc71d.dll` 的补丁(如`mfc71d.rar`)可以用来替换或更新用户系统上的旧版本,从而解决问题,使得软件能够正常运行。`PChome_download.html` 可能是太平洋电脑网提供的下载页面链接,用户可以通过这...

    用ini文件保存最近打开文件记录MRU的VC 源码.rar

    VC 的MFC对最近文件进行了包装,它使用户无需编写任何代码就可实现最近文件菜单。但这种方法也有缺陷: ... 用ini文件实现最近文件可以解决上述问题,而且用编程控制MRU更灵活,可以提供更多功能。

    MFC42D 类库文件

    因此,将"MFC42D.dll"文件复制到Windows系统的"system32"目录下是解决这类问题的常见方法,因为系统会在这个目录下查找动态链接库文件。 "使用说明.txt"可能包含有关如何正确安装和使用MFC42D库的详细步骤,这对于...

    hex文件转S19文件VC/MFC程序源代码.zip

    1. 用户界面:MFC提供了丰富的控件和布局管理器,用于创建图形用户界面,如打开文件对话框、文件列表显示和进度条。 2. 文件读取:程序会读取HEX文件,解析其内容,提取地址和数据。 3. 数据转换:将HEX格式的数据...

    MFC做的逐行读文本文件数据

    MFC提供了一套方便的类和方法来处理文件操作,如打开、读取和关闭文件。在这个特定的场景中,我们关注的是如何用MFC逐行读取文本文件数据,且要求行与行之间不能有空白,否则可能会导致读取中断。下面将详细解释这个...

Global site tag (gtag.js) - Google Analytics