一个一列两行的splitter window,
改变splitter windows的大小后,
默认只有其中一个pane的大小会发生改变.
我想做到两个pane的大小都改变,
不知道怎么做.
注:
因为用户可以随意调整两个pane的大小,
所以在CMainFrame::OnSize中使用SetRowInfo()达不到目的,
因为你不知道此时每个pane所占高度的比例.

解决方案 »

  1.   

    静态拆分窗口中也可以,你需要重写你的CSplitterWnd的onmousemove事件。
    if(point.x<100||point.x>195) 

    CWnd::OnMouseMove(nFlags, point); 

    else 

    CSplitterWnd::OnMouseMove(nFlags, point); 

    if(point.y<500||point.y>545)           //让视图在这个范围内可以改变大小

    CWnd::OnMouseMove(nFlags, point); 

    else 

    CSplitterWnd::OnMouseMove(nFlags, point); 
    }
      

  2.   

    ls,我并不想限制用户改变splitter window中pane的大小,
    我所想的是splitter window resize后所有的pane也按同样的比例变化.
    因为默认的情况下只有一个pane的高度会变化,而其余保持不变.
      

  3.   

    还是重写你的CSplitterWnd的onmousemove事件。 
    不加判断语句
    将返回值改成CWnd::OnMouseMove(nFlags, point); 试一下
      

  4.   

    还是我自己把它搞定了.
    代码如下:// In header file
    class CMySplitterWnd : public CSplitterWnd 
    {
    // Generated message map functions
    protected:
    //{{AFX_MSG(CMySplitterWnd)
    afx_msg void OnSize(UINT nType, int cx, int cy);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };// In cpp// Generic routine:
    //  for X direction: pInfo = m_pColInfo, nMax = m_nMaxCols, nSize = cx
    //  for Y direction: pInfo = m_pRowInfo, nMax = m_nMaxRows, nSize = cy
    AFX_STATIC void AFXAPI MyAfxLayoutRowCol(CSplitterWnd::CRowColInfo* pInfoArray,
    int nMax, int nSize, int nSizeSplitter)
    {
    ASSERT(pInfoArray != NULL);
    ASSERT(nMax > 0);
    ASSERT(nSizeSplitter > 0); CSplitterWnd::CRowColInfo* pInfo;
    int i; if (nSize < 0)
    nSize = 0;  // if really too small, layout as zero size // start with ideal sizes
    int iSizeSum = 0;
    for (i = 0, pInfo = pInfoArray; i < nMax; i++, pInfo++)
    {
    iSizeSum += pInfo->nIdealSize;
    }
    int iSizeLeft = nSize - iSizeSum; if (iSizeLeft != 0)
    {
    int iSizeAdded = iSizeLeft / nMax;
    for (i = 0, pInfo = pInfoArray; i < nMax; i++, pInfo++)
    {
    pInfo->nIdealSize += iSizeAdded;
    }
    }
    }void C_OIDSplitterWnd::OnSize(UINT nType, int cx, int cy)
    {
    if (nType != SIZE_MINIMIZED && cx > 0 && cy > 0)
    {
    CRect rectClient;
    GetClientRect(rectClient);
    rectClient.InflateRect(-m_cxBorder, -m_cyBorder);

    CRect rectInside;
    GetInsideRect(rectInside);

    // layout columns (restrict to possible sizes)
    MyAfxLayoutRowCol(m_pColInfo, m_nCols, rectInside.Width(), m_cxSplitterGap);
    MyAfxLayoutRowCol(m_pRowInfo, m_nRows, rectInside.Height(), m_cySplitterGap);
    CSplitterWnd::OnSize(nType, cx, cy);
    }
    }
      

  5.   

    注:
    上面cpp代码中的void C_OIDSplitterWnd::OnSize(UINT nType, int cx, int cy)应为void CMySplitterWnd::OnSize(UINT nType, int cx, int cy)