15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


Opening multiple views automatically

Paul E. Rosen -- prosen@fte.com
Friday, November 01, 1996

Environment: VC++4.2flat, Win95

I have created an MDI app with multiple views attached to the same document.
When the user opens a document, I want to put up the same views in the same
places on the screen that the user had when he closed the document. I tried
opening up an extra view in my OnOpenDocument(), but I got a strange child
window that didn't repaint. Also, the framework wants to open up a view
automatically before OnOpenDocument() gets control. Can I suppress that? Where
is the correct place to open up views?

Here is how I'm setting up my Doc/View structure: (Code is heavily edited for
brevity)

class CMyApp : public CWinApp
{
public:
	CMultiDocTemplate* m_pSummary;
	CMultiDocTemplate* m_pLog;
};

BOOL CMyApp::InitInstance()
{
	m_pLog = new CMultiDocTemplate(
		IDR_LOGTYPE,
		RUNTIME_CLASS(CMyDoc),
		RUNTIME_CLASS(CChildFrame),
		RUNTIME_CLASS(CLogView));
	AddDocTemplate(m_pLog);

	m_pSummary = new CMultiDocTemplate(IDR_SUMMARYTYPE,
			RUNTIME_CLASS(CMyDoc),
			RUNTIME_CLASS(CChildFrame),
			RUNTIME_CLASS(CSummaryView));

}

// This is called in response to a button press, it works fine.
void CMyDoc::OnShowsummary()
{
	CMyApp* pApp = (CMyApp*)AfxGetApp();
	CFrameWnd* pFrameWnd = pApp->m_pSummary->CreateNewFrame(this,NULL);
	if (!pFrameWnd)
		return;

	pApp->m_pSummary->InitialUpdateFrame(pFrameWnd, this);
}

// This is how I would like to open a document, but
// 1) a default view that I don't want is created
// 2) the views that I specified are not appearing correctly.
BOOL CMyDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
	if (!CDocument::OnOpenDocument(lpszPathName))
		return FALSE;
	
	CMyApp* pApp = (CMyApp*)AfxGetApp();
	CFrameWnd* pFrameWnd = NULL;
	CMultiDocTemplate* pTemp = NULL;
	pTemp = pApp->m_pSummary;
	pFrameWnd = pTemp->CreateNewFrame(this,NULL);
	pTemp->InitialUpdateFrame(pFrameWnd, this);

	return TRUE;
}

Thanks


Paul Rosen, Frontline Test Equipment, Inc.
Internet: prosen@fte.com, http://www.fte.com, ftp.fte.com
Voice: 804-984-4500, Fax: 804-984-4505, BBS: 804-984-4503
Real Mail: PO Box 7507, Charlottesville, VA  22906-7507, USA
Location: 2114 Angus Road, Suite 228, Charlottesville, VA 22901





Si Cruse -- scruse@csfp.co.uk
Monday, November 04, 1996

Paul E. Rosen wrote:
> 
> Environment: VC++4.2flat, Win95
> 
> I have created an MDI app with multiple views attached to the same document.
> When the user opens a document, I want to put up the same views in the same
> places on the screen that the user had when he closed the document. I tried
> opening up an extra view in my OnOpenDocument(), but I got a strange child
> window that didn't repaint. Also, the framework wants to open up a view
> automatically before OnOpenDocument() gets control. Can I suppress that? Where
> is the correct place to open up views?
> 
> Here is how I'm setting up my Doc/View structure: (Code is heavily edited for
> brevity)
> 
> class CMyApp : public CWinApp
> {
> public:
>         CMultiDocTemplate* m_pSummary;
>         CMultiDocTemplate* m_pLog;
> };
> 
> BOOL CMyApp::InitInstance()
> {
>         m_pLog = new CMultiDocTemplate(
>                 IDR_LOGTYPE,
>                 RUNTIME_CLASS(CMyDoc),
>                 RUNTIME_CLASS(CChildFrame),
>                 RUNTIME_CLASS(CLogView));
>         AddDocTemplate(m_pLog);
> 
>         m_pSummary = new CMultiDocTemplate(IDR_SUMMARYTYPE,
>                         RUNTIME_CLASS(CMyDoc),
>                         RUNTIME_CLASS(CChildFrame),
>                         RUNTIME_CLASS(CSummaryView));
> 
> }

I assume you AddDocTemplate(m_pSummary) ?
Of course you do...

> // This is called in response to a button press, it works fine.
> void CMyDoc::OnShowsummary()
> {
>         CMyApp* pApp = (CMyApp*)AfxGetApp();
>         CFrameWnd* pFrameWnd = pApp->m_pSummary->CreateNewFrame(this,NULL);
>         if (!pFrameWnd)
>                 return;
> 
>         pApp->m_pSummary->InitialUpdateFrame(pFrameWnd, this);
> }
> 
> // This is how I would like to open a document, but
> // 1) a default view that I don't want is created

Don't call OnFileNew from your CMyApp::InitInstance

> // 2) the views that I specified are not appearing correctly.
> BOOL CMyDoc::OnOpenDocument(LPCTSTR lpszPathName)
> {
>         if (!CDocument::OnOpenDocument(lpszPathName))
>                 return FALSE;
> 
>         CMyApp* pApp = (CMyApp*)AfxGetApp();
>         CFrameWnd* pFrameWnd = NULL;
>         CMultiDocTemplate* pTemp = NULL;
>         pTemp = pApp->m_pSummary;
>         pFrameWnd = pTemp->CreateNewFrame(this,NULL);
>         pTemp->InitialUpdateFrame(pFrameWnd, this);
> 
>         return TRUE;
> }
> 

Why is your document creating views? This seems bad OO design to me!
You should have a helper function in your app do the document creation & view 
switching... (Look at the top of your MyApp.cpp and you'll see OnFileNew & OnFileOpen 
reflected to CWinApp. Why not override these yourself to stitch the required views to 
a new document?!)

-- 

...A closed mouth gathers no foot...
_____________________________________________________________
Si Cruse
Front Office IT Development, Credit Suisse Financial Products
1 Cabot Square, London E14 4QJ
Phone: +44 171 516 2948			Fax: +44 171 516 2688
mailto:scruse@csfp.co.uk	 http://www.cruse.demon.co.uk



Jim Lawson Williams -- jimlw@mail.ccur.com.au
Wednesday, November 06, 1996

[Mini-digest: 2 responses]

G'day!

On Fri, 1 Nov 1996 11:17:00 prosen@fte.com (Paul E. Rosen) wrote:

>I want to put up the same views in the same places on the screen that
>the user had when he closed the document.

  You could put the data in the Registry, an .INI file, or actually store 
  it in the document.  I believe all 3 have been discussed over the last
  3 or 4 months.  If you want to be thorough, you should also retain the
  mainframe state.  See Kruglinski's "Inside Visual C++" for his 
  "Persistent Frame" example.

>I got a strange child window that didn't repaint.

  Perhaps due to the lack of a "CDocument::UpdateAllViews()"? 

>the framework wants to open up a view automatically before OnOpenDocument()
>gets control. Can I suppress that?

  See below.  Also discussed recently.

>Where is the correct place to open up views?

  Application and personal-preference dependent, according to when you want
  a new view and how the action is initiated.  I guess that comment isn't too
  helpful, but you give no clues.  Consider, however, the "New Window" 
  mainframe menu-choice:  decide if/how you intend to support that.  Check
  the last few months of the archives for "multiple views". 

Regards,
Jim LW  

BOOL CFredApp::InitInstance()
{
        

    CCommandLineInfo cmdInfo;
    ParseCommandLine(cmdInfo);

    if  (cmdInfo.m_nShellCommand == CCommandLineInfo::FileNew)
    {
        //No new doc. here...
        cmdInfo.m_nShellCommand =  CCommandLineInfo::FileNothing;	
        pMainFrame = new CMainFrame
                     ((CWinApp*) this,/*Doc. Handling Enabled =*/FALSE);
    }
    else
    {
        //handle the doc. we were supplied:
        pMainFrame = new CMainFrame
                     ((CWinApp*) this,/*Doc. Handling Enabled =*/TRUE);
    }
    m_pMainWnd = pMainFrame;

    // Dispatch commands specified on the command line
    if  (!ProcessShellCommand(cmdInfo))
        return FALSE;
    
        
}

-----From: "Alexander Grigoriev" 

Paul,

I think, the best place to create additional child frames is in
OnInitialUpdate of the main view class (created by doc manager).





| Вернуться в корень Архива |