我在SDI中将窗口切分为三列,第三列对应的是以CFrameWnd类为基类的一个类,然后再对第三列进行切分。具体切分的代码如下:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
VERIFY(m_wndSplitter.CreateStatic(this, 1, 3));
VERIFY(m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftPaneView), CSize(400,200), pContext));
VERIFY(m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CMIddleView), CSize(100,100), pContext));
VERIFY(m_wndSplitter.CreateView(0, 2, RUNTIME_CLASS(CRightPaneFrame), CSize(400,200), pContext));
return true;
return CFrameWnd::OnCreateClient(lpcs, pContext);
}BOOL CRightPaneFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
VERIFY(m_wndSplitter.CreateStatic(this, 2, 1)); VERIFY(m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CRTDrawView), CSize(0,400), pContext));
VERIFY(m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CRTForm), CSize(100,100), pContext));
RecalcLayout();
return true;
return CFrameWnd::OnCreateClient(lpcs, pContext);
}CRTDrawView是工程的视。现在的问题是SDI的菜单和工具条都是对应的CMainFrame的,我在CRightPaneFrame里CRTDrawView里画曲线,若是把菜单项中的函数响应在CRTDrawView这个视里,运行之后,菜单里的项依然是灰色的,不响应,请问我应该怎么办呢?
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
VERIFY(m_wndSplitter.CreateStatic(this, 1, 3));
VERIFY(m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftPaneView), CSize(400,200), pContext));
VERIFY(m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CMIddleView), CSize(100,100), pContext));
VERIFY(m_wndSplitter.CreateView(0, 2, RUNTIME_CLASS(CRightPaneFrame), CSize(400,200), pContext));
return true;
return CFrameWnd::OnCreateClient(lpcs, pContext);
}BOOL CRightPaneFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
VERIFY(m_wndSplitter.CreateStatic(this, 2, 1)); VERIFY(m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CRTDrawView), CSize(0,400), pContext));
VERIFY(m_wndSplitter.CreateView(1, 0, RUNTIME_CLASS(CRTForm), CSize(100,100), pContext));
RecalcLayout();
return true;
return CFrameWnd::OnCreateClient(lpcs, pContext);
}CRTDrawView是工程的视。现在的问题是SDI的菜单和工具条都是对应的CMainFrame的,我在CRightPaneFrame里CRTDrawView里画曲线,若是把菜单项中的函数响应在CRTDrawView这个视里,运行之后,菜单里的项依然是灰色的,不响应,请问我应该怎么办呢?
先设一个m_wndSplitter2
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
VERIFY(m_wndSplitter.CreateStatic(this, 1, 3));
VERIFY(m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftPaneView), CSize(400,200), pContext));
VERIFY(m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CMIddleView), CSize(100,100), pContext)); VERIFY(m_wndSplitter2.CreateStatic(&m_wndSplitter,2, 1, WS_CHILD|WS_VISIBLE, m_wndSplitter.IdFromRowCol(0,2)));
VERIFY(m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CRTDrawView), CSize(0,400), pContext));
VERIFY(m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(CRTForm), CSize(100,100), pContext)); return true;
return CFrameWnd::OnCreateClient(lpcs, pContext);
}
{
//add the following command
m_bAutoMenuEnable = FALSE;
}
1.将CMainFrame与CRTDrawView关联:
在CYourApp中加如下代码:
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CYourDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CRTDrawView));
AddDocTemplate(pDocTemplate);
可以用CMainFrame中的toolbar来控制CRTDrawView.2. 在CRightPaneFrame中加入toolbar控制CRTDrawView,可参考CMainFrame中加入的CToolBar,此时toolbar显示在CRightPaneFrame中,而不是在主bar中了。也需要关联,方法如上,不累述。
我添加过这个
CSingleDocTemplate* pDocTemplate;
pDocTemplate = new CSingleDocTemplate(
IDR_MAINFRAME,
RUNTIME_CLASS(CRTDrawDoc),
RUNTIME_CLASS(CMainFrame),
RUNTIME_CLASS(CRTDrawView));
AddDocTemplate(pDocTemplate);可是还是出错了,是怎么回事呀?
和我的方法合起来用吧.
然后得到该视图的指针,调用其成员即可了。
shu()的方法我试过了,用过之后不能CRightPaneFrame中切分的两个窗口无法改变大小,所以好象不行呀,还是得用我原来的方法,但是就是不知道怎么添加文档模板,用上面的方法添加了之后菜单项还是一样不能响应,依然是灰色的。What should I do?
告诉我你要做什么
我可以帮你改好。
让它继续传.这种分割我也在做.我的是完全可以的.另外有几点.
1:可以在模版中把CView的那个设成NULL,因为你并没有用那个View(即使有同类名的,那也是另外生成的).
2:把那些MenuID在其他类中的消息映射都删掉.只留Doc中的看看.如果还不行,请给我发源码,我帮你瞧瞧.
由于一个模板管理doc/frame/view三个家伙,也就是说一个模板应对应一个frame,你原意在一个框架下开四个view但要两个模板来管理,两个模板对应一个框架无法做到!
不如用mdi,开两个窗口,一个模板对应一个。
我在将问题重新回答:
不用mdi,不用添加新document templete,在你的控制函数中添加如下代码:
CRightPaneFrame* pFrame=static_cast<CRightPaneFrame*>(AfxGetMainWnd());
//get CRightPaneFrame point
CRTDrawView* pView=static_cast<CRTDrawView*>(pFrame->m_wndSplitter.GetPane(1,0));
//get CRTDrawView point
UpdateData(TRUE);
pView->Ondraw(CDC* pDC); //Draw some lines
我说怎么听不懂我说的话呢 :)
在CMainFrame的构造函数中加入下面这一句就ok了
不需要添加文档模版 CMainFrame::CMainFrame()
{
//add the following command
m_bAutoMenuEnable = FALSE;
}
[email protected]
谢谢!