一个一列两行的splitter window,
改变splitter windows的大小后,
默认只有其中一个pane的大小会发生改变.
我想做到两个pane的大小都改变,
不知道怎么做.
注:
因为用户可以随意调整两个pane的大小,
所以在CMainFrame::OnSize中使用SetRowInfo()达不到目的,
因为你不知道此时每个pane所占高度的比例.
改变splitter windows的大小后,
默认只有其中一个pane的大小会发生改变.
我想做到两个pane的大小都改变,
不知道怎么做.
注:
因为用户可以随意调整两个pane的大小,
所以在CMainFrame::OnSize中使用SetRowInfo()达不到目的,
因为你不知道此时每个pane所占高度的比例.
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);
}
我所想的是splitter window resize后所有的pane也按同样的比例变化.
因为默认的情况下只有一个pane的高度会变化,而其余保持不变.
不加判断语句
将返回值改成CWnd::OnMouseMove(nFlags, point); 试一下
代码如下:// 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);
}
}
上面cpp代码中的void C_OIDSplitterWnd::OnSize(UINT nType, int cx, int cy)应为void CMySplitterWnd::OnSize(UINT nType, int cx, int cy)