现在因需要做菜单--最近打开文件的功能。
但遇到的问题是:
在使用菜单功能“打开”、“新建”、“另存为”之后,会导致最近打开文件原本显示的全路径消失,只剩下了名称,这让我很郁闷,我想做的是想visual studio的最近打开工程或文件菜单功能那样,可以一直显示全路径的。(包括例如D:\\FOLDER...\\MYPROJECT.SLN这样中间带省略号的,也是我希望允许的。)
我用的系统默认的那个ID_FILE_MRU_RecentList1(记不清了,可能有出入),而是自定义了一个CFileRecentList类, CRecentFileList* m_pRecentListMyFiles; 并添加了UPDATE_COMMAND_UI和ON_COMMAND_EX_RANGE消息响应,以及在相应地方添加的ReadList和WriteList等操作。基本功能都是好的,就是会遇到上面的无法显示全路径的问题,这个问题在任何一个新建工程的默认“最近打开文件”功能都存在相同问题。恳请各位高手指点一二,帮小弟解决困难,不胜感激!
但遇到的问题是:
在使用菜单功能“打开”、“新建”、“另存为”之后,会导致最近打开文件原本显示的全路径消失,只剩下了名称,这让我很郁闷,我想做的是想visual studio的最近打开工程或文件菜单功能那样,可以一直显示全路径的。(包括例如D:\\FOLDER...\\MYPROJECT.SLN这样中间带省略号的,也是我希望允许的。)
我用的系统默认的那个ID_FILE_MRU_RecentList1(记不清了,可能有出入),而是自定义了一个CFileRecentList类, CRecentFileList* m_pRecentListMyFiles; 并添加了UPDATE_COMMAND_UI和ON_COMMAND_EX_RANGE消息响应,以及在相应地方添加的ReadList和WriteList等操作。基本功能都是好的,就是会遇到上面的无法显示全路径的问题,这个问题在任何一个新建工程的默认“最近打开文件”功能都存在相同问题。恳请各位高手指点一二,帮小弟解决困难,不胜感激!
可能我说的不清楚,补充一下
就是刚运行工程时,可以显示例如D:\\FOLDER\\MYPROJECT.SLN这样的全路径,
但当我在运行窗口中的菜单使用打开、新建、另存为的功能时,则上面最近打开文件中显示的这个路径变为:MYPROJECT.SLN
这样,就是我说的路径变化了,不能显示全路径了
我在UPDATE_COMMAND_UI函数里,调用了m_pRecentListMyFiles->UpdateMenu(pCmdUI);
我在想在这里是否能进行更改补充代码,使之可以显示全路径。不过我希望最好在不重载CRecentFileList::UpdateMenu的情况下进行。
自己另做一个是有原因的,因为程序结构要求,把菜单功能都放到了CMainFrame里了。里面不能直接调用APP类的函数。并且关键的是一些信息是写在配置文件里的,所以就自己定义了一个CRecentFileList类
是的。。是写在注册表的,可能觉得自己说的啰嗦,就简单问:
新建的SDI工程的“最近打开文件”菜单在使用菜单“新建”、“打开”、“另存为”之后导致诸如原本D:\\FOLDER\\MYPROJECT.SLN这样的路径,变成MYPROJECT.SLN这样的。(之于注册表里的仍然是完整的路径)
其实我一直纳闷你们怎么会不明白呢,难道“新建一个工程存在这样的问题”这么难理解。
test.txt
abc.txt我的构造函数是:
CRecentFileList* m_pRecentMyFileList;
m_pRecentMyFileList = new CRecentFileList( 0, _T("My Recent File List"), _T("FilePath%d"), 5, 1000);
所以不是这个1000不够大,还请再看看,帮我解决下
的确,打开的路径不相同的文件时,原本显示为 test.txt 和 abc.txt的文件时,再打开D:\AnOther Folder\temp.txt时,显示变成:
1 temp.txt
2 D:\My Folder\test.txt
3 D:\My Folder\abc.txt 本来应该算解开小子的疑惑了,但我想能否让当前打开的也显示全路径呢,这样看起来感觉更能一目了然点。我试着在UPDATE_COMMAND_UI的消息函数中进行操作,但没成功,现在的这个消息函数是:
void CMainFrame::OnUpdateRecentFileList(CCmdUI* pCmdUI)
{
m_pRecentMyFileList.UpdateMenu(pCmdUI);
}
能否在这里面进行操作,使第一个temp.txt显示出全路径。原本我试图通过pCmdUI修改菜单显示的名称,例如修改temp,txt,但第一,路径前面的序号消失了;第二最近打开文件的最后一项菜单会变成跟第一个相同(abc.txt消失了)。所以我修改后的结果就变成了:
D:\AnOther Folder\temp.txt
2 D:\My Folder\test.txt
D:\AnOther Folder\temp.txt所以还请再劳烦帮我看下
的确,打开的路径不相同的文件时,原本显示为 test.txt 和 abc.txt的文件时,再打开D:\AnOther Folder\temp.txt时,显示变成:
1 temp.txt
2 D:\My Folder\test.txt
3 D:\My Folder\abc.txt 本来应该算解开小子的疑惑了,但我想能否让当前打开的也显示全路径呢,这样看起来感觉更能一目了然点。我试着在UPDATE_COMMAND_UI的消息函数中进行操作,但没成功,现在的这个消息函数是:
void CMainFrame::OnUpdateRecentFileList(CCmdUI* pCmdUI)
{
m_pRecentMyFileList.UpdateMenu(pCmdUI);
}
能否在这里面进行操作,使第一个temp.txt显示出全路径。原本我试图通过pCmdUI修改菜单显示的名称,例如修改temp,txt,但第一,路径前面的序号消失了;第二最近打开文件的最后一项菜单会变成跟第一个相同(abc.txt消失了)。所以我修改后的结果就变成了:
D:\AnOther Folder\temp.txt
2 D:\My Folder\test.txt
D:\AnOther Folder\temp.txt所以还请再劳烦帮我看下
{
TCHAR szCurDir[_MAX_PATH];
GetCurrentDirectory(_MAX_PATH, szCurDir);
SetCurrentDirectory(_T("C:\\windows"), /*这里写入一个与m_pRecentMyFileList.m_arrNames 数组里任何一个文件不相同的目录*/);
m_pRecentMyFileList.UpdateMenu(pCmdUI);
SetCurrentDirectory(szCurDir);
}不过这种做法我非常非常的不推荐.可能会引起其他问题.正规的做法是我前边提到的.
谢谢你的回答,非常感谢。其实我一直在等你说的SetCurrentDirectory(szCurDir)这样的方法出现,但同时我自己也感觉有些不是很好,如你所说的那样可能会引起其他的一些问题。谢谢你辛苦的回答,虽然得到了一条简单的方法,但我还是会听从你的去从CRecentFileList派生一个新类重载CRecentFileList::UpdateMenu 函数。这帖子到此就结了。。能得到满意的答案我很开心。非常感谢bjx_bjx(异之意) 的帮助,感谢xianglitian(向立天)的关注,呵呵。