因为我要实现二个子窗口里的鼠标操作不同,所以需要创建不同有view来管理,我现在想在原来的基础上再增加一个view类,但是碰到了问题:
原系统是MDI,有一个CScrollView,现在想再建一个继承自CView的类,但是这个类希望能调用原来的那个XXXDoc中的函数,也就是需要使用原来的文档类,只是调用另外一个视图类,别的都跟原来的一样,这样的话如何创建这个子窗口?
原系统是MDI,有一个CScrollView,现在想再建一个继承自CView的类,但是这个类希望能调用原来的那个XXXDoc中的函数,也就是需要使用原来的文档类,只是调用另外一个视图类,别的都跟原来的一样,这样的话如何创建这个子窗口?
CXXXDoc* CYourView::GetDocument()
{
CTheScrollView *pview;
CMainFrame *pMainFrame;
pMainFrame = (CMainFrame *)AfxGetApp()->GetMainWnd();
pview = STATIC_DOWNCAST(CTheScrollView, pMainFrame->GetActiveView());
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CXXXDoc)));
return (CXXXDoc*)m_pDocument;
}
楼主应该添加一个文档模板,比如
CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_FISHTYPE,
RUNTIME_CLASS(CFishDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CFishView));
AddDocTemplate(pDocTemplate);这样就将文档-框架-视图联系起来,
建议楼主参阅《深入浅出MFC》侯××著。
不知道楼主是这个意思,还是只要以后新建的都是那个自定义的,呵呵
{
// TODO: Add your command handler code here
CView* pOldVIew = GetActiveFrame()->GetActiveView();
if (pOldVIew->IsKindOf(RUNTIME_CLASS(CView)))
{
//更新数据
pOldVIew->OnInitialUpdate();
}
else
{
pOldVIew->ShowWindow(SW_HIDE);
if (m_pNewView == NULL)
{
CCreateContext context;
context.m_pNewViewClass = RUNTIME_CLASS(CView);
context.m_pCurrentDoc = GetActiveFrame()->GetActiveDocument();
CView* pNewView= STATIC_DOWNCAST(CView, CreateView(&context));
m_pNewView = (CNewView* )pNewView;
}
if (m_pNewView != NULL)
{
m_pNewView->GetParentFrame()->ShowWindow(SW_SHOW); } }
}
我的意思是:一会是新建旧的,系统的view,一会是新建自定义的那个view
你看我的回复,你新建一个c××view类后,如果和原来的文档绑定,就必须要AddDocTemplate(pDocTemplate);你在app的那个InitInstance()函数中添加。
注意相关参数。
pDocTemplate = new CMultiDocTemplate(
IDR_DRAWTYPE,
RUNTIME_CLASS(CDRAWDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CDRAWView));
AddDocTemplate(pDocTemplate); CMultiDocTemplate* pViewDocTemplate;
pViewDocTemplate = new CMultiDocTemplate(
IDR_DRAWTYPE,
RUNTIME_CLASS(CDRAWDoc),
RUNTIME_CLASS(CChildFrame),
RUNTIME_CLASS(CDRAWView1));
AddDocTemplate(pViewDocTemplate);
可以这样,
在CMyAPP中,定义两个成员指针protected:
CMultiDocTemplate* m_p1;
CMultiDocTemplate* m_p2;在CMyApp::InitInstance()中
这样做 CMultiDocTemplate* pDocTemplate;
pDocTemplate = new CMultiDocTemplate(
IDR_MYTYPE,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CMyView));
AddDocTemplate(pDocTemplate);
m_p1 = pDocTemplate;
此为视图1,或者说是系统生成的
CMultiDocTemplate* pDocTemplate1;
pDocTemplate1 = new CMultiDocTemplate(
IDR_MYTYPE,
RUNTIME_CLASS(CMyDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
RUNTIME_CLASS(CMyView1));
AddDocTemplate(pDocTemplate1);
m_p2 = pDocTemplate1; 这个CMyView1是你自己做的那个视图 于是,要生成CMyView的窗口
调用m_p1 ->OpenDocumentFile(NULL); 于是,要生成CMyView1的窗口
调用m_p2 ->OpenDocumentFile(NULL);
最后一点,原来窗口上有个打开的菜单,就是系统自带的菜单,如果你要使它还是新建旧的视图
那么在CmyApp中响应ON_FILE_NEW,在其中调用
void CMyApp::OnFileNew()
{
// TODO: Add your command handler code here
m_p1->OpenDocumentFile(NULL);
}
嗯,嗯,你所有新建子窗口的响应最好在app中做,个人觉得,因为默认就是这样的,呵呵