在改进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函数都不能正确显示。我也做了些修改。完整的例子可以从这里下载。
分享到:
相关推荐
在IT行业中,MFC(Microsoft Foundation Classes)是一个C++库,由微软开发,用于构建Windows应用程序。...通过深入研究这个案例,开发者不仅可以理解MFC的工作原理,还能掌握实际开发中解决类似问题的方法。
在Microsoft Foundation Classes (MFC)库中,写文件是一个常见的任务,它允许程序将数据存储到磁盘上以便后续读取或持久化信息。...这个例子是一个很好的起点,对于想要了解MFC文件操作的人来说,它提供了实践经验。
总的来说,解决这个问题需要深入理解字符编码,熟练运用MFC的文件操作类和Windows API,以及良好的编程习惯,确保代码的稳定性和用户体验。在项目中,可以将上述步骤封装成一个函数或类,方便重复使用和维护。
解决方法是将这些必要的动态库文件与可执行程序一起打包,确保目标计算机上有这些文件,从而使得程序能够正常运行。 在"压缩包子文件的文件名称列表"中,"windows运行库文件"很可能包含了上述提到的一些或全部关键...
### MFC 文件粉碎代码...通过以上分析可以看出,这段代码实现了基于MFC框架的文件粉碎功能,符合美国标准的操作流程,同时提供了一定程度上的灵活性和自定义选项。开发者可以根据实际需求进一步扩展和完善相关功能。
此外,注意在程序运行过程中正确管理和释放资源,避免内存泄漏和其他潜在问题。 在压缩包`test_openfile_160119`中,可能包含了一些示例代码或资源,帮助开发者理解如何在MFC项目中实际应用这些技术。如果想要...
"FtpClient.sln"和"FtpClient.v12.suo"是Visual Studio解决方案文件和用户选项文件,包含了项目的编译配置和用户设置;而其他如".pdb"文件是调试符号文件,用于在开发过程中帮助调试代码;"ipch"目录可能是临时编译...
为了解决这个问题,我们需要使用多线程。 MFC支持多线程编程,通过CWinThread类实现。为了在后台线程中执行拷贝任务,我们需要创建一个派生自CWinThread的类,并重写其Run()函数。在这里,我们可以调用CopyFile系列...
总结,"MFC Socket 文件传输器"是结合了MFC的图形界面能力和Socket的网络通信能力的实用工具。通过理解上述技术点,开发者可以构建自己的文件传输应用,满足不同场景下的需求。在实际开发中,还需考虑性能优化、并发...
本文将详细讲解如何利用MFC实现拖拽文件到列表控件显示,以及如何处理占用中无法删除的文件问题。 首先,我们需要在MFC应用程序中启用拖放功能。这涉及到对MFC框架的CListCtrl类进行扩展,以接收并处理拖放到列表...
在IT行业中,MFC(Microsoft Foundation Classes)是一个C++库,由微软...通过使用MFC,开发者可以更便捷地构建这样的程序,同时也要关注网络安全和用户体验等方面,以打造一个高效、稳定、安全的文件传输解决方案。
为了解决这个问题,我们需要对CListCtrl进行子类化,并实现自定义的拖放功能。 拖放操作在Windows编程中是通过Windows消息机制和OleDragDrop接口来实现的。下面将详细介绍如何实现这个功能: 1. **子类化CListCtrl...
总之,"文件管理系统vc mfc"是一个基于VC++和MFC的项目,它利用了MFC提供的类库和框架,实现了文件和目录的管理,包括基本的文件操作、目录浏览、搜索功能等。开发者通过良好的设计和编程技巧,创建了一个实用的文件...
在Microsoft的MFC(Microsoft Foundation Classes)库中,Ini文件是一种常见的配置文件格式,用于存储应用程序的设置和数据。在Windows环境下,Ini文件提供了一种简单的方法来保存和读取用户配置,比如窗口大小、...
在Windows编程环境中,Microsoft Foundation Classes (MFC) 是一个C++类库,它为开发者提供了构建Windows应用程序的框架。在MFC中遍历指定文件夹...然而,如果你的项目已经基于MFC,那么上述方法是一个有效的解决方案。
在这种情况下,`mfc71d.dll` 的补丁(如`mfc71d.rar`)可以用来替换或更新用户系统上的旧版本,从而解决问题,使得软件能够正常运行。`PChome_download.html` 可能是太平洋电脑网提供的下载页面链接,用户可以通过这...
VC 的MFC对最近文件进行了包装,它使用户无需编写任何代码就可实现最近文件菜单。但这种方法也有缺陷: ... 用ini文件实现最近文件可以解决上述问题,而且用编程控制MRU更灵活,可以提供更多功能。
因此,将"MFC42D.dll"文件复制到Windows系统的"system32"目录下是解决这类问题的常见方法,因为系统会在这个目录下查找动态链接库文件。 "使用说明.txt"可能包含有关如何正确安装和使用MFC42D库的详细步骤,这对于...
1. 用户界面:MFC提供了丰富的控件和布局管理器,用于创建图形用户界面,如打开文件对话框、文件列表显示和进度条。 2. 文件读取:程序会读取HEX文件,解析其内容,提取地址和数据。 3. 数据转换:将HEX格式的数据...
MFC提供了一套方便的类和方法来处理文件操作,如打开、读取和关闭文件。在这个特定的场景中,我们关注的是如何用MFC逐行读取文本文件数据,且要求行与行之间不能有空白,否则可能会导致读取中断。下面将详细解释这个...