有关CSplitterWnd的几个函数能不能详细解释一下呢Create
CreateStatic
CreateView不要贴MSDN上的函数说明,我想听你们自己的理解我的疑问是:
我用 .creat(This,2,2,CSize(10, 10),pContext)能创建出横竖两条交叉的split,拉出来能把视图分成4块,但是初始化后它们默认都在最边上,我想让他们在正中间显示,不知道怎么处理我知道CreateStatic和CreateView可以让split在某个位置显示,但是不知道怎么用CreateStatic函数创建横竖两条split,头疼啊想要的效果是这样的:
-------------------------------
| | |
| | |
| | |
|--------------|--------------|
| | |
| | |
| | |
-------------------------------
CreateStatic
CreateView不要贴MSDN上的函数说明,我想听你们自己的理解我的疑问是:
我用 .creat(This,2,2,CSize(10, 10),pContext)能创建出横竖两条交叉的split,拉出来能把视图分成4块,但是初始化后它们默认都在最边上,我想让他们在正中间显示,不知道怎么处理我知道CreateStatic和CreateView可以让split在某个位置显示,但是不知道怎么用CreateStatic函数创建横竖两条split,头疼啊想要的效果是这样的:
-------------------------------
| | |
| | |
| | |
|--------------|--------------|
| | |
| | |
| | |
-------------------------------
m_wndSplitter.SetColumnInfo(0,第1列宽度,0);
m_wndSplitter.SetColumnInfo(1,第2列宽度,0);设置高度
m_wndSplitter.SetRowInfo(0,第1列高度,0);
m_wndSplitter.SetRowInfo(1,第2列高度,0);
——————————————————————————————
使用三个CSplitterWnd首先Create一个竖着的有两列的CSplitterWnd SpliVert然后再在SpliVert的两列中分别CreateStatic两个横着的有两行的 CSplitterWnd SpliHorz1、SpliHorz2然后SpliHorz1、SpliHorz2分别在各自自己的两行中创建4个View当然先创建横着的再创建两个竖着的亦可
m_wndSplitter.SetColumnInfo(0,第1列宽度,0);
m_wndSplitter.SetColumnInfo(1,第2列宽度,0);设置高度
m_wndSplitter.SetRowInfo(0,第1列高度,0);
m_wndSplitter.SetRowInfo(1,第2列高度,0);还要再具体点,我试过了,不行,而且一拖动就出错
——————————————————————————————
使用三个CSplitterWnd首先Create一个竖着的有两列的CSplitterWnd SpliVert然后再在SpliVert的两列中分别CreateStatic两个横着的有两行的 CSplitterWnd SpliHorz1、SpliHorz2然后SpliHorz1、SpliHorz2分别在各自自己的两行中创建4个View当然先创建横着的再创建两个竖着的亦可
____________________________________________________________________________________
这样不行,比如先竖再两横,那么横着的一条移动后就不再和另一边的在同一水平线了
如果LZ想达到穿越类似穿越效果的话,可以派生自己的CSplitterWnd,处理其拖动操作,当其中一个横着plitterWnd的拖动后,就SetColumnInfo让另一个横着的plitterWnd自己跟它对齐
return FALSE;
CRect rect;
GetClientRect(&rect);
m_wndSplitter.SetColumnInfo(0,rect.Width()/2,0);
m_wndSplitter.SetColumnInfo(1,rect.Width()/2,0); m_wndSplitter.SetRowInfo(0,rect.Height()/2,0);
m_wndSplitter.SetRowInfo(1,rect.Height()/2,0); return TRUE;运行出错,错在哪呢???
LS的方法只会得到下面的结果-------------------------------
| | | |
| | | |
| | | |
| |--------------|
| | | |
| | | |
| | | |
-------------------------------
如有误导,实在抱歉!
偶实在太菜了
使用一个CSplitterWnd即可!!!!!!!!!if(!m_wndSplitter.CreateStatic(this,2,2,WS_CHILD|WS_VISIBLE|WS_BORDER)) return FALSE;m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CView1),CSize(0,0),pContext);
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CView2),CSize(0,0),pContext);
m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(CView3),CSize(0,0),pContext);
m_wndSplitter.CreateView(1,1,RUNTIME_CLASS(CView4),CSize(0,0),pContext);
呵呵
RUNTIME_CLASS(CView1)
pContext->m_pNewViewClass
有什么区别呢
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class if(!m_wndSplitter.CreateStatic(this,2,2,WS_CHILD|WS_VISIBLE|WS_BORDER)) return FALSE; m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CView1),CSize(0,0),pContext);
m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CView2),CSize(0,0),pContext);
m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(CView3),CSize(0,0),pContext);
m_wndSplitter.CreateView(1,1,RUNTIME_CLASS(CView4),CSize(0,0),pContext); CRect rc;
GetClientRect(rc);
m_wndSplitter.SetColumnInfo(0,rc.Width()/2,0);
m_wndSplitter.SetColumnInfo(1,rc.Width()/2,0);
m_wndSplitter.SetRowInfo(0,rc.Height()/2,0);
m_wndSplitter.SetRowInfo(1,rc.Height()/2,0); return TRUE;
}在这里我为我之前的瞎扯误导抱歉! :(
现在我发现自己不是一般的菜! 汗!
RUNTIME_CLASS(CView1)
pContext->m_pNewViewClass
有什么区别呢
pContext->m_pNewViewClass应该只能表示SDI最开始的那个默认的View
现在要切分,所以就用RUNTIME_CLASS(CView1)了
我是这么实现的,和你不一样
if(!m_wndSplitter.CreateStatic(this,2,2,WS_CHILD|WS_VISIBLE|WS_BORDER)) return FALSE;
CRect rect;
GetClientRect(&rect);
m_wndSplitter.CreateView(0,0,pContext->m_pNewViewClass,CSize(rect.Width()/2,rect.Height()/2),pContext);
m_wndSplitter.CreateView(0,1,pContext->m_pNewViewClass,CSize(rect.Width()/2,rect.Height()/2),pContext);
m_wndSplitter.CreateView(1,0,pContext->m_pNewViewClass,CSize(rect.Width()/2,rect.Height()/2),pContext);
m_wndSplitter.CreateView(1,1,pContext->m_pNewViewClass,CSize(rect.Width()/2,rect.Height()/2),pContext);
return TRUE;我用的就是pContext->m_pNewViewClass啊
比如View1 就 pDC->TextOut(10,10,"View1");
View2 就 pDC->TextOut(10,10,"View2");如果你使用pContext->m_pNewViewClass,那么每个切分窗口中的View实际上是同一个View类的实例,也就是这四个View是从一个模子倒出来的,你会发现四个View上的文字都是一样的显然你切分窗口的目的不是搞画中画,每个View的的类应该不同(当然如果每个View中所做的事情都一样,用同一个View类创建四个实例是减轻代码量的好办法,但是需要让实例们可以区分)pContext->m_pNewViewClass只能表示SDI最开始的那个默认的View类,只有一个
RUNTIME_CLASS(CViewxxx)可以表示任何一个存在的View类,有N个
比如你可以在左上角放一个EditView,右上角放一个ScrollView,左下角放一个FormView,右下角放一个TreeView,RUNTIME_CLASS可以,而pContext->m_pNewViewClass好像做不到这一点