MFC多文档如何分割窗口

本文记录如何在MFC多文件中分割窗口并实现窗口之间的数据传递

1、在ChildFrame中定义一个分割嵌入一个CSplitterWnd成员变量。

CSplitterWnd m_splitterWnd;

2、创建两个对话框,设置对话框的属性:将‘样式’设置为‘下层’;禁止使用标题栏;边框选择‘调整大小’;其他格式暂时都不设置;

 

 

 

 

 

 为对话框添加类,类名CLeftView和CRightView;父类选择为CFormView;

我们希望左边的对话框输入两个加数,通过点击按钮将两个加数传递给文本,文本计算两个加数的和并传递给右边的对话框,并将结果输出在右边的编辑框中。之后点击右边对话框中的按钮又可以将值传递给左边的对话框,并将传递的数据显示在左边的编辑框中,因此为图中各个编辑框添加CString类型的值变量,并设置各个控件ID。右边编辑框的ID为IDC_EDIT_RESULT,左边编辑框从上到下的ID分别为IDC_EDIT_NUM1、IDC_EDIT_NUM2、IDC_EDIT_SUM。

在CLeftView中添加如下变量

public:
	// 第一个加数
	CString num1;
	// 第二个加数
	CString num2;
	// 两个加数的和
	CString sum;

在CRightView中添加如下变量

public:
	// 两个加数的结果
	CString result;

由于通过文本进行交互,故需要在文本CSplitDoc中添加如下变量

public:
	CString m_num1;
	CString m_num2;
	CString m_sum;
	CString m_result;

3、接下来开始分割窗口,由于是多文档结构,故在子框架中进行分割,在ChildFrame中重写OnCreateClient函数。

BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
	// TODO: 在此添加专用代码和/或调用基类
	CRect rect;
	GetClientRect(&rect);
	m_splitterWnd.CreateStatic(this, 1, 2);//一行两列
	m_splitterWnd.CreateView(0, 0, RUNTIME_CLASS(CLeftView), CSize(rect.Width() / 4, rect.Height()), pContext);//第一行第一列中放入第一个对话框
	m_splitterWnd.CreateView(0, 1, RUNTIME_CLASS(CRightView), CSize(rect.Width() - rect.Width() / 5, rect.Height()), pContext);//第一行第二列中放入第二个对话框
	return TRUE;

	//return CMDIChildWnd::OnCreateClient(lpcs, pContext);
}

此时运行应该可以得到如图所示的结果:

4、接下来考虑数据交互的问题

我们希望点击左边对话框的Button1可以实现将加数1和加数2的值传递给文本,则给Button1添加事件处理程序。并在处理程序中定义一个文档类的指针,通过指针将值传递给文档。

void CLeftView::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData();
	CSplitDoc* pDoc = (CSplitDoc*)GetDocument();
	pDoc->m_num1 = num1;
	pDoc->m_num2 = num2;
	pDoc->UpdateAllViews(NULL);
}

 那么对于数据接收呢,要在右边的对话框中接收,则在CRightView中重写ondraw函数

void CRightView::OnDraw(CDC* pDC)
{
	// TODO: 在此添加专用代码和/或调用基类
	CSplitDoc* pDoc = (CSplitDoc*)GetDocument();
	ASSERT_VALID(pDoc);
	pDoc->m_sum = pDoc->m_num1 + pDoc->m_num2;
	//pDC->TextOutW(500, 200, pDoc->m_sum);
	SetDlgItemText(IDC_EDIT_RESULT, pDoc->m_sum);
}

 同样的,在右边对话框要向左边对话框传递数据也是一样的,具体代码如下:

void CRightView::OnBnClickedButton1()
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData();
	CSplitDoc* pDoc = (CSplitDoc*)GetDocument();
	pDoc->m_result = result;
	pDoc->UpdateAllViews(NULL);
}
void CLeftView::OnDraw(CDC* /*pDC*/)
{
	// TODO: 在此添加专用代码和/或调用基类
	CSplitDoc* pDoc = (CSplitDoc*)GetDocument();
	ASSERT_VALID(pDoc);
	SetDlgItemText(IDC_EDIT_SUM, pDoc->m_result);
}

至此,基本上完成了两个分割视图的数据交互。这里我认为接收的代码不一定要重写ondraw函数,不过还是在尝试阶段,先在ondraw中接收吧。下面是程序运行的结果:

 

 

 

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值