本文記錄如何在MFC多文件中分割窗口并實現(xiàn)窗口之間的數(shù)據(jù)傳遞
1、在ChildFrame中定義一個分割嵌入一個CSplitterWnd成員變量。
CSplitterWnd m_splitterWnd;
2、創(chuàng)建兩個對話框,設(shè)置對話框的屬性:將‘樣式’設(shè)置為‘下層’;禁止使用標題欄;邊框選擇‘調(diào)整大小’;其他格式暫時都不設(shè)置;
?文章來源地址http://www.zghlxwxcb.cn/news/detail-461145.html
?
?
?
?
?為對話框添加類,類名CLeftView和CRightView;父類選擇為CFormView;
我們希望左邊的對話框輸入兩個加數(shù),通過點擊按鈕將兩個加數(shù)傳遞給文本,文本計算兩個加數(shù)的和并傳遞給右邊的對話框,并將結(jié)果輸出在右邊的編輯框中。之后點擊右邊對話框中的按鈕又可以將值傳遞給左邊的對話框,并將傳遞的數(shù)據(jù)顯示在左邊的編輯框中,因此為圖中各個編輯框添加CString類型的值變量,并設(shè)置各個控件ID。右邊編輯框的ID為IDC_EDIT_RESULT,左邊編輯框從上到下的ID分別為IDC_EDIT_NUM1、IDC_EDIT_NUM2、IDC_EDIT_SUM。
在CLeftView中添加如下變量
public:
// 第一個加數(shù)
CString num1;
// 第二個加數(shù)
CString num2;
// 兩個加數(shù)的和
CString sum;
在CRightView中添加如下變量
public:
// 兩個加數(shù)的結(jié)果
CString result;
由于通過文本進行交互,故需要在文本CSplitDoc中添加如下變量
public:
CString m_num1;
CString m_num2;
CString m_sum;
CString m_result;
3、接下來開始分割窗口,由于是多文檔結(jié)構(gòu),故在子框架中進行分割,在ChildFrame中重寫OnCreateClient函數(shù)。
BOOL CChildFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// TODO: 在此添加專用代碼和/或調(diào)用基類
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);
}
此時運行應(yīng)該可以得到如圖所示的結(jié)果:
4、接下來考慮數(shù)據(jù)交互的問題
我們希望點擊左邊對話框的Button1可以實現(xiàn)將加數(shù)1和加數(shù)2的值傳遞給文本,則給Button1添加事件處理程序。并在處理程序中定義一個文檔類的指針,通過指針將值傳遞給文檔。
void CLeftView::OnBnClickedButton1()
{
// TODO: 在此添加控件通知處理程序代碼
UpdateData();
CSplitDoc* pDoc = (CSplitDoc*)GetDocument();
pDoc->m_num1 = num1;
pDoc->m_num2 = num2;
pDoc->UpdateAllViews(NULL);
}
?那么對于數(shù)據(jù)接收呢,要在右邊的對話框中接收,則在CRightView中重寫ondraw函數(shù)
void CRightView::OnDraw(CDC* pDC)
{
// TODO: 在此添加專用代碼和/或調(diào)用基類
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);
}
?同樣的,在右邊對話框要向左邊對話框傳遞數(shù)據(jù)也是一樣的,具體代碼如下:
void CRightView::OnBnClickedButton1()
{
// TODO: 在此添加控件通知處理程序代碼
UpdateData();
CSplitDoc* pDoc = (CSplitDoc*)GetDocument();
pDoc->m_result = result;
pDoc->UpdateAllViews(NULL);
}
void CLeftView::OnDraw(CDC* /*pDC*/)
{
// TODO: 在此添加專用代碼和/或調(diào)用基類
CSplitDoc* pDoc = (CSplitDoc*)GetDocument();
ASSERT_VALID(pDoc);
SetDlgItemText(IDC_EDIT_SUM, pDoc->m_result);
}
至此,基本上完成了兩個分割視圖的數(shù)據(jù)交互。這里我認為接收的代碼不一定要重寫ondraw函數(shù),不過還是在嘗試階段,先在ondraw中接收吧。下面是程序運行的結(jié)果:
?
?文章來源:http://www.zghlxwxcb.cn/news/detail-461145.html
?
到了這里,關(guān)于MFC多文檔如何分割窗口的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!