我在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这个视里,运行之后,菜单里的项依然是灰色的,不响应,请问我应该怎么办呢?

解决方案 »

  1.   

    我认为没有必要用CRightPaneFrame,如果用好像要把他加到一个新的文档模版中才会使框架菜单起作用,我改了一下你试试:
    先设一个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);
    }
      

  2.   

    请问 shu():  如果我要针对这个问题给CRightPaneFrame添加一个文档模板的话,请问应该怎么添加呢?
      

  3.   

    我知道是用这个的语句,也知道是在哪里添加,问题是如果CRightPanrFrame是自己添加的类,没有对应的菜单,而且要跟CMainFrame对应同一个CRTDrawView视,不知道应该怎么添加?
      

  4.   

    CMainFrame::CMainFrame()
    {
      //add the following command
       m_bAutoMenuEnable  = FALSE;
    }
      

  5.   

    To siphonelee(sifone) :啊?不明白呀,能不能再说得明白一点呢?
      

  6.   

    我有两种解决方法(仅供参考):
    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中了。也需要关联,方法如上,不累述。
          
      

  7.   

    To wacky(知足者常乐) :
    我添加过这个
    CSingleDocTemplate* pDocTemplate;
    pDocTemplate = new CSingleDocTemplate(
    IDR_MAINFRAME,
    RUNTIME_CLASS(CRTDrawDoc),
    RUNTIME_CLASS(CMainFrame),    
    RUNTIME_CLASS(CRTDrawView));
    AddDocTemplate(pDocTemplate);可是还是出错了,是怎么回事呀?
      

  8.   

    如果菜单或者工具栏的消息映射,只能在它获得焦点时起作用.把消息重新映射到frame中或者doc中.只要动态创建时有PContext,View都会加进docTemplate中,不用担心,也就是都可以响应doc的UpdateAllViews();
      

  9.   

    这种frame中套frame不知标准吗?
      

  10.   

    还是用shu() (  ) 信誉:88  2002-08-30 15:38:00  得分:0  
    和我的方法合起来用吧.
      

  11.   

    你把消息映射到FRAME中
    然后得到该视图的指针,调用其成员即可了。
      

  12.   

    To littlefellow() :
    shu()的方法我试过了,用过之后不能CRightPaneFrame中切分的两个窗口无法改变大小,所以好象不行呀,还是得用我原来的方法,但是就是不知道怎么添加文档模板,用上面的方法添加了之后菜单项还是一样不能响应,依然是灰色的。What should I do?
      

  13.   

    吧你的源代码email给我
    告诉我你要做什么
    我可以帮你改好。
      

  14.   

    听我的没错.shu()的方法可以的.另外,OnCreateClient不要直接返回true;
    让它继续传.这种分割我也在做.我的是完全可以的.另外有几点.
     1:可以在模版中把CView的那个设成NULL,因为你并没有用那个View(即使有同类名的,那也是另外生成的).
     2:把那些MenuID在其他类中的消息映射都删掉.只留Doc中的看看.如果还不行,请给我发源码,我帮你瞧瞧.
      

  15.   

    我觉得你要坚持用另一个新的模板,应该是另外一个思路:
    由于一个模板管理doc/frame/view三个家伙,也就是说一个模板应对应一个frame,你原意在一个框架下开四个view但要两个模板来管理,两个模板对应一个框架无法做到!
    不如用mdi,开两个窗口,一个模板对应一个。
      

  16.   

    实在对不起,可能由于昨晚太忙搞错了一个问题。由于你用的single document templete,所以不能在加文档摸板。只能是单一的文档摸板。我的方法适用于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
      

  17.   

    原来是jj
    我说怎么听不懂我说的话呢 :)
    在CMainFrame的构造函数中加入下面这一句就ok了
    不需要添加文档模版 CMainFrame::CMainFrame()
    {
      //add the following command
       m_bAutoMenuEnable  = FALSE;

      

  18.   

    你们的方法除了MDI之外,我都试过了,好象还是不行呀
      

  19.   

    To wacky(虽然我很笨):要! 
    [email protected]
    谢谢!