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更新显示。这样才能即使的显示拆分。
标签:10,MFC,窗口,函数,wndSplitter,拆分,rect From: https://www.cnblogs.com/Super-biscuits/p/18086061