單文檔多視圖(分割窗口)

單文檔多視圖

本節演示瞭如何在一個框架中顯示兩個視圖。

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);

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章