本文记录如何在MFC多文件中分割窗口并实现窗口之间的数据传递
1、在ChildFrame中定义一个分割嵌入一个CSplitterWnd成员变量。
CSplitterWnd m_splitterWnd;
2、创建两个对话框,设置对话框的属性:将‘样式’设置为‘下层’;禁止使用标题栏;边框选择‘调整大小’;其他格式暂时都不设置;
文章来源地址https://www.toymoban.com/news/detail-461145.html
为对话框添加类,类名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中接收吧。下面是程序运行的结果:
文章来源:https://www.toymoban.com/news/detail-461145.html
到了这里,关于MFC多文档如何分割窗口的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!