序列化的類和一檔多視_第1頁
序列化的類和一檔多視_第2頁
序列化的類和一檔多視_第3頁
序列化的類和一檔多視_第4頁
序列化的類和一檔多視_第5頁
已閱讀5頁,還剩31頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、序列化的類和一檔多視1什么是序列化 在面向?qū)ο蟪绦蛟O(shè)計(jì)領(lǐng)域中,對象可以被持續(xù),即當(dāng)程序退出時它們可以被存盤,而當(dāng)程序重啟動時它們又可被恢復(fù)。對象的這種存盤和恢復(fù)處理過程就稱為“序列化”。 在Microsoft基本類(MFC)庫中,一些特定的類包含有Serialize成員函數(shù),當(dāng)應(yīng)用程序框架調(diào)用了特定對象的Serialize函數(shù)時,例如,調(diào)用了CStudent類對象的Serialize函數(shù)時,關(guān)于學(xué)生的數(shù)據(jù)就可以被存盤,也可以從盤中讀出。2磁盤文件與歸檔( CArchive )3磁盤文件與歸檔( CArchive )在Serialize函數(shù)與CFile對象之間,還有一個歸檔對象(CArchive

2、類對象)。 CArchive對象為CFile對象緩存數(shù)據(jù),它同時還保存一個內(nèi)部標(biāo)記,用來標(biāo)識該歸檔是存入(寫盤)還是載入(讀盤)。每次只能有一個活動的歸檔與文件相連。應(yīng)用程序框架會很好地管 CFile對象及CArchive對象的創(chuàng)建,為CFile對象打開相應(yīng)的磁盤文件,并且將相應(yīng)的歸檔對象與文件相連。4可序列化的類可序列化的類必須直接或間接地從CObject派生而來.并且在類聲明中,必須包含DECLARE_SERIAL宏調(diào)用.在類的實(shí)現(xiàn)文件中,必須包含IMPLEMENT SERIAL宏調(diào)用。5建立可序列化的類的例子(1)步驟1.選擇向?qū)FC AppWizard(exe),創(chuàng)建一個名為Ex_S

3、tudent的項(xiàng)目. 選擇單文檔界面.步驟2.在VC+中, 為應(yīng)用程序添加一個StudentInfo.h文件.編輯該文件 :步驟3.在VC+中, 為應(yīng)用程序添加一個StudentInfo.cpp文件.編輯該文件6class CStudentInfo : public CObjectCString strName;/ 姓名CString strNO;/ 學(xué)號BOOLbMale;/ 性別,是否為男CTimetBirth;/ 出生年月CStringstrSpecial;/ 專業(yè)DECLARE_SERIAL(CStudentInfo)/ 序列化聲明public:CStudentInfo() ;CStu

4、dentInfo(CString name, CString id, BOOL male, CTime birth, CString special);void Serialize(CArchive &ar);void Display(int y, CDC *pDC);/ 在坐標(biāo)為(0,y)處顯示數(shù)據(jù);7#include stdafx.h#include StudentInfo.hCStudentInfo:CStudentInfo(CString name, CString id, BOOL male, CTime birth, CString special)strName= name;st

5、rNO= id;bMale= male;tBirth= birth;strSpecial= special; void CStudentInfo:Display(int y, CDC *pDC)CString str, strSex(女);if (bMale) strSex = 男;str.Format(%s %s %s %s %s, strName, strNO,strSex, tBirth.Format(%Y-%m-%d), strSpecial);pDC-TextOut(0, y, str);IMPLEMENT_SERIAL(CStudentInfo, CObject, 1)/ 序列化實(shí)

6、現(xiàn)void CStudentInfo:Serialize(CArchive &ar)if (ar.IsStoring() arstrNamestrNObMaletBirthstrNamestrNObMaletBirthstrSpecial;8建立可序列化的類的例子(4)步驟4.為應(yīng)用程序添加一個對話框資源IDD_STUINFO,用來輸入學(xué)生信息.9建立可序列化的類的例子(5)對話框中各控件的ID為:10建立可序列化的類的例子(6)對話框中各控件對應(yīng)的變量為:11建立可序列化的類的例子(7)步驟5:為CStuInfoDlg類添加一個BOOL型成員變量m_bMale,并在CStuInfoDlg類設(shè)

7、置該變量的初始值。如下面的代碼:CStuInfoDlg:CStuInfoDlg(CWnd* pParent /*=NULL*/): CDialog(CStuInfoDlg:IDD, pParent)m_bMale = FALSE;12建立可序列化的類的例子(8)步驟6:用MFC ClassWizard為CStuInfoDlg類添加WM_INITDIALOG消息映射,并添加下列初始化代碼:BOOL CStuInfoDlg:OnInitDialog() CDialog:OnInitDialog();if (!m_bMale)CheckRadioButton(IDC_RADIO_MALE,IDC_R

8、ADIO_FEMALE, IDC_RADIO_FEMALE);elseCheckRadioButton(IDC_RADIO_MALE, IDC_RADIO_FEMALE, IDC_RADIO_MALE);m_comboSpecial.AddString( 機(jī)械工程及其自動化 );m_comboSpecial.AddString( 電氣工程及其自動化 );m_comboSpecial.AddString( 計(jì)算機(jī)科學(xué) );m_strSpecial = 計(jì)算機(jī)科學(xué);m_tBirth = CTime(1986, 1, 1, 0, 0, 0); / 對出生年月初始化UpdateData(FALSE);

9、return TRUE; 13建立可序列化的類的例子(9)步驟7:用MFC ClassWizard為單選按鈕IDC_RADIO_MALE添加BN_CLICKED的消息映射,并增加下列代碼:void CStuInfoDlg:OnRadioMale() m_bMale = TRUE;用MFC ClassWizard為單選按鈕IDC_RADIO_FEMALE添加BN_CLICKED的消息映射,并增加下列代碼:void CStuInfoDlg:OnRadioFemale() m_bMale = FALSE;14建立可序列化的類的例子(10)步驟8:用MFC ClassWizard為按鈕IDOK添加BN

10、_CLICKED的消息映射,并增加下列代碼:void CStuInfoDlg:OnOK() UpdateData();m_strName.TrimLeft();m_strNo.TrimLeft();if (m_strName.IsEmpty()MessageBox(必須要有姓名!);else if (m_strNo.IsEmpty()MessageBox(必須要有學(xué)號!);else CDialog:OnOK();15建立可序列化的類的例子(11)步驟9. 為該對話框建立類CStuInfoDlg.步驟10.在Ex_StudentDoc.cpp文件中,加入頭文件:#include “StuInfo

11、Dlg.h”步驟11.在菜單資源的主菜單中添加頂級菜單項(xiàng)“學(xué)生基本信息”,在該頂層菜單項(xiàng)中添加子菜單“添加(&A)”(1D_STUINFO_ADD),在CEx_StudentDoc類中處理該菜單的命令消息.void CEx_StudentDoc:OnStuinfoAdd() CStuInfoDlg dlg;if (dlg.DoModal() != IDOK) return;CStudentInfo *pStudent = new CStudentInfo(dlg.m_strName, dlg.m_strNo, dlg.m_bMale, dlg.m_tBirth, dlg.m_strSpecia

12、l); m_stuObArray.Add(pStudent);SetModifiedFlag(); UpdateAllViews(NULL);16建立可序列化的類的例子(12)步驟12.在Ex_StudentDoc.h文件的頭部,加入語句:#include “StudentInfo.h”為CEx_StudentDoc類添加下列成員變量:public: CObArray m_stuObArray;步驟13.為CEx_StudentDoc類添加成員函數(shù)CStudentlnfo* GetStudentlnfoAt (int nIndex),用來獲取m_stuObArray中指定索引號的CStudem

13、lnfo類指針,其代碼如下:CStudentInfo* CEx_StudentDoc:GetStudentInfoAt(int nIndex)if (nIndex m_stuObArray.GetUpperBound()return NULL;/ 超界處理return (CStudentInfo *)m_stuObArray.GetAt(nIndex);17建立可序列化的類的例子(13)步驟14. 為CEx_StudentDoc類添加成員函數(shù)int GetAllRecNum(void),用于獲取集合類中對象的個數(shù)其代碼如下:int CEx_StudentDoc:GetAllRecNum()re

14、turn m_stuObArray.GetSize();步驟15.在CEx_StudentDoc類析構(gòu)函數(shù)CEx_StudentDoc添加下列代碼:CEx_StudentDoc:CEx_StudentDoc()int nIndex = GetAllRecNum();while (nIndex-)delete m_stuObArray.GetAt(nIndex);m_stuObArray.RemoveAll();18建立可序列化的類的例子(14)步驟16. 在CEx_StudentDoc:Serialize函數(shù)中添加下列代碼:void CEx_StudentDoc:Serialize(CArch

15、ive& ar)if (ar.IsStoring()m_stuObArray.Serialize(ar);else m_stuObArray.Serialize(ar); 步驟17. 將CEx_StudentView:OnDraw代碼修改如下,用來將所有的學(xué)生基本信息記錄顯示在視圖中:void CEx_StudentView:OnDraw(CDC* pDC)CEx_StudentDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc);int y = 0;for (int nIndex = 0; nIndex GetAllRecNum(); nIndex+)

16、pDoc-GetStudentInfoAt(nIndex)-Display(y, pDC); y += 16;19靜態(tài)切分窗口示例(1)步驟1.選擇向?qū)FC AppWizard(exe),創(chuàng)建一個名為Ex_SplitSDI的項(xiàng)目. 選擇單文檔界面.步驟2.打開應(yīng)用程序的MainFrm.h頭文件,為CMainFrame類添加一個保護(hù)類型的切分窗口的數(shù)據(jù)成員,如下面的定義:CSplitterWnd m_wndSplitter;步驟3.用MFC ClassWizard創(chuàng)建一個新的視圖類CDemoView(基類為CView)用于與靜態(tài)切分的窗格相關(guān)聯(lián)。20靜態(tài)切分窗口示例(2)步驟4.用MFC Cl

17、assWizard為CMainFrame類重載虛函數(shù)OnCreateClient(當(dāng)主框架窗口客戶區(qū)創(chuàng)建的時候自動調(diào)用該函數(shù)) ,并添加下列代碼:BOOL CMainFrame:OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* pContext) CRect rc;GetClientRect(rc);/ 獲取客戶區(qū)大小CSize paneSize(rc.Width()/2-16,rc.Height()/3-16); / 計(jì)算每個窗格平均尺寸m_wndSplitter.CreateStatic(this,3,2);/ 創(chuàng)建3 x 2個靜態(tài)窗格

18、m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CDemoView),paneSize,pContext); / 為相應(yīng)的窗格指定視圖類m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CDemoView),paneSize,pContext);m_wndSplitter.CreateView(1,0,RUNTIME_CLASS(CDemoView),paneSize,pContext);m_wndSplitter.CreateView(1,1,RUNTIME_CLASS(CDemoView),paneSize,pCon

19、text);m_wndSplitter.CreateView(2,0,RUNTIME_CLASS(CDemoView),paneSize,pContext);m_wndSplitter.CreateView(2,1,RUNTIME_CLASS(CDemoView),paneSize,pContext);return TRUE;21靜態(tài)切分窗口示例(3)步驟5. 在MainFrm.cpp源文件的開始處,添加視圖類CDemoView的包含文件:#include DemoView.h步驟6. 編譯并運(yùn)行該應(yīng)用程序。22一個文檔多個視圖例子(1)步驟1.選擇向?qū)FC AppWizard(exe),創(chuàng)

20、建一個名為Ex_Rect的項(xiàng)目. 選擇多文檔界面.選擇視圖的基類選擇為CFormView。步驟2.打開表單模板資源IDD_EX_RECT_FORM,調(diào)整表單模板大小,并依次添加控件23一個文檔多個視圖例子(2)對話框中各控件的ID為:添加的控件ID號其他屬性編輯框(x)IDC_EDIT1默認(rèn)旋轉(zhuǎn)按紐IDC_SPIN1自動伙伴(Auto buddy)、Set buddy integer, Alignment Right編輯框(Y)IDC_EDIT2默認(rèn)旋轉(zhuǎn)按紐IDC_SPIN2自動伙伴(Auto buddy)、Set buddy integer, Alignment Right24一個文檔多個視

21、圖例子(3)步驟3.對話框中各控件對應(yīng)的變量為:控件ID號變量類別變量類型變量名IDC_EDIT1ValueCStringm_CoorXIDC_EDIT2ValueCStringm_CoorYIDC_SPIN1ControlCSpinButtonCtrlm_SpinXIDC_SPIN3ControlCSpinButtonCtrlm_SpinY25一個文檔多個視圖例子(4)步驟4.在CEx_RectDoc類中添加一個公有型的CPoint數(shù)據(jù)成員m_ptRect,用來記錄小方塊的位置。public:CPoint m_ptRect;并在CEx_RectDoc類的構(gòu)造函數(shù)處添加下列代碼:CEx_Rec

22、tDoc:CEx_RectDoc()m_ptRect.x = m_ptRect.y = 0;/ m_ptRect = CPoint(0,0)在CEx_RectView類中添加一個公有BOOL型的成員變量m_bEditOK, 在CEx_RectView 類的構(gòu)造函數(shù)將其初始化為false.26一個文檔多個視圖例子(5)步驟5.用MFC ClassWizard為編輯框IDC_EDITl和IDC_EDIT2添加EN_CHANGE的消息映射,使它們的映射函數(shù)名都設(shè)為OnChangeEdit,并添加下列代碼:void CEx_RectView:OnChangeEdit() if (!m_bEditOK)

23、 return;UpdateData(TRUE);CEx_RectDoc* pDoc = (CEx_RectDoc*)GetDocument();pDoc-m_ptRect.x = m_CoorX;pDoc-m_ptRect.y = m_CoorY;CPoint pt(m_CoorX, m_CoorY);pDoc-UpdateAllViews(NULL, 2, (CObject *)&pt);27一個文檔多個視圖例子(6)步驟6.用MFC ClassWizard為CEx_RectView添加OnUpdate的消息函數(shù),并添加下列代碼:void CEx_RectView:OnUpdate(CVi

24、ew* pSender, LPARAM lHint, CObject* pHint) if (lHint = 1)CPoint* pPoint = (CPoint *)pHint;m_CoorX = pPoint-x;m_CoorY = pPoint-y;UpdateData(FALSE);/ 在控件中顯示CEx_RectDoc* pDoc = (CEx_RectDoc*)GetDocument();pDoc-m_ptRect = *pPoint;/ 保存在文檔類中的m_ptRect28一個文檔多個視圖例子(7)步驟7.在CEx_RectView:OnInitialUpdate中添加一些初始化

25、代碼:void CEx_RectView:OnInitialUpdate()CFormView:OnInitialUpdate();ResizeParentToFit();CEx_RectDoc* pDoc = (CEx_RectDoc*)GetDocument();m_CoorX = pDoc-m_ptRect.x;m_CoorY = pDoc-m_ptRect.y;m_SpinX.SetRange(0, 1024);m_SpinY.SetRange(0, 768);UpdateData(FALSE);m_bEditOK = TRUE;29一個文檔多個視圖例子(8)步驟8. 為應(yīng)用程序添加一

26、個新的CView的派生類CDrawView。步驟9.打開ChildFrm.h文件,為CChildFrame類添加下列成員變量:public:CSplitterWnd m_wndSplitter;步驟10.在ChildFrm.cpp的前面添加下列語句:#include Ex_RectView.h#include DrawView.h30一個文檔多個視圖例子(9)步驟11. 為CChildFrame類重載OnCreateClient函數(shù)的重載,并添加下列代碼:BOOL CChildFrame:OnCreateClient(LPCREATESTRUCT lpcs, CCreateContext* p

27、Context) BOOL bRes = m_wndSplitter.CreateStatic(this, 1, 2);/ 創(chuàng)建2個水平靜態(tài)窗格CRect rect;GetClientRect( &rect );m_wndSplitter.CreateView(0,1,RUNTIME_CLASS(CDrawView), CSize(rect.Width()/2,0), pContext);m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CEx_RectView), CSize(rect.Width()/2,0), pContext);m_wndSplitter.RecalcLayout();/ 重新布局切分窗口return bRes;/CMDIChildWnd:OnCreateClient(lpcs, pContext);31一個文檔多個視圖例子(10)步驟12.打開Ex_RectView.h文件,在classCEx_RectView:public CFormView語句前添加下列代碼:class CEx_RectDoc;步驟13.為CDrawView類添加一個公有型的CPoin

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論