1.Create方法和CreateStatic方法之间的区别
Create动态拆分:
动态拆分是对同一个视图进行分隔,各个分隔窗口内容相同,但各自独立控制视野范围,可以显示同一文档的不同部分,允许分隔的窗口内有一个分隔条,可用鼠标拖拽分隔条调整各窗口大小和数目,但不超过 2行×2列。
CreateStatic静态拆分:
静态拆分的窗口个数一开始就是固定的,各窗口可以显示不同的视图对象,每个窗口的活动完全独立,有属于自己的水平 滚动条和垂直滚动条,分隔条可以移动但不能消失,静态拆分的窗口个数上限是 16行×16列。
2.隐藏某视图
CSplitterWnd可以很方便地创建分割器窗口。要隐藏分割器窗口中的某个视图,只需调用GetPane函数得到视图指针,然后调用ShowWindow函数隐藏窗口。但是这样做只隐藏了视图窗口,没有隐藏分割条;当程序框架尺寸变化后,程序会自动调用RecalcLayout函数,从而使得显示效果不正常。CSplitterWnd没有提供设置分割条尺寸的public函数,通过分析CSplitterWnd的源码得知,它里面有几个没有公开的受保护的成员变量:
m_cxSplitter, m_cySplitter, m_cxBorderShare, m_cyBorderShare, m_cxSplitterGap, m_cySplitterGap, m_cxBorlder, m_cyBorlder
通过重新构造m_cxSplitterGap,m_cySplitterGap变量的值,就可以实现改变分割条尺寸的功能。
解决方案:
1.从CSplitterWnd派生一个新类CMySplitterWnd;
2.在.h文件中添加成员变量和函数如下:
int m_cx;
int m_cy;
void HideSplitter();
void ShowSplitter();
3.在.cpp文件中添加实现代码如下:
void CMySplitterWnd::HideSplitter()
{
m_cx=m_cxSplitterGap;//save previous cx
m_cy=m_cxSplitterGap;//save previous cy
m_cxSplitterGap=0;
m_cySplitterGap=0;
}
void CMySplitterWnd::ShowSplitter()
{
m_cxSplitterGap=m_cx;
m_cySplitterGap=m_cy;
}
4.使用新类CMySplitterWnd生成分割器窗口,在需要的时候调用HideSplitter、ShowSplitter函数即可。
解决方案2:
//保存分割条的位置
m_wndSplitter1.GetColumnInfo(0,scx,smcx);
//设置分割条在最左边
m_wndSplitter1.SetColumnInfo(0,0,0);
LeftView->ShowWindow(SW_HIDE);
RightView->ShowWindow(SW_MAXIMIZE);
m_wndSplitter1.HideSplitter();
m_wndSplitter1.RecalcLayout();
3.
virtual BOOL CreateStatic( CWnd* pParentWnd, int nRows, int nCols, DWORD dwStyle = WS_CHILD | WS_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST );
virtual BOOL CreateStatic( CWnd* pParentWnd, int nRows, int nCols, DWORD dwStyle = WS_CHILD | WS_VISIBLE, UINT nID = AFX_IDW_PANE_FIRST );
virtual BOOL CreateView( int row, int col, CRuntimeClass* pViewClass, SIZE sizeInit, CCreateContext* pContext );
AFX_IDW_PANE_FIRST 是默认nID,用于一层分割时。多层分割需要父窗口调用int IdFromRowCol( int row, int col ) const;函数得到row行col列的窗口id号。