本節演示瞭如何在一個框架中顯示兩個視圖。
1.實例說明
在MFC中,視圖必須存在於框架之中,而單文檔只有一個框架,所以一次只能顯示一個視圖,如果想顯示新視圖必須關閉當前視圖。如果想同時顯示兩個視圖可以用分割窗口。
本示例用於查詢學生信息,數據存在文檔類中,用戶可以在第一個視圖中輸入學號,單擊“查找”按鈕查找學生消息,結果會顯示在第二個視圖中,效果如圖1-53所示。
圖1-53 Ex010205.exe效果圖
2.實現
具體步驟如下:
(1)創建一個單文檔的工程Ex010205,在應用程序嚮導的第6步中將視圖類的基類改成CFormView,其他使用默認。
(2)增加一個新類COutPutView派生於CScrollView。
(3)在CMainFrame中增加一個保護級的成員變量CSplitterWnd m_wndSplitter 。
(4)利用類嚮導重載CMainFrame類的虛函數OnCreateClient。
BOOL CMainFrame::OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext)
{
// 創建拆分器窗口
if (!m_wndSplitter.CreateStatic(this, 1, 2))
return FALSE;
if (!m_wndSplitter.CreateView(0, 0, RUNTIME_CLASS(CEx010205View), CSize(500, 100), pContext) ||
!m_wndSplitter.CreateView(0, 1, RUNTIME_CLASS(COutPutView), CSize(100, 100), pContext))
{
m_wndSplitter.DestroyWindow();
return FALSE;
}
return TRUE;
}
在MainFrm.cpp包含2個文件,加上後就包含了5個文件。
#include "stdafx.h"
#include "Ex010205.h"
#include "MainFrm.h"
#include "OutPutView.h"
#include "Ex010205View.h"
在Ex010205View.h中包含Ex010205Doc.h。
(5)在Ex010205Doc.h中增加新類:
class CStudent
{
public :
int m_iStuNo ;//學號;
int m_iScore ;//分數;
};
在Ex010205Doc.h中包含Afxtempl.h,爲CEx010205Doc增加兩個成員。
protected:
CArray<CStudent,CStudent&> m_arStus ;//記錄所有的學生信息
public:
CStudent i_CurStu ;//記錄當前信息
在文檔類的構造函數中,對這些變量進行初始化。
CEx010205Doc::CEx010205Doc()
{
CStudent stu ;
stu.m_iStuNo = 1000 ;
stu.m_iScore = 99 ;
m_arStus.Add(stu);
stu.m_iStuNo = 1001 ;
stu.m_iScore = 59 ;
m_arStus.Add(stu);
stu.m_iStuNo = 1002 ;
stu.m_iScore = 79 ;
m_arStus.Add(stu);
i_CurStu = m_arStus[0] ;
}
(6)在OutPutView。h中包含Ex010205Doc.h,修改COutPutView::OnDraw函數。
void COutPutView::OnDraw(CDC* pDC)
{
CEx010205Doc* pDoc = (CEx010205Doc*) GetDocument();
CString str ;
str.Format("學號 = %d 成績 = %d ",pDoc->i_CurStu.m_iStuNo,pDoc->i_CurStu.m_iScore);
pDC->TextOut(0,100,str);
}
(7)爲CEx010205Doc增加一個公有成員函數SetCurStu(int iStuNo)。
bool CEx010205Doc::SetCurStu(int iStuNo)
{
for(int i = m_arStus.GetSize() - 1 ; i >= 0 ; i-- )
if( iStuNo == m_arStus[i].m_iStuNo )
{
i_CurStu = m_arStus[i] ;
break ;
}
return (i >= 0 ) ;//i >=0 表示已經找到,否則表示沒有找到
}
(8)在對話框IDD_EX010205_FORM上加1個編輯控件和1個按鈕。編輯控件的ID爲IDC_STUNO,按鈕的控件的ID爲ID_FIND,標題爲“查找”。爲編輯控件關聯一個int型的變量m_iStuNo,爲按鈕增加響應函數,具體代碼如下:
void CEx010205View::OnFind()
{
CEx010205Doc* pDoc = GetDocument();
if(NULL == pDoc )
{
ASSERT(false);
return ;
}
UpdateData();
if(!pDoc->SetCurStu(m_iStuNo))
{
AfxMessageBox("沒有找到此學生");
return ;
}
pDoc->UpdateAllViews(NULL);
}
(9)按Ctrl+F5鍵創建並運行Ex010205.exe,在編輯框中輸入一個數(合法數據是1000~1002),單擊“查找”按鈕,右邊的視圖會顯示此學生的信息。
(10)爲了便於用戶查看不及格的學生,紅色顯示不及格的學生。修改後的代碼如下。
void COutPutView::OnDraw(CDC* pDC)
{
CEx010205Doc* pDoc = (CEx010205Doc*) GetDocument();
if(pDoc->i_CurStu.m_iScore < 60 )
pDC->SetTextColor(RGB(255,0,0));
CString str ;
str.Format("學號 = %d 成績 = %d ",pDoc->i_CurStu.m_iStuNo,pDoc->i_CurStu.m_iScore);
pDC->TextOut(0,100,str);
}