扩展CSplitterWnd——实现隐藏分割条的功能

来源:互联网 发布:淘宝定制产品能退货吗 编辑:程序博客网 时间:2024/05/09 17:53

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号。

原创粉丝点击