您的位置:首页 > 其它

MFC基于单文档分割窗口

2017-06-06 09:35 323 查看
创建一个MFC单文档应用程序命名为test

打开资源管理器Dialog,右击鼠标,插入两个对话框选择基于CFormView类

属性style改为child,broad改为none

在对话框中插入类,分别命名为cDialogData,cDialogA.

打开类视图,右击CMainFrm类,选择属性,重写OnCreateClient函数。

在MainFrm.h中加入CSplit
a150
terWnd m_wndSplitter;

    CSplitterWnd m_wndSplitter2;的定义

在MainFrm.cpp中加入头文件DialogData.h和DialogA.h

在OnCreateClient函数中添加以下代码

// 创建静态分割窗口,一行两列
if(!m_wndSplitter.CreateStatic(this, 1, 2))
return FALSE;

//再把左边窗口分为两行一列
if(m_wndSplitter2.CreateStatic(&m_wndSplitter,2,1,WS_VISIBLE|WS_CHILD,
m_wndSplitter.IdFromRowCol(0, 0))==NULL)
return FALSE; //将第0行0列再分开2行1列

// 创建右面窗格中的视图
if(!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(CDialogA),CSize(200,1000), pContext))
return FALSE;

// 创建左上面窗格中的视图
if(!m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(CyyyView),CSize(800, 800), pContext))
return FALSE;

// 创建左下面窗格中的视图
if(!m_wndSplitter2.CreateView(1, 0, RUNTIME_CLASS(cDialogData),CSize(800, 200), pContext))
return FALSE;

/* if(!m_wndSplitter.CreateView(1, 1, RUNTIME_CLASS(CDialogA),CSize(200, 800), pContext))
return FALSE;*/
CRect r;
GetClientRect(&r);
m_wndSplitter.SetColumnInfo( 0, r.Width()/3, 0 );
//m_wndSplitter.SetColumnInfo( 0, r.Width()/3, 1 );
m_wndSplitter.RecalcLayout();
m_wndSplitter2.SetRowInfo(0,r.Height()/2,0);
m_wndSplitter2.SetRowInfo(1,r.Height()/2,0);
m_wndSplitter2.RecalcLayout();




就分好了,但是为什么不加入

CRect r;
GetClientRect(&r);
m_wndSplitter.SetColumnInfo( 0, r.Width()/3, 0 );
//m_wndSplitter.SetColumnInfo( 0, r.Width()/3, 1 );
m_wndSplitter.RecalcLayout();
m_wndSplitter2.SetRowInfo(0,r.Height()/2,0);
m_wndSplitter2.SetRowInfo(1,r.Height()/2,0);
m_wndSplitter2.RecalcLayout();


这些设置窗口大小的函数时总是报错,而且运行不出来view区域。
这样运行出来的效果如

图所示。

如果想要设置每个窗口的大小随意变动,则要BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 在此添加专用代码和/或调用基类
//CRect rc;
//// 获取框架窗口客户区的CRect 对象
//GetClientRect(&rc);

// 创建静态分割窗口,一行两列
if(!m_wndSplitter.CreateStatic(this, 1, 2))
return FALSE;
//窗口的再分割
if(m_wndSplitter2.CreateStatic(&m_wndSplitter,2,1,WS_VISIBLE|WS_CHILD,
m_wndSplitter.IdFromRowCol(0, 0))==NULL)
return FALSE; //将第0行0列再分开2行1列
if(m_wndSplitter3.CreateStatic(&m_wndSplitter,2,1,WS_VISIBLE|WS_CHILD,
m_wndSplitter.IdFromRowCol(0, 1))==NULL)
return FALSE; //将第0行0列再分开2行1列

// 创建右下面窗格中的视图
if(!m_wndSplitter3.CreateView(1, 0, RUNTIME_CLASS(CDialogStatus),CSize(200,200), pContext))
return FALSE;

// 创建右上面窗格中的视图
if(!m_wndSplitter3.CreateView(0, 0, RUNTIME_CLASS(CyyyView),CSize(800, 800), pContext))
return FALSE;

// 创建左下面窗格中的视图
if(!m_wndSplitter2.CreateView(0, 0, RUNTIME_CLASS(cDialogData),CSize(800, 200), pContext))
return FALSE;

if(!m_wndSplitter2.CreateView(1,0, RUNTIME_CLASS(CDialogA),CSize(200, 800), pContext))
return FALSE;

//CRect r;
//GetClientRect(&r);
m_wndSplitter.SetColumnInfo(0,800, 100);
m_wndSplitter2.SetRowInfo(0, 400, 100);
m_wndSplitter3.SetRowInfo(0, 200, 100);
m_wndSplitter.RecalcLayout();
m_wndSplitter2.RecalcLayout();
m_wndSplitter3.RecalcLayout();

return TRUE;
}
运行出来就如第二张图所示了。



设置的思路图在最后一张图上。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: