首先:
做好你的框架类,如:CMyFrame,继承于CFrameWnd
做好你的文档类,如:CMyDoc,继承于CDocument
做好你的视图类,如:CMyView,继承于CScrollView
BOOL CMainFrame::OpenMyView(CWnd* pParent)
{
CMyFrame* pFrame = (CMyFrame*)RUNTIME_CLASS(CMyFrame)->CreateObject();
if (!pFrame->Create(AfxRegisterWndClass(CS_DBLCLKS, 0, ::GetSysColorBrush(COLOR_WINDOWFRAME), 0), NULL, WS_CHILD | WS_VISIBLE, rectDefault, pParent))
{
return FALSE;
}
CDocument* pDoc = (CDocument*)RUNTIME_CLASS(CMyDoc)->CreateObject();
pDoc->m_bEmbedded = FALSE;
pDoc->m_bAutoDelete = TRUE;
CCreateContext context;
context.m_pCurrentFrame = pFrame;
context.m_pCurrentDoc = pDoc;
context.m_pNewViewClass = RUNTIME_CLASS(CMyView);
context.m_pNewDocTemplate = NULL;
CView* pView = (CView*)pFrame->CreateView(&context);
if (pView == NULL)
{
return FALSE;
}
pFrame->SetActiveView(pView);
return TRUE;
}
{
CMyFrame* pFrame = (CMyFrame*)RUNTIME_CLASS(CMyFrame)->CreateObject();
if (!pFrame->Create(AfxRegisterWndClass(CS_DBLCLKS, 0, ::GetSysColorBrush(COLOR_WINDOWFRAME), 0), NULL, WS_CHILD | WS_VISIBLE, rectDefault, pParent))
{
return FALSE;
}
CDocument* pDoc = (CDocument*)RUNTIME_CLASS(CMyDoc)->CreateObject();
pDoc->m_bEmbedded = FALSE;
pDoc->m_bAutoDelete = TRUE;
CCreateContext context;
context.m_pCurrentFrame = pFrame;
context.m_pCurrentDoc = pDoc;
context.m_pNewViewClass = RUNTIME_CLASS(CMyView);
context.m_pNewDocTemplate = NULL;
CView* pView = (CView*)pFrame->CreateView(&context);
if (pView == NULL)
{
return FALSE;
}
pFrame->SetActiveView(pView);
return TRUE;
}
这样,你的三个类就可以协调工作了。如果你想在MyFrame中加载你的工具栏或做其它工作,可以其WM_CREATE消息中完成。
在视图类中,可以这样得到你的文档类指针:
CMyDoc* CMyView::GetDocument()
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
return (CMyDoc*)m_pDocument;
}
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMyDoc)));
return (CMyDoc*)m_pDocument;
}
在其它类中想得到文档类或视图类指针,可以这样:
CMyDoc* CMainFrame::GetMyDoc(CWnd* pParent)
{
CMyFrame* pFrame = (CMyFrame*)pParent->GetWindow(GW_CHILD);//这只限于父窗口中只有MyFrame一个子窗口,如果有多个子窗口,可用循环比较类名的方法来获得
CMyDoc* pDoc = (CMyDoc*)pFrame->GetActiveDocument();
return pDoc;
}
CMyView* CMainFrame::GetMyView(CWnd* pParent)
{
CMyFrame* pFrame = (CMyFrame*)pParent->GetWindow(GW_CHILD););//这只限于父窗口中只有MyFrame一个子窗口,如果有多个子窗口,可用循环比较类名的方法来获得
CMyView* pView = (CMyView*)pFrame->GetActiveView();
return pView;
}
{
CMyFrame* pFrame = (CMyFrame*)pParent->GetWindow(GW_CHILD);//这只限于父窗口中只有MyFrame一个子窗口,如果有多个子窗口,可用循环比较类名的方法来获得
CMyDoc* pDoc = (CMyDoc*)pFrame->GetActiveDocument();
return pDoc;
}
CMyView* CMainFrame::GetMyView(CWnd* pParent)
{
CMyFrame* pFrame = (CMyFrame*)pParent->GetWindow(GW_CHILD););//这只限于父窗口中只有MyFrame一个子窗口,如果有多个子窗口,可用循环比较类名的方法来获得
CMyView* pView = (CMyView*)pFrame->GetActiveView();
return pView;
}
是不很方便呀?这样就少了新建,打开,加入窗口列表,增加窗口标题等咱们并不一定需要的功能,且可任选父窗口,不需要初始化时加入文档列表,不需要专门为这类文档视图做一个资源。