我在做一个程序的时候需要把一个窗口拆分成多个子窗口,比如:在一个窗口里面借助Splitter产生2个自窗体来显示2个不同的文本文档做比较。然后我想让这个程序执行比较功能操作以后在下部又产生一个子窗口来显示比较结果。用Splitter产生子窗口我会,可是怎么在程序运行的时候调整窗口我就不会了。怎么让窗口在建立的时候是2个子窗口,然后在执行某个操作的时候在产生第3个子窗口呢?
    我也查了一些书,都没有找到解决的方法。所以只好麻烦大家了,谢谢。

解决方案 »

  1.   

    BOOL CDLabelFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) 
    {
    // TODO: Add your specialized code here and/or call the base class
    if (!m_wndCDlabel.CreateStatic(this, 1, 2))
    {
    TRACE0("Failed to CreateStaticCDlabelUI\n");
    return FALSE;
    }

    // add the first CDlabelUI pane - the default view in column 0
    if (!m_wndCDlabel.CreateView(0, 0,
    pContext->m_pNewViewClass, CSize(630, 70), pContext))
    {
    TRACE0("Failed to create first pane\n");
    return FALSE;
    }

    // add the second CDlabelUI pane - an input view in column 1
    if (!m_wndCDlabel.CreateView(0, 1,
    RUNTIME_CLASS(CInputView), CSize(0, 0), pContext))
    {
    TRACE0("Failed to create second pane\n");
    return FALSE;
    }

    // activate the input view
    SetActiveView((CView*)m_wndCDlabel.GetPane(0,0));

    return TRUE;
    // return CMDIChildWnd::OnCreateClient(lpcs, pContext);
    }其中:CSplitterWnd m_wndCDlabel;
      

  2.   

    有visual stdio格式的例子
    你在网上找一下!可以随意显示/调整大小...
    我还有一个想法:
    先建一个2行1列的:
    if (!m_wndSplitter.CreateStatic(this, 2, 1))
    {
    TRACE0("Failed to create split bar ");
    return FALSE; // failed to create
    }
    再在第一列建1行2列的:
    if (!m_wndSplitter2.CreateStatic(this, 1, 2))
    {
    TRACE0("Failed to create split bar ");
    return FALSE; // failed to create
    }
    需要时调整下面一行的高度来显示!不用时高度为0.//不过这样有点难看,但是实现起来容易!
      

  3.   

    有个类可以使类CSplitterWnd 显示/隐藏 分割条
    class CSplitterWndEx : public CSplitterWnd  //头文件
    {
    public:
        BOOL PreCreateWindow(CREATESTRUCT& cs); 
    void OnMouseMove(UINT /*nFlags*/, CPoint pt);
    void StartTracking(int ht);
    void OnDrawSplitter(CDC* pDC, ESplitType nType,const CRect& rectArg);
    BOOL OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message);
    BOOL OnMouseWheel(UINT fFlags, short zDelta, CPoint point);
    CSplitterWndEx(BOOL Visible=TRUE);
    virtual ~CSplitterWndEx();
    DECLARE_DYNCREATE(CSplitterWndEx);
    DECLARE_MESSAGE_MAP()protected:
    BOOL m_Visible;
    };
    //实现文件...
    CSplitterWndEx::CSplitterWndEx(BOOL Visible/*=FALSE*/)
    {
        m_Visible = Visible;
    }CSplitterWndEx::~CSplitterWndEx()
    {}void CSplitterWndEx::OnDrawSplitter(CDC *pDC, ESplitType nType, const CRect &rectArg)
    {
    if (pDC == NULL)
    {
    RedrawWindow(rectArg, NULL, RDW_INVALIDATE|RDW_NOCHILDREN);
    return;
    }
        if(m_Visible)
        {
            CSplitterWnd::OnDrawSplitter(pDC,nType,rectArg);
            return;
        }
    ASSERT_VALID(pDC);
    CRect rect = rectArg;
    CPen WhitePen;
    WhitePen.CreatePen(PS_SOLID, PEN_WIDTH, GetSysColor(COLOR_WINDOW));
    pDC->SelectObject(&WhitePen);
    pDC->Rectangle(rect);
    }void CSplitterWndEx::StartTracking(int ht)
    {
        if(m_Visible)
            CSplitterWnd::StartTracking(ht);
    }void CSplitterWndEx::OnMouseMove(UINT nFlags, CPoint pt)
    {
        if(m_Visible)
            CSplitterWnd::OnMouseMove(nFlags,pt);
    }BOOL CSplitterWndEx::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
    {
        if(m_Visible)
            return CSplitterWnd::OnSetCursor(pWnd, nHitTest, message);
    return TRUE;
    }BOOL CSplitterWndEx::OnMouseWheel(UINT fFlags, short zDelta, CPoint point)
    {
        if(m_Visible)
            return CSplitterWnd::OnMouseWheel(fFlags, zDelta, point);
    return TRUE;
    }
    BOOL CSplitterWndEx::PreCreateWindow(CREATESTRUCT& cs) 
    {
        return CSplitterWnd::PreCreateWindow(cs);
    }
    用它结合上面说的方法 ---看起来就好看了!
    不过还是visual stdio格式的比较好!
      

  4.   

    Visual stdio格式的使用  CJLibrary控件开发出来就比较好。但CJLibrary必须下载。