MFC中最近打开文件控制

今天做了在MFC下控制最近打开文件的功能。发现一些问题,在此进行总结。
1、显示最近打开文件的方法:在“文件”菜单栏下添加“最近打开文件”,对应ID为ID_FILE_MRU_FILE1。然后在应用程序类中的InitInstance()函数中添加

SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
和 
LoadStdProfileSettings(4);  // 加载标准 INI 文件选项(包括 MRU) 
函数,即可。08下新建MFC,会默认有这些代码。

2、通过应用程序打开的文件都会显示到最近打开文件中,如果我只想显示某些特定类型的文件,比如说*.bmp 或者*.prj 等等,该怎么控制呢?

3、在MFC中有个CRecentFileList类,是用来存贮和控制最近打开文件,简称MRU。类里面有些基本操作函数。
4、在winapp类中有个变量CRecentFileList* m_pRecentFileList。你可以在自己继承的应用程序类里使用它,使用时需要包含所需要的头文件。
5、在这个CRecentFileList类中,有个成员变量m_arrNames,是用来存放文件名的。但是很奇怪,这个变量不是数组或链表,而是CString*。并且在构造函数中new出内存空间。在析构函数中delete。
6、从MSDN中可以找到这个类的成员函数。有GetSize,Remove,还重载了操作符operator[]。注意这里,如果要获取指定位置的文件名,要这些写(* m_pRecentFileList)[i],因为m_pRecentFileList是个指针。
7、有了这些操作函数和操作符,就可以很轻松的控制文件了。先获取文件个数,再按顺序获取文件名。然后提取文件后缀,比较即可。不是指定类型的后缀,Remove就可以了。但是...
8、有两个问题:
第一:(* m_pRecentFileList)[i]这个有时获取不到文件名。(假设文件名存在)
第二:Remove有时会失效。
对于这两个问题,我跟到系统代码中,想了很久,不得其解。如有高手知道,可以讨论下。
于是我就换了个做法,我直接调用成员变量m_arrNames[i]来取值,m_arrNames[i].empty这样来删除不满足条件的文件名。这样就保证了这两个操作正确执行。
9、网上查一下资料,就会明白,LoadStdProfileSettings(4)函数中的参数是指定MRU的文件个数。如果你指定的数量小。可是你实际通过程序打开的文件多。比如设置为4,打开的文件个数为8.因为存贮是按逆序,所以你删除掉的是最后打开的四个文件,如果你需要的文件在前面的位置,就会无法显示出来。貌似如果列表中第一个是空,后面的内容就读不出来了。
所以我采用一下的代码组织形式:
代码放在app类中的InitInstance()函数中LoadStdProfileSettings(4)函数后面
    //过滤MRU,只保留工程文件
if(m_pRecentFileList !=NULL) 
intnMRUSize =m_pRecentFileList->GetSize(); 
CStringstrMRUFile ="", strFileExten = ""; 
CStringArraystrFileArray; 
//将MRU列表里的工程文件提取出来 
for(int i=0; i<nMRUSize; i++)
{
strMRUFile=m_pRecentFileList->m_arrNames[i]; 
strFileExten =strMRUFile.Mid(strMRUFile.ReverseFind('.') + 1 ); 
if(!strFileExten.Compare("sw")) 
{strFileArray.Add(strMRUFile);
}
m_pRecentFileList->m_arrNames[i].Empty(); 
}//将提取出的工程文件加到MRU列表中 
for(inti=0;i<strFileArray.GetSize();i++) 
{m_pRecentFileList->Add(strFileArray.GetAt(i));
}//将最新的列表写到注册表中 
m_pRecentFileList->WriteList();}
发布了0 篇原创文章 · 获赞 0 · 访问量 1159

猜你喜欢

转载自blog.csdn.net/wyf0903/article/details/11395823