Visual C++ 7.1Visual Studio 6Visual C++ 7.0Windows 2003Windows 2000Visual C++ 6.0Windows XPMFC中级开发Visual StudioWindowsC++
适用于文档/视图架构的附加组合 MRU






4.29/5 (6投票s)
2003年5月2日

45145

612
在文档表单视图的组合框中反映的文档/视图 MRU
引言
有一天,我需要创建一个SDI应用程序,该应用程序需要在文档表单视图的组合框中实现MRU功能。我不是高级VC程序员,所以我不假装这是最好的解决方案。这篇文章是为那些搜索此类示例的初学者准备的。
需要完成什么?
使用VC向导创建一个普通的SDI应用程序。对于我的项目,我指定了MRU大小为5。
使用类向导覆盖应用程序对象(派生自CWinApp
)的默认OnCmdMsg
消息分派器。在我的示例中,应用程序对象是CTestFormApp
。
BOOL CTestFormApp::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo) { BOOL temp = CWinApp::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo); if (nID >= ID_FILE_MRU_FILE1 && nID <= ID_FILE_MRU_FILE1 + 4) if (nCode == CN_COMMAND) UpdateComboMRU(); return temp; }
UpdateComboMRU
的实现如下所示
#include "afxpriv.h" // needed because there is a forward class //declaration of CRecentFileList CTestFormApp::UpdateComboMRU() { CComboBox & combo=((CTestFormView*)( (CFrameWnd*)m_pMainWnd)->GetActiveView())->m_ComboMRU; CString x; combo.ResetContent(); for (int i = 0; i < m_pRecentFileList->m_nSize; i++) { if (!m_pRecentFileList->GetDisplayName(x, i, NULL, NULL)) break; combo.AddString(x); // update the combo from MRU object } combo.SetCurSel(0); // select first MRU file }
CTestFormView
是我的文档视图类,而m_ComboMRU
是在视图中显示的CComboBox
对象。
为了使事情顺利进行,需要以下调用
((CTestFormApp*)AfxGetApp())->UpdateComboMRU();
from
- 表单视图的
OnInitialUpdate
- 文档的
OnOpenDocument
- 文档的
DoSave
就像这样
void CTestFormView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
((CTestFormApp*)AfxGetApp())->UpdateComboMRU();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
}
BOOL CTestFormDoc::OnOpenDocument(LPCTSTR lpszPathName) { if (!CDocument::OnOpenDocument(lpszPathName)) return FALSE; ((CTestFormApp*)AfxGetApp())->UpdateComboMRU(); return TRUE; }
BOOL CTestFormDoc::DoSave(LPCTSTR lpszPathName, BOOL bReplace)
{
BOOL temp = CDocument::DoSave(lpszPathName, bReplace);
((CTestFormApp*)AfxGetApp())->UpdateComboMRU();
return temp;
}
你需要覆盖DoSave
。该网站上有一篇关于此的文章
- CDocument::DoSave 揭秘,作者:Nishant S