Multiple Views for a Single Document (MDI)
I add here the code that could be used to add multiple views to a document, in a MDI application. I usually make database applications, and I don't want that the document to be created/destroyed by the framework, so I create the document myself (and of course I destroy it J ), and in document's constructor I set the m_bAutoDelete flag to FALSE.
The CMyApp class contains as public member a pointer to my document. I also make document templates for all views, and I keep the pointers in CMyApp. You should have something like this in InitInstance():
m_pView1Templ=new CMultiDocTemplate( IDR_VIEW1TYPE, RUNTIME_CLASS( CMyDoc ), RUNTIME_CLASS( CChildFrame ), RUNTIME_CLASS( CView1 ) ); AddDocTemplate(m_pView1Templ); // m_pView1Templ is member of CMyApp
After you created all necessary document templates, add the following code:
// create main MDI Frame window
CMainFrame* pMainFrame = new CMainFrame;
mp_doc=new CTimeClkDoc;
mp_doc->SetTitle("Just a demo");
CCreateContext context;
context.m_pCurrentDoc=mp_doc;
context.m_pNewViewClass=NULL;
context.m_pNewDocTemplate=NULL;
context.m_pLastView=NULL;
context.m_pCurrentFrame=NULL;
if (!pMainFrame->LoadFrame(IDR_MAINFRAME,WS_OVERLAPPEDWINDOW |
FWS_ADDTOTITLE,NULL, &context ))
return FALSE;
m_pMainWnd = pMainFrame;
This code will allow opening the application without any open view and also avoids the dialog box that asks to choose a document template. Add for each view command handlers similar with this one:
void CMyApp::OnView1()
{
// TODO: Add your command handler code here
CChildFrame* pFrame = new CChildFrame();
CCreateContext context;
context.m_pCurrentDoc=mp_doc; //that's the way I avoid creating
//a new document every time I open
//a new view
context.m_pNewViewClass=RUNTIME_CLASS(CView1);
context.m_pNewDocTemplate=m_pView1Templ;
context.m_pLastView=(((CMainFrame *)m_pMainWnd)->
GetActiveFrame() ? ((CMainFrame *)m_pMainWnd)->
GetActiveFrame()->GetActiveView() : NULL);
context.m_pCurrentFrame=((CMainFrame *)m_pMainWnd)->GetActiveFrame();
if (!pFrame->LoadFrame(IDR_VIEW1TYPE,WS_OVERLAPPEDWINDOW |
FWS_PREFIXTITLE ,m_pMainWnd, &context ))return;
pFrame->InitialUpdateFrame(mp_doc,TRUE);
}

Comments
how to create child window within child windows
Posted by yogesh28577 on 03/28/2006 01:25amsuppose i create abc child windows & xyz child windows but it parent is abc xyz look like child of abc plz help me yogesh shrikhande yogesh28577@yahoo.co.in
ReplyWay easier way to do this
Posted by Legacy on 08/17/2003 12:00amOriginally posted by: Martin Chapman
ReplyHow to close old View
Posted by Legacy on 04/09/2002 12:00amOriginally posted by: Narendra Jain
When I switch view, I want to close the old active view without destroying the Document. Please tell me how can I do it?
Replychild window clean properly?
Posted by Legacy on 02/10/2002 12:00amOriginally posted by: yann
hi! i've tried your code, it works..... one time!!!!
So, when i run my application, i can open the child window, then i close it. then, whithout quit the application, i tried to open the child window a new time, and VC++ tell me about an assertion failed.....
What's wrong ?
Thank's, Yann.
Replyproblem w/ code
Posted by Legacy on 12/13/2001 12:00amOriginally posted by: Mike
I used this code and have one problem. When the view is opened up, there is a flickering on the screen. It is happening after the call to pFrame->LoadForm(). This call is creating the child frame at the wrong size and the pFrame->InitialUpdateFrame() resizes the view to the correct size. Is there a way to prevent this flickering from occuring?
ReplyWhat is the truetype font or vector font file format?
Posted by Legacy on 09/19/2001 12:00amOriginally posted by: jiangli
ReplyHow to create the different views
Posted by Legacy on 03/03/2000 12:00amOriginally posted by: Ehtesham Siddiqui
ReplyPlease add project files
Posted by Legacy on 12/27/1999 12:00amOriginally posted by: Mark Zarzour
Please add project files.
ReplySetting window title for views
Posted by Legacy on 10/08/1999 12:00amOriginally posted by: DD
Using the above I can create multiple views successfully. However, all my views have the same title, in this case "Just a demo". I would like each of my views to have a user provided title. I tried doing "SetWindowText(" XXX") " in the OnInitialUpdate() but it doesnt work. I tried the following:
void CSomeView::OnPaint()
{
CPaintDC dc(this); // device context for painting
CMainFrame* pFrame;
VERIFY( pFrame = (CMainFrame*)GetParentFrame() );
pFrame->SetWindowText("What ever the title is");
}
This works but with multiple windows open the painting sometimes does not refresh window titles correctly.
Is there a better way to set the window title?
Thanks
ReplyHow user two doc/view in MDI Application?
Posted by Legacy on 08/26/1999 12:00amOriginally posted by: Morn Lee
ReplyLoading, Please Wait ...