我的分隔条分出左边两个视,右边一个视.原想把左右两边各占一半,但实际的效果是右边占了整个用户区.代码如下:
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
RECT cliRect;
GetClientRect(&cliRect);
m_wndSplitterH.CreateStatic(this,1,2);
SIZE size; m_wndSplitterV.CreateStatic(&m_wndSplitterH,2,1,WS_CHILD|WS_VISIBLE,
m_wndSplitterH.IdFromRowCol(0,0)); size.cx=cliRect.right/2;size.cy=cliRect.bottom/3;
m_wndSplitterV.CreateView(0,0,RUNTIME_CLASS(CSndView),size,pContext);
m_pwndSndView=(CSndView*)m_wndSplitterV.GetPane(0,0); size.cx=cliRect.right/2;size.cy=0;
m_wndSplitterV.CreateView(1,0,RUNTIME_CLASS(CSndView),size,pContext);
m_pwndRcvView=(CSndView*)m_wndSplitterV.GetPane(1,0);
m_pwndRcvView->GetEditCtrl().SetReadOnly(); size.cx=cliRect.right/2;size.cy=0;
m_wndSplitterH.CreateView(0,1,RUNTIME_CLASS(CResultView),size,pContext);
m_pwndResultView=(CResultView*)m_wndSplitterH.GetPane(0,1); return CFrameWnd::OnCreateClient(lpcs, pContext);
}
不知该如何纠正.
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
RECT cliRect;
GetClientRect(&cliRect);
m_wndSplitterH.CreateStatic(this,1,2);
SIZE size; m_wndSplitterV.CreateStatic(&m_wndSplitterH,2,1,WS_CHILD|WS_VISIBLE,
m_wndSplitterH.IdFromRowCol(0,0)); size.cx=cliRect.right/2;size.cy=cliRect.bottom/3;
m_wndSplitterV.CreateView(0,0,RUNTIME_CLASS(CSndView),size,pContext);
m_pwndSndView=(CSndView*)m_wndSplitterV.GetPane(0,0); size.cx=cliRect.right/2;size.cy=0;
m_wndSplitterV.CreateView(1,0,RUNTIME_CLASS(CSndView),size,pContext);
m_pwndRcvView=(CSndView*)m_wndSplitterV.GetPane(1,0);
m_pwndRcvView->GetEditCtrl().SetReadOnly(); size.cx=cliRect.right/2;size.cy=0;
m_wndSplitterH.CreateView(0,1,RUNTIME_CLASS(CResultView),size,pContext);
m_pwndResultView=(CResultView*)m_wndSplitterH.GetPane(0,1); return CFrameWnd::OnCreateClient(lpcs, pContext);
}
不知该如何纠正.
CSplitterWnd的构造函数主要包括下面三个。
BOOL Create(CWnd* pParentWnd,int nMaxRows,int nMaxCols,SIZE sizeMin,CCreateContext* pContext,DWORD dwStyle,UINT nID);
功能描述:该函数用来创建动态切分窗口。
参数含义:pParentWnd 切分窗口的父框架窗口。
nMaxRows,nMaxCols是创建的最大的列数和行数。
sizeMin是窗格的现实大小。
pContext 大多数情况下传给父窗口。
nID是字窗口的ID号.
BOOL CreateStatic(CWnd* pParentWnd,int nRows,int nCols,DWORD dwStyle,UINT nID)
功能描述:用来创建切分窗口。
参数含义同上。
BOOL CreateView (int row,int col,CruntimeClass* pViewClass,SIZE sizeinit,CcreateContext* pContext);
功能描述:为静态切分的窗口的网格填充视图。在将视图于切分窗口联系在一起的时候必 须先将切分窗口创建好。
参数含义:同上。
从CSplitterWnd源程序可以看出不管是使用动态创建Create还是使用静态创建CreateStatic,在函数中都调用了一个保护函数CreateCommon,从下面的CreateCommon函数中的关键代码可以看出创建CSplitterWnd的实质是创建了一系列的MDI子窗口。
DWORD dwCreateStyle = dwStyle & ~(WS_HSCROLL|WS_VSCROLL);
if (afxData.bWin4)
dwCreateStyle &= ~WS_BORDER; // create with the same wnd-class as MDI-Frame (no erase bkgnd)
if (!CreateEx(0, _afxWndMDIFrame, NULL, dwCreateStyle, 0, 0, 0, 0,pParentWnd->m_hWnd, (HMENU)nID, NULL))
return FALSE; // create invisible
右边的view的那个size的内容是不起作用的,因为一个splitter中最后一块的大小,就是分剩的
所以你得在后面加SetColumnInfo(0,cliRect.right/2,0);
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
BOOL ret=m_wndSplitter1.CreateStatic(this,1,2);
ret|=m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CControlView),
CSize(210,100),pContext);
ret|=m_wndSplitter2.CreateStatic(&m_wndSplitter1, 2, 1,
WS_CHILD | WS_VISIBLE ,m_wndSplitter1.IdFromRowCol(0, 1));
ret|=m_wndSplitter2.CreateView(1,0,RUNTIME_CLASS(CDYNView),
CSize(100,100),pContext);
ret|=m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(CBmpView),
CSize(610,350),pContext);
return ret;
}