由CSplitterWnd撰写的日志
[原创]CSplitterWnd中如何固定大小
五 20th
我想创建一个拆分窗口,纵向三列,然后在改变窗口大小时,左边和中间列的宽度,与窗口大小变化而变化,最右边的窗口,始终保持160的宽度。
首先在CMainFrame的头文件里新建CSplitterWnd m_mainSplitter;
有了这个,就可以CMainFrame::OnCreateClient里面创建拆分窗口了,由于后面要用到CMainFrame::GetSafeHwnd,所以在建立拆分窗口时,完全可以忽略窗口宽度,全部交由CMainFrame::OnSize来控制宽度;
建立拆分窗口范例:
m_mainSplitter.CreateView( 0, 0, RUNTIME_CLASS(CLeftView), CSize(0,0), pContext )
第一个参数是行,第二个参数是列,第三个参数是用与显示的类,继承于CView,第四个是拆分窗口的大小,如果后面不打算拦截WM_SIZE消息,那么就的在这里设一点值,我这里使用 CSize(0,0)是由于后面用来OnSize,所以这里可以忽略;
在写OnSize前,需要先有一个变量来判断视图是否被创建,所以在CMainFrame的头文件里新建一个变量BOOL m_isViewCreated,并且在构造函数里初始化为FALSE,然后在OnCreateClient中,如果拆分窗口建立完毕,则赋予m_isViewCreated为TRUE,有了这个判断,我们就可以开始写OnSize了:
if(m_mainSplitter.GetSafeHwnd()!=NULL && m_IsViewCreated)
{
//MessageBox(“进来了!”);
m_mainSplitter.GetSafeHwnd(0,rect.Height(),0);
m_mainSplitter.GetSafeHwnd(0,rect.Width()/2-80,10);
m_mainSplitter.SetColumnInfo(1,rect.Width()/2-80,10);
m_mainSplitter.SetColumnInfo(2,160,10);
m_mainSplitter.GetSafeHwnd();
}