Visual C++/MFC 4.1 - display MRU file at startup
Andi Giri -- agiri@ctiis.com
Thursday, May 02, 1996
Hello
My environment is : Visual C++ 4.1, MFC 4.1 / WIN 95
I am porting a 32-bit MDI application developed using Visual C++ 2.2/MFC 3.0
to run on Visual C++/MFC 4.1.
The project contains
1) Smrt.cpp with this code only
2) MainFrm.cpp, SmrtView.cpp, SmrtDoc.cpp, ChildFrm.cpp
3) A host of non-MFC source code
PROBLEM:
Display the first file in MRU list, when the MDI application is initiated
without any command-line parameter.
DETAILED DESCRIPTION:
The following MFC 3.0-based existing code in CSmrtApp::InitInstance() lets
the first document in the MRU file list get displayed on the initially
created child window, when the app is initiated without a document name in
the command-line paramater.
-----------------------------------------------------
BOOL CSmartListApp::InitInstance()
{
// Standard initialization
.
.
.
// create main MDI Frame window
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
return FALSE;
m_pMainWnd = pMainFrame;
// START - code for command-line parsing and processing
// simple command line parsing
if (m_lpCmdLine[0] == '\0')
{
// Determine if there was a last used file
if( m_pRecentFileList->m_arrNames[0].IsEmpty() )
{
OnFileNew();
}
else
{
// Open the last used file if possible
m_pMainWnd->PostMessage(WM_COMMAND,
MAKEWPARAM(ID_FILE_MRU_FILE1,0),0L);
}
}
else
{
// open an existing document
OpenDocumentFile(m_lpCmdLine);
}
// END - code for command-line parsing and processing
// The main window has been initialized, so show and update it.
pMainFrame->ShowWindow(SW_SHOWMAXIMIZED);
pMainFrame->UpdateWindow();
return TRUE;
}
The problem with code generated by Visual C++ 4.0 is that Command-line
processing is done by a call to ProcessShellCommand() in InitInstance(),
and this in turn calls OnFileNew() if the command line is empty.
ProcessShellCommand() is not a virtual
function for me to override; OnFileNew() is virtual, but there is no way to
figure out whether it was initiated by ProcessShellCommand() or by the user
clicking the menu item File->New later on. If I were to add the above code
to the new 4.0 CWinApp()::InitInstance(),
I will end up having an empty document created by ProcessShellCommand()
initially, and then a separate document created by the message processing
of ID_FILE_MRU_FILE1. I would like to have the MRU document on the first
view itself, not two separate views.
Is there an easy way of doing it, other than writing something like this:
BOOL CSmartListApp::InitInstance()
{
// Standard initialization
.
.
.
// create main MDI Frame window
CMainFrame* pMainFrame = new CMainFrame;
if (!pMainFrame->LoadFrame(IDR_MAINFRAME))
return FALSE;
m_pMainWnd = pMainFrame;
// Parse command line for standard shell commands, DDE, file open
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
// Dispatch commands specified on the command line
if (m_lpCmdLine[0] == '\0') // empty command line
{
if (!MyProcessShellCommand(cmdInfo))
return FALSE;
}
else
if (!ProcessShellCommand(cmdInfo))
return FALSE;
BOOL CWinApp::MyProcessShellCommand(CCommandLineInfo& rCmdInfo)
{
BOOL bResult = TRUE;
if (rCmdInfo.m_nShellCommand == CCommandLineInfo::FileNew)
{
if (m_pMainWnd == NULL)
bResult = FALSE;
m_nCmdShow = SW_SHOWNORMAL;
}
// Determine if there was a last used file
if( m_pRecentFileList->m_arrNames[0].IsEmpty() )
{
OnFileNew();
}
else
{
// Open the last used file if possible
m_pMainWnd->PostMessage(WM_COMMAND,
MAKEWPARAM(ID_FILE_MRU_FILE1,0),0L);
}
return bResult;
}
Frederic Steppe -- FredericS@msn.com
Saturday, May 04, 1996
[Mini-digest: 3 responses]
>My environment is : Visual C++ 4.1, MFC 4.1 / WIN 95
>
>PROBLEM:
>Display the first file in MRU list, when the MDI application is initiated
>without any command-line parameter.
Here is how to do it with VC++ 4.0. I guess it is quite the qame with VC++
4.1
Suppose your application's class name is CMyApp. Add the following lines to
CMyApp class definition :
public:
BOOL ProcessShellCommand(CCommandLineInfo& rCmdInfo);
Remember that you can override a non-virtual function. The main difference is
that if some function of the parent class (CWinApp) calls this function
(ProcessShellCommand), the parent class' function will be called. In this
case, tou call ProcessShellCommand from CMyApp, so the good one will be
executed.
Add the following to CMyApp implementation :
#include // some non-documented classes definition. Needed for
CRecentFileList.
// May change in future releases (still there in VC++ 4.1 ???).
BOOL CMyApp::ProcessShellCommand(CCommandLineInfo& rCmdInfo)
{
if (rCmdInfo.m_nShellCommand == CCommandLineInfo::FileNew) // empty command
line
{
ASSERT(m_pRecentFileList != NULL);
if(m_pRecentFileList->GetSize() > 0 && (*m_pRecentFileList)[0].GetLength() >
0)
{
if(OpenDocumentFile((*m_pRecentFileList)[0]) != NULL)
return TRUE;
m_pRecentFileList->Remove(0);
}
}
return CWinApp::ProcessShellCommand(rCmdInfo);
}
That's it.
Frederic Steppe (frederics@msn.com)
-----From: mikeblas@interserv.com
On Thu, 2 May 1996, Andi Giri wrote:
>My environment is : Visual C++ 4.1, MFC 4.1 / WIN 95
Thanks.
>Is there an easy way of doing it, other than writing something like this:
I would say so! You should write your own override of ParseCommandLine() so
that it tweaks the rCmdInfo.m_nShellCommand value to be what you want.
That's why ParseCommandLine() is there! See if the command line is empty.
If it is, post your message and make rCmdInfo.m_nShellCommand be zero so that
the default implementation of ProcessShellCommand() won't do anything.
.B ekiM
--
TCHAR szDisc[] = _T("These words are my own; I do not speak for Microsoft.");
-----From: Niels Ull Jacobsen
How about just=20
...
if (m_lpCmdLine[0] =3D=3D '\0') // If empty command line - try to open=
most
recent file
{
static CString newCmdLine =3D m_pRecentFileList->m_arrNames[0];
m_lpCmdLine =3D newCmdLine.GetBuffer();
}
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
if (!ProcessShellCommand(cmdInfo))
return FALSE;
Niels Ull Jacobsen, Kr=FCger A/S (nuj@kruger.dk)
Everything stated herein is THE OFFICIAL POLICY of the entire Kruger group
and should be taken as legally binding in every respect. Pigs will grow
wings and fly.
| Вернуться в корень Архива
|