MFC 动态拆分窗口与静态拆分窗口

MFC 动态拆分窗口,使用MFC自带的CSplitterWnd类进行操作。

其步骤就是:

1、在框架类添加此类型的成员函数。

2、覆盖OnCreateClent函数。

3、调用create函数。

BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
    // TODO: 在此添加专用代码和/或调用基类
    

    n = m_wndSplitter.Create(this, 2, 2, CSize(10, 10), pContext, WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | SPLS_DYNAMIC_SPLIT);
    
    
    return TRUE;//CMDIChildWnd::OnCreateClient(lpcs, pContext);
}

后面的样式可以不用输入,他有一个默认值。

具体效果,运行后便可以看到

在左下角和右上角有拆分器的按钮,鼠标点击拖动,即可实现拆分。

默认创建是没有自动拆分的,需要手动拖动才能实现拆分。

 下面讲一下MFC运行原理:

OnCreateClient这个函数由OnCreate函数调用,当你覆盖之后,OnCreate函数就会调用你覆盖的这个函数。

动态拆分窗口,是使用同一个view类来创建不同的窗口,所以在拆分以后,他是两个或者多个窗口,它使用的文档类,依然是只有一个。

动态拆分窗口,他最大支持2*2的窗口数量,多了就断言失败。

他这个拆分窗口是可以通过代码来调整的:

void CChildFrame::OnSize(UINT nType, int cx, int cy)
{
    CMDIChildWnd::OnSize(nType, cx, cy);

    // TODO: 在此处添加消息处理程序代码
    CRect rect;
    GetWindowRect(&rect);
    if (n) {
        m_wndSplitter.SetRowInfo(0, rect.Height() / 2, 10);
        m_wndSplitter.SetRowInfo(1, rect.Height() / 2, 10);
        m_wndSplitter.SetColumnInfo(0, rect.Width() / 2, 10);
        m_wndSplitter.SetColumnInfo(1, rect.Width() / 2, 10);
        m_wndSplitter.RecalcLayout();
    }
    
}

这个函数表示当框架窗口改变尺寸时,要做的处理,首先获取窗口的尺寸大小,n呢是一个BOOL变量,记录拆分窗口是否被正确创建,防止没有拆分的时候出现错误,

SetRowInfo函数表示设置的行,参数0表示第一行,第二个参数表示当前行有多高,最后一个是当等于或者小于当前数值时,拆分器销毁当前窗口。

SetColumnInfo函数表示的是列,第一列有多宽,最后一个参数和上面一样。

当设置行和列后,要调用RecalcLayout更新显示。这样才能即使的显示拆分。

静态拆分窗口:

同样的位置编写的代码不一样,

BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
    // TODO: 在此添加专用代码和/或调用基类
    

    n = m_wndSplitter.CreateStatic(this, 1, 2);
    m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CMFCMdiApplicationView), CSize(100, 100), pContext);
    m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(MyView), CSize(0, 0), pContext);
    return TRUE;//CMDIChildWnd::OnCreateClient(lpcs, pContext);
}

静态拆分,需要为每一个窗格创建视图,可以是不同的视图类。

静态拆分,完成之后,会自动显示已经拆分好的窗口。

 

posted @ 2024-03-20 20:48  饼干`  阅读(43)  评论(0编辑  收藏  举报