none
MFC视图分割问题 RRS feed

  • 问题

  • 各位好:

          我遇到一个这样的问题。我想再一个单文档中对主窗体进行分割,通过网上查阅的资料,在OnCreateClient中使用CreateStatic和CreateView方法可以实现。

    但是,我现在遇到另外一个问题。上面的方式是在第一次打开界面时,就分割好了。然而,我想在初始化的时候并不分割,

    在单击某个菜单选项(“分割”)时,才分割。这样的效果怎么实现?

    我的想法是,创建一个新类,继承CFrameWnd,在单击后响应函数中创建新的子窗体,然而这个窗体是脱离主窗体的,

    我尝试将这个窗体停靠在主窗体中,可是没有成功,这个方式说明失败了。

    求高手,讲解!

    2011年7月17日 12:25

答案

  • 可以不需要创建一个新类,您可以直接添加菜单项的WM_COMMAND命令消息到您的View类中,在View类中来动态拆分视图框架窗口,类似这样:

    CSplitterWnd m_wndSplitter;
    BOOL m_bSplitter; // 在View类的构造函数中初始化为FALSE
    
    void CXXXView::OnSplitterwnd() 
    {
    	// TODO: Add your command handler code here
    	if(NULL == m_wndSplitter.GetSafeHwnd())
    	{
    		CCreateContext cc;
    		memset(&cc, 0, sizeof(CCreateContext));
    		
    		CRect rc;
    		GetWindowRect(&rc);
    		
    		VERIFY(m_wndSplitter.CreateStatic(this, 1, 2, WS_CHILD | WS_VISIBLE));
    		
    		cc.m_pNewViewClass = RUNTIME_CLASS(CLeftView);
    		VERIFY(m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftView), CSize(300, rc.Height()), &cc));
    		
    		cc.m_pNewViewClass = RUNTIME_CLASS(CRightView);
    		VERIFY(m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CRightView), CSize(0, rc.Height()), &cc));
    		
    		m_wndSplitter.MoveWindow(0, 0, rc.Width(), rc.Height());
    		
    		m_bSplitter = TRUE;
    	}
    }
    


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    • 已标记为答案 amadok 2011年7月19日 2:50
    2011年7月17日 15:17
    版主

全部回复

  • 可以不需要创建一个新类,您可以直接添加菜单项的WM_COMMAND命令消息到您的View类中,在View类中来动态拆分视图框架窗口,类似这样:

    CSplitterWnd m_wndSplitter;
    BOOL m_bSplitter; // 在View类的构造函数中初始化为FALSE
    
    void CXXXView::OnSplitterwnd() 
    {
    	// TODO: Add your command handler code here
    	if(NULL == m_wndSplitter.GetSafeHwnd())
    	{
    		CCreateContext cc;
    		memset(&cc, 0, sizeof(CCreateContext));
    		
    		CRect rc;
    		GetWindowRect(&rc);
    		
    		VERIFY(m_wndSplitter.CreateStatic(this, 1, 2, WS_CHILD | WS_VISIBLE));
    		
    		cc.m_pNewViewClass = RUNTIME_CLASS(CLeftView);
    		VERIFY(m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CLeftView), CSize(300, rc.Height()), &cc));
    		
    		cc.m_pNewViewClass = RUNTIME_CLASS(CRightView);
    		VERIFY(m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CRightView), CSize(0, rc.Height()), &cc));
    		
    		m_wndSplitter.MoveWindow(0, 0, rc.Width(), rc.Height());
    		
    		m_bSplitter = TRUE;
    	}
    }
    


    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.
    • 已标记为答案 amadok 2011年7月19日 2:50
    2011年7月17日 15:17
    版主
  • 谢谢大哥,你的回答我已经标记为答案,非常正确。

    最后一个MoveWindow()方法是关键。呵呵。

     

    2011年7月19日 2:51
  • 大哥,再次请教,按照你说的我分割好了。

    我遇到另外一个问题:

    我想再分割好后,可以恢复到以前的状态,相当于取消分割。我尝试重新分割,可是出现执行错误。请教如何实现?

    谢谢!

    2011年7月22日 12:45