MFC中recent菜单部分是如何封装的? MFC中recent菜单部分是如何封装的?我想修改修改。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 看MFC的源码吧,方法如下:把c:\program files\microsoft visual studio\VC 目录下的所有文件复制到另外一个目录中新建一个 Win32 Application的空工程,把 include 和 MFC 目录下的所有源码都添加到工程中去 MRU(最近使用的)文件问:我想将最近使用过的几个文件名(以及路径)显示出来,该怎么办?答:一个由向导生成器生成的文档视图结图已经包含MRU列表操作.具体是放在注册表的 HKEY_CURRENT_USER/Software/Your Company Name/Your App Name/Recent File List/File1, File2, File3, etc. 你所要做的是用程序中的GetProfileString()读入第一个MRU文件的位置,剩下的由 CRecentFileList::ReadList()完成所有的工作.CRecentFileList类包含了所有操作 的代码象分析路径,管理MRU文件等,用不着为此费心. 2)在AFXWIN.H中定义了一个变量CRecentFileList* m_pRecentFileList; 你可以通过使用CRecentFileList的成员变量m_arrNames[n]来取得某个MRU文件.比如:#include // needed for access to MRU listCfile mruFile;if ( !mruFile.Open( m_pRecentFileList->m_arrNames[index], Cfile::modeRead ).... 3)你不需要建立一个CRecentFileList类,它已经由CWinApp基类完成了.你只要保证你在 initinstance中调用LoadStdProfileSettings()函数就可以了. CRecentFileList类中有一个CWinApp保护成员变量(如m_pRecentFileList) 所以你应该在你的继承类中处理它.下面的代码在我这儿工作很正常void CMdiApp::OnFileMruFile1(){ // TODO: Add your command handler code here Cstring vl_name ; ASSERT( m_pRecentFileList->GetSize() > 0); vl_name = (*m_pRecentFileList)[0]; CWinApp::OnOpenRecentFile(ID_FILE_MRU_FILE1);}OnOpenRecentFile()函数必须要调用缺省处理,其它的就随便了 如何重载MRU文件? 我创建了一个应用程序可以载入图象文件,但当我点击FILE菜单下MRU文件列表时,却不能从磁盘载入以前曾经打开过的文件.下面是我所能想到的解决方案:(1)在文档类中定义一个成员函数(例如:CMyDoc::Reopen)来处理重新打开这个问题,指明参数和返回值.(2)产生一个CMultiDocTemplate的继承类(如CMyDocTemplate),定义一个构造函数,取和基类相同的参数,不做任何事,只是调用基类的构造函数.(3)重载MatchDocType:CMyDocTemplate::Confidence CMyDocTemplate::MatchDocType( LPCTSTR lpszPath, CDocument *&rpDocMatch ){ Confidence match = CMultiDocTemplate::MatchDocType(lpszPath, rpDocMatch); if(yesAlreadyOpen == match) // clear enough { ASSERT_KINDOF(CMyDoc, rpDocMatch); ((CMyDoc *) rpDocMatch)->Reopen(/* your parameters */); // you can take any other actions here... } return match;}当这个函数返回"yesAlreadyOpen"时,你的文档框架将会被激活. 我的多文档程序中有一个是没有doc/view结构的,我想让他出现在recent的地方,就必须改写recent部分代码。还有我想做成CodeWarrior的recent样式,就是工程文件和代码文件之间用一个-分割开,我想应该不是太难,谁可以给点建议,我还不想自己实现一个recent菜单,那样代码太多了,还有考虑管理,麻烦。 在“C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src\mfc\appcore.cpp”文件中有如下两行:ON_UPDATE_COMMAND_UI(ID_FILE_MRU_FILE1, OnUpdateRecentFileMenu)ON_COMMAND_EX_RANGE(ID_FILE_MRU_FILE1, ID_FILE_MRU_FILE16, OnOpenRecentFile)所以,当用户选择文件菜单中MRU列表项时,会调用WinApp::OpenDocumentFile,进而调用CSingleDocTemplate::OpenDocumentFile或CMultiDocTemplate::OpenDocumentFile函数。而在CSingleDocTemplate::OpenDocumentFile或CMultiDocTemplate::OpenDocumentFile中一定会有类似的如下两条语句:pDocument->OnOpenDocument(lpszPathName);pDocument->SetPathName(lpszPathName);其中第一条语句调用CDocument::OnOpenDocument,所以如果你要实现你自己的打开操作,比如打开图片文件、视频文件等,那么你可以在你自己的文档类中重写OnNewDocument函数,如下所示:BOOL CXxxDoc::OnOpenDocument(LPCTSTR lpszPathName){ if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE; //应该在这里打开文档的! AfxMessageBox("在这里打开文档! ", MB_ICONINFORMATION + MB_OK); return TRUE;}其中第二条语句调用CDocument::SetPathName,由它实现:取完整路径、设置文档标题、添加菜单MRU列表项等功能,类似这样:void CDocument::SetPathName(LPCTSTR lpszPathName, BOOL bAddToMRU){ //... //添加MRU列表项 if (bAddToMRU) AfxGetApp()->AddToRecentFileList(m_strPathName); //...} 再看一下这两行:ON_UPDATE_COMMAND_UI(ID_FILE_MRU_FILE1, OnUpdateRecentFileMenu)ON_COMMAND_EX_RANGE(ID_FILE_MRU_FILE1, ID_FILE_MRU_FILE16, OnOpenRecentFile)实现自己的MRU列表的难处可能在于第一行,标准的CWinApp::OnUpdateRecentFileMenu函数中有这样的语句:m_pRecentFileList->UpdateMenu(pCmdUI);由CRecentFileList::UpdateMenu函数用来更新菜单中的MRU文件列表项,不幸的这是一个非常复杂的函数,不易改写。 全文整理如下:一、在“C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src\mfc\appcore.cpp”文件中有如下两行:ON_UPDATE_COMMAND_UI(ID_FILE_MRU_FILE1, OnUpdateRecentFileMenu)ON_COMMAND_EX_RANGE(ID_FILE_MRU_FILE1, ID_FILE_MRU_FILE16, OnOpenRecentFile)我们先看这二行,因为它,当用户选择文件菜单中MRU列表项时,会调用WinApp::OnOpenRecentFile,其中调用WinApp::OpenDocumentFile,进而调用CSingleDocTemplate::OpenDocumentFile或CMultiDocTemplate::OpenDocumentFile函数。而在CSingleDocTemplate::OpenDocumentFile或CMultiDocTemplate::OpenDocumentFile中一定会有类似的如下两条语句:pDocument->OnOpenDocument(lpszPathName); --- 第一条语句pDocument->SetPathName(lpszPathName); --- 第二条语句其中第一条语句调用CDocument::OnOpenDocument,所以如果你要实现你自己的打开操作,比如打开图片文件、视频文件等,那么你可以在你自己的文档类中重写OnOpenDocument函数,如下所示:BOOL CXxxDoc::OnOpenDocument(LPCTSTR lpszPathName){ if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE; //应该在这里打开文档的! AfxMessageBox("在这里打开文档! ", MB_ICONINFORMATION + MB_OK); return TRUE;}其中第二条语句调用CDocument::SetPathName,由它实现:取完整路径、设置文档标题、添加菜单MRU列表项等功能,类似这样:void CDocument::SetPathName(LPCTSTR lpszPathName, BOOL bAddToMRU){ //... //添加MRU列表项 if (bAddToMRU) AfxGetApp()->AddToRecentFileList(m_strPathName); //...}二、再看一下这两行:ON_UPDATE_COMMAND_UI(ID_FILE_MRU_FILE1, OnUpdateRecentFileMenu)ON_COMMAND_EX_RANGE(ID_FILE_MRU_FILE1, ID_FILE_MRU_FILE16, OnOpenRecentFile)实现自己的MRU列表的难处可能在于第一行,标准的CWinApp::OnUpdateRecentFileMenu函数中有这样的语句:m_pRecentFileList->UpdateMenu(pCmdUI);CRecentFileList::UpdateMenu函数用来更新菜单中的MRU文件列表项,不幸的这是一个非常复杂的函数,不易改写 输入法编码字符中有阿拉伯数字,码表怎么处理? 位图叠加的问题 谁能说说这个函数的第一个参数是什么意思? 一个奇怪的问题:Access库中的表名不能为User? tcp数据通信的时候为什么数据包会被自动分成多个包? 引用寄存器 怎么把1000000变成1,000,000格式?有无直接的库函数? 哪位做过VC6与PLC通信?给点思路 谁能提供一个写注册表的实例! 如何将我的一个线程映射到别的程序的地址空间里? 莫名其妙的问题??? !!!FTP上传进度的问题!!¥·#¥·
把c:\program files\microsoft visual studio\VC 目录下的所有文件复制到另外一个目录中
新建一个 Win32 Application的空工程,把 include 和 MFC 目录下的所有源码都添加到工程中去
问:我想将最近使用过的几个文件名(以及路径)显示出来,该怎么办?
答:一个由向导生成器生成的文档视图结图已经包含MRU列表操作.具体是放在注
册表的 HKEY_CURRENT_USER/Software/Your Company Name/Your App Name/Recent File List/File1, File2, File3, etc.
你所要做的是用程序中的GetProfileString()读入第一个MRU文件的位置,
剩下的由 CRecentFileList::ReadList()完成所有的工作.CRecentFileList类
包含了所有操作 的代码象分析路径,管理MRU文件等,用不着为此费心.
2)在AFXWIN.H中定义了一个变量CRecentFileList* m_pRecentFileList;
你可以通过使用CRecentFileList的成员变量m_arrNames[n]来取得某个MRU文件.
比如:#include
// needed for access to MRU listCfile mruFile;
if ( !mruFile.Open( m_pRecentFileList->m_arrNames[index],
Cfile::modeRead )
....
3)你不需要建立一个CRecentFileList类,它已经由CWinApp基类完成了.你
只要保证你在 initinstance中调用LoadStdProfileSettings()函数就可以了. CRecentFileList类中有一个CWinApp保护成员变量
(如m_pRecentFileList) 所以你应该在你的继承类中处理它.下面的代码在
我这儿工作很正常void CMdiApp::OnFileMruFile1()
{
// TODO: Add your command handler code here
Cstring vl_name ;
ASSERT( m_pRecentFileList->GetSize() > 0);
vl_name = (*m_pRecentFileList)[0];
CWinApp::OnOpenRecentFile(ID_FILE_MRU_FILE1);
}
OnOpenRecentFile()函数必须要调用缺省处理,其它的就随便了
我创建了一个应用程序可以载入图象文件,但当我点击FILE菜单下MRU文件列表
时,却不能从磁盘载入以前曾经打开过的文件.下面是我所能想到的解决方案:
(1)在文档类中定义一个成员函数(例如:CMyDoc::Reopen)来处理重新打开这个问
题,指明参数和返回值.
(2)产生一个CMultiDocTemplate的继承类(如CMyDocTemplate),定义一个构造函
数,取和基类相同的参数,不做任何事,只是调用基类的构造函数.
(3)重载MatchDocType:
CMyDocTemplate::Confidence CMyDocTemplate::MatchDocType(
LPCTSTR lpszPath,
CDocument *&rpDocMatch
)
{
Confidence match = CMultiDocTemplate::MatchDocType(lpszPath, rpDocMatch); if(yesAlreadyOpen == match) // clear enough
{
ASSERT_KINDOF(CMyDoc, rpDocMatch);
((CMyDoc *) rpDocMatch)->Reopen(/* your parameters */); // you can take any other actions here...
} return match;
}
当这个函数返回"yesAlreadyOpen"时,你的文档框架将会被激活.
还有我想做成CodeWarrior的recent样式,就是工程文件和代码文件之间用一个-分割开,我想应该不是太难,谁可以给点建议,我还不想自己实现一个recent菜单,那样代码太多了,还有考虑管理,麻烦。
ON_UPDATE_COMMAND_UI(ID_FILE_MRU_FILE1, OnUpdateRecentFileMenu)
ON_COMMAND_EX_RANGE(ID_FILE_MRU_FILE1, ID_FILE_MRU_FILE16, OnOpenRecentFile)所以,当用户选择文件菜单中MRU列表项时,会调用WinApp::OpenDocumentFile,进而调用CSingleDocTemplate::OpenDocumentFile或CMultiDocTemplate::OpenDocumentFile函数。
而在CSingleDocTemplate::OpenDocumentFile或CMultiDocTemplate::OpenDocumentFile中一定会有类似的如下两条语句:
pDocument->OnOpenDocument(lpszPathName);
pDocument->SetPathName(lpszPathName);其中第一条语句调用CDocument::OnOpenDocument,所以如果你要实现你自己的打开操作,比如打开图片文件、视频文件等,那么你可以在你自己的文档类中重写OnNewDocument函数,如下所示:
BOOL CXxxDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE; //应该在这里打开文档的!
AfxMessageBox("在这里打开文档! ", MB_ICONINFORMATION + MB_OK); return TRUE;
}其中第二条语句调用CDocument::SetPathName,由它实现:取完整路径、设置文档标题、添加菜单MRU列表项等功能,类似这样:
void CDocument::SetPathName(LPCTSTR lpszPathName, BOOL bAddToMRU)
{
//... //添加MRU列表项
if (bAddToMRU)
AfxGetApp()->AddToRecentFileList(m_strPathName); //...
}
ON_UPDATE_COMMAND_UI(ID_FILE_MRU_FILE1, OnUpdateRecentFileMenu)
ON_COMMAND_EX_RANGE(ID_FILE_MRU_FILE1, ID_FILE_MRU_FILE16, OnOpenRecentFile)实现自己的MRU列表的难处可能在于第一行,标准的CWinApp::OnUpdateRecentFileMenu函数中有这样的语句:
m_pRecentFileList->UpdateMenu(pCmdUI);由CRecentFileList::UpdateMenu函数用来更新菜单中的MRU文件列表项,不幸的这是一个非常复杂的函数,不易改写。
一、
在“C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src\mfc\appcore.cpp”文件中有如下两行:
ON_UPDATE_COMMAND_UI(ID_FILE_MRU_FILE1, OnUpdateRecentFileMenu)
ON_COMMAND_EX_RANGE(ID_FILE_MRU_FILE1, ID_FILE_MRU_FILE16, OnOpenRecentFile)我们先看这二行,因为它,当用户选择文件菜单中MRU列表项时,会调用WinApp::OnOpenRecentFile,其中调用WinApp::OpenDocumentFile,进而调用CSingleDocTemplate::OpenDocumentFile或CMultiDocTemplate::OpenDocumentFile函数。
而在CSingleDocTemplate::OpenDocumentFile或CMultiDocTemplate::OpenDocumentFile中一定会有类似的如下两条语句:
pDocument->OnOpenDocument(lpszPathName); --- 第一条语句
pDocument->SetPathName(lpszPathName); --- 第二条语句其中第一条语句调用CDocument::OnOpenDocument,所以如果你要实现你自己的打开操作,比如打开图片文件、视频文件等,那么你可以在你自己的文档类中重写OnOpenDocument函数,如下所示:
BOOL CXxxDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE; //应该在这里打开文档的!
AfxMessageBox("在这里打开文档! ", MB_ICONINFORMATION + MB_OK); return TRUE;
}其中第二条语句调用CDocument::SetPathName,由它实现:取完整路径、设置文档标题、添加菜单MRU列表项等功能,类似这样:
void CDocument::SetPathName(LPCTSTR lpszPathName, BOOL bAddToMRU)
{
//... //添加MRU列表项
if (bAddToMRU)
AfxGetApp()->AddToRecentFileList(m_strPathName); //...
}
二、
再看一下这两行:
ON_UPDATE_COMMAND_UI(ID_FILE_MRU_FILE1, OnUpdateRecentFileMenu)
ON_COMMAND_EX_RANGE(ID_FILE_MRU_FILE1, ID_FILE_MRU_FILE16, OnOpenRecentFile)实现自己的MRU列表的难处可能在于第一行,标准的CWinApp::OnUpdateRecentFileMenu函数中有这样的语句:
m_pRecentFileList->UpdateMenu(pCmdUI);CRecentFileList::UpdateMenu函数用来更新菜单中的MRU文件列表项,不幸的这是一个非常复杂的函数,不易改写