亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? 13.4.2 利用可串行化類的 serialize函數(shù)保存和加載對象.txt

?? 網(wǎng)上第一本以TXT格式的VC++深入詳解孫鑫的書.全文全以TXT格式,并每一章節(jié)都分了目錄,清晰易讀
?? TXT
字號:
13.4.2 利用可串行化類的 Serialize函數(shù)保存和加載對象
下面,在 CGraphic View類的 OnLButtonUp函數(shù)中,當(dāng)繪制圖形之后,將圖形要素保存起來,在前
面第 11章中使用集合類: CPtrList來實現(xiàn),這電使用另一個類=CObArTay來實現(xiàn),該類的用法與 
CPtrList非常類似,只是在添加元素時添加的是 CO同 ect指針。因為 CGraph類就是從 CObject類
派生的,所以使用 CObArray類比較合適。為了保存多個圖形要素,為 CGraphicView類添加一個 
CObArray類型的成員變量 : ffi_obArray,并將其訪問權(quán)限設(shè)置為 public類型,因為隨后在文檔類
中需要訪問這個變量。
另外,為了簡單起見,不再設(shè)置畫筆的顏色,所以將此函數(shù)中己有的構(gòu)造 CPen對象的代碼,以及將
此對象選入設(shè)備描述表中的代碼注釋起來。接著,在繪制圖形之后,添加如例 13-21所示代閨中加
灰顯示的代碼,先構(gòu)造 CGraph對象,然后將該對象添加到集合類中。
例 13.21 

void CGraphicView: :OnLButtonUp(UINT nFlags , CPoint point) 

{  
// TODO :  Add your message handler code here and/or  call default  
CClientDC  dc(this) ;  
//  CPen pen(m_nL工 neStyle, m_nLineWidth , m_clr) ;  
//  dc . SelectObject(&pen);  
CBrush  

*pBrush=CBrush: : FromHandle( (HBRUSH)GetStockObject(NULL_BRUSH)); dc . 
SelectObject(pBrush) ; switch(m_nDrawType) { 
case 1: dc.SetPixel(point , m_clr); break; 
case 2: dC.MoveTo(m-ptOrigin) ; dc.LineTo(point) ; break; 
case 3: dc.Rectangle(CRect(m-ptOrigin , point)) ; break; 
case 4: dc.Ellipse(CRect(m-ptOrigin , point)) ; break; 
CGraph *pGraph=new CGraph(m_nDrawType,m-ptOrigin, point); ( m_obArray.Add(pGraph) ; 
Cview : :OnLButtonUp(nFlags , point); 

另外,在 CGraphicView類中如果想要使用 CGraph類型的對象,那么必須將該對象定
義所在的頭文件包含進(jìn)來,因此,在 GraphicView.cpp文件的前部添加下面這條語句: 
#include "Graph .h " 
接下來,在 CGraphicDoc類的 Serialize函數(shù)中,將 CGraphicView對象的集合類對象: m_obArray
中保存的圖形元素寫入到文件中。首先我們需要將該函數(shù)中先前添加的代碼注釋起來。另外,在文
檔類中想要訪問視類的對象,首先就要獲得視類對象的指針。我們知道,對于一個文檔類對象來說,
可以有多個視類對象與之相關(guān)。但對于一個視類對象來說,它只能與一個文檔類對象相關(guān)。因此,
為了獲得與文檔對象相關(guān)的視類對象,首先就要通過 CDocument類的 GetFirs tView Pos iti o n
成員函數(shù)獲得與該文檔對象相關(guān)的視類鏈表中第一個視類對象的位置,然后通過 GetNextView函數(shù)
得到當(dāng)前位置所指示的視類對象指針。 CDocument類的 GetFirst ViewPosition成員函數(shù)的原型聲
明如下所示 : 
virtual POSITION GetFirstViewPosition( ) const ; 
該函數(shù)將返回與文檔相關(guān)聯(lián)的視類對象鏈表中的第一個視類對象的位置,這個位置可以被 
GetNextView函數(shù)選代使用。返回值類型是 POSOTION,這種類型被 MFC中的集合類用來表示集合中
元素的位置。 
GetNextView函數(shù)的原型聲明如下所示 : 
virtual CView* GetNextView( POS工T工ON& rPosition ) const ; 
可以看到, GetNextView函數(shù)有一個 POSITION類型的參數(shù) : rPosition。當(dāng)調(diào)用 GetFirstViewPo s 
ition函數(shù)之后就可以獲得第一個視類對象的位置,然后將這個值作為參數(shù)傳遞給 GetNextVie w函
數(shù),該函數(shù)調(diào)用之后,將返回這個位置所標(biāo)識的視類對象指針,然后通過 rPosition參數(shù)返回下一
個視類對象的位置。于是,通過不斷地調(diào)用 GetNextVie w函數(shù),就可以得到與文檔類對象相關(guān)的每
一個視類對象。如果到了視類鏈表的末尾,即沒有下一個視類對象了, rPo s ition的值就會被設(shè)
置為 NULL。因此程序中就可以根據(jù)這個條件,終止調(diào)用 GetNextView函數(shù)。通過這種方法可以迭代
地訪問與文檔對象相關(guān)的每一個視類對象。因為本程序是一個單文檔類型的程序,所以它只有一個
視類對象。所以在 CGraphicDoc類的 Serialize函數(shù)中開始位置添加如例 13-22所示代碼中加灰顯
示的代碼。
例 13 -22 

void CGraphicDoc : : Serialize(CArchive& ar) 
POSiTION pos=GetFirstViewPosition() ; 
CGraphicView *pView= (CGraphicView*)GetNextView(pos) ; 
if (ar . IsStoring()) 
// TODO: add storing code here 
inti=5 ; 
char ch='b' ; 
float f =1. 2f; 
CString str ( "http://www . sunxin. org") ; 
ar <<i <<ch<<f<<str; 
else 
11 T ODO : add lo ad工 ng code here 
int i: 
char ch: 
float f: 
CStrlng str: 
CString strResult: 
a r>>i>>ch>>f>>str: 
strResult .Forrnat( "屯d,氈c,氈f.氈s ", i , ch , f. str) : 
Af xMessageBox (strResult) : 

上述如例 13-22所示代碼通過調(diào)用 GetFirstViewPosition函數(shù)和 GetNextView函數(shù)獲取與文檔對
象相關(guān)的第一個視類對象的指針,也就是 CGraphicView對象的指針。要注意的是. GetNextView函
數(shù)返回的是 CView*.而我們需要的是 CGraphicView飛因此需要進(jìn)行一個強制類型轉(zhuǎn)換。
有了視類對象指針,就可以利用此指針訪問視類對象的成員變量了。于是在 CGraphicDoc類的 
Serialize函數(shù)中,在保存數(shù)據(jù)時,得到 CGraphicView對象的 ID_obArray這個集合類對象中保存的
對象數(shù)目,然后利用一個 for循環(huán)結(jié)構(gòu)遍歷這些元素,分別將它們保存到文件中。但是,如果 for
循環(huán)語句用下面這條代碼來實現(xiàn): 
for(int i=0;i<pView->m_obArray.GetSize();i++)
那么,每次循環(huán)時都會調(diào)用 GetSize函數(shù)去求取集合類對象中元素的數(shù)目,這樣會影
響程序的執(zhí)行效率。我們在編寫代碼時,應(yīng)該注意代碼優(yōu)化問題。這里,我們可以把 GetSize這個
函數(shù)調(diào)用提取出來,單獨定義一個變量來保存該函數(shù)調(diào)用后得到的集合類對象元素數(shù)目。如果要提
取己保存到文件中的數(shù)據(jù),首先需要知道該文件中保存的對象數(shù)目。所以在保存集合類對象所保存
的圖形對象時,可以在保存具體的對象數(shù)據(jù)之前,先將所要保存的對象數(shù)目也保存到文件中。接下
來,在 for循環(huán)內(nèi)部,利用 CArchive對象保存集合類對象中所保存的圖形對象。因為 CGraph類本
身支持串行化,所以可以直接保存該類對象。于是,我們可以在例 13-22所示 CGraphicDoc類 
Serialize函數(shù)的 if語句塊中添加下述代碼。 
int nCount=pView->m_obArray.GetSize(); 
ar<<nCount; 
for(int i=0;i<nCount;i++) 
ar<<pView->m_obArray.GetAt(i) ; 
在讀取對象數(shù)據(jù)時,可以先取出對象數(shù)據(jù),然后,也利用 for循環(huán)語句來讀取所有對象的數(shù)據(jù)。每
次取出一個 CGraph對象之后,都可以將這個對象的地址加入到 CGraphic View 對象的 ID_obArray
這個集合類對象中。于是,我們可以在如例 13-22所示 CGraphicDoc類
Serialize函數(shù)的else分支下添加下述代碼: 
int nCount; 
ar>>nCount; 
CGraph *pGraph; 
for(int i=0;i<nCount;i++) 

ar>>pGraph; 
pView->rn_obArray.Add(pGraph) ; 

注意,這里并沒有先構(gòu)造一個CGraph對象,再讀取其數(shù)據(jù)。因為這里在利用CArchive類重載的提取
操作符 C>>)讀取對象時,它會自動調(diào)用CGraph類的不帶參數(shù)的構(gòu)造函數(shù)去構(gòu)造相應(yīng)對象,然后將這
個對象的地址賦給 pGraph這個指針變量。所以這里并不需要
為該指針變量分配內(nèi)存空間。
在CGraphicDoc類中若想要訪問CGraphicView類和CGraph類,需要包含相應(yīng)的頭文件,即在
GraphicDoc.cpp文件的前部添加下述語句: 
#include "GraphicView.h" 
#include "Graph.h" 
在提取文件數(shù)據(jù)時,當(dāng)我們將CGraph對象添加到集合類對象之后,還需要將這些圖形在程序窗口中
顯示出來。這可以在 CGraphicView類的 OnDraw函數(shù)中把圖形的重繪工作完成了。因為在 CGraph
類中已經(jīng)包含了圖形繪制函數(shù) (Draw),所以這里只需要調(diào)用這個函數(shù)就可以。于是,在CGraphicView
類的OnDraw函數(shù)中添加如例 13-23所示代碼中加灰顯示的代碼。
例13-23 

void CGraphicView: : OnDraw(CDC食 pDC) 
{ CGraphicDoc* pDoc = GetDocurnent(); ASSERT_VAL工o (pDoc) ; // TODO: add draw code for 
native data here 
/ * 	CFont *pOldFont=pDC->SelectObject(&rn_font); 
pDC->TextOut(Q , Q, rn_strFontNarne) ; 
pDC->SelectObject(pOldFont) ; 
*/ 
int nCount; 
nCount=m_obArray.GetSize() ; 
for(int i=0 ,i<nCount ,i++) 
{ 
((CGraph*)m_obArray.GetAt(i))->Draw(pDC) ; 
新添加的代碼通過調(diào)用集合類對象的GetAt函數(shù)獲取元素,并需要將結(jié)果強制轉(zhuǎn)換為 CGrath*類型,
然后利用此指針調(diào)用 CGraph對象的 Draw函數(shù)完成圖形的繪制。而調(diào)用
" I 513 
第 13章文檔與串行化 
Draw函數(shù)時,需要傳遞一個 CDC*類型的參數(shù),正好 CGraphicView類的 OnDraw函數(shù)中
有一個 CDC指針類型的變量 : pDC,因此直接把這個變量作為參數(shù)傳遞給 Draw函數(shù)就可

以了。
運行 Graphic程序,先選擇相關(guān)繪圖菜單,在窗口中繪制一些圖形。然后選擇【文件\保存】菜單項,
把圖形對象保存到一個指定的文件中,例如 Graphic.txt。然后關(guān)閉程序,再次運行,然后選擇【文
件\打開】菜單項,并選擇 Graphic.txt文件打開。這時就可以從該文件中加載數(shù)據(jù),并在內(nèi)存中重
新構(gòu)造 CGraph對象,隨即就可以看到在程序窗口中顯示出先前繪制的圖形了。以上就是利用 C 
Archive類和可串行化類的 Serialize函數(shù)保存對象和加載對象的實現(xiàn)。 

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线视频一区二区免费| 九一九一国产精品| 色婷婷激情综合| 中文字幕亚洲一区二区av在线| 国产在线日韩欧美| 欧美精品一区二区三区在线 | 一区二区三区电影在线播| 91免费版在线| 夜夜精品浪潮av一区二区三区| 99国产精品久久久久久久久久久| 最近日韩中文字幕| jvid福利写真一区二区三区| 亚洲摸摸操操av| 欧美性生活影院| 日韩成人av影视| 欧美成人国产一区二区| 国产一区二区影院| 1000精品久久久久久久久| 色吊一区二区三区| 日韩av午夜在线观看| 精品国产免费一区二区三区香蕉| 国产一区二区91| 日韩一区在线看| 欧美性xxxxxx少妇| 久久97超碰国产精品超碰| 日本一区二区三区四区| 色成人在线视频| 麻豆精品视频在线观看| 国产欧美视频在线观看| 在线免费观看一区| 六月丁香婷婷色狠狠久久| 欧美—级在线免费片| 在线精品观看国产| 国产在线精品不卡| 亚洲桃色在线一区| 日韩一级黄色片| av日韩在线网站| 视频一区中文字幕| 国产精品久久久久影院| 宅男在线国产精品| aaa国产一区| 免费观看在线色综合| 中文字幕第一区综合| 欧美日韩国产精品自在自线| 国产一区二区美女| 亚洲国产精品一区二区www在线| 欧美mv日韩mv国产网站| 91成人免费在线视频| 国内精品写真在线观看| 亚洲国产日产av| 国产精品美女www爽爽爽| 欧美高清视频不卡网| 91在线观看一区二区| 久久99精品国产麻豆婷婷| 亚洲一区二区三区四区在线免费观看 | 欧美日本免费一区二区三区| 国产成人亚洲综合色影视| 日产欧产美韩系列久久99| 一区二区三区在线观看动漫| 国产亚洲一二三区| 日韩一区二区精品| 欧美影视一区在线| 99v久久综合狠狠综合久久| 黑人巨大精品欧美一区| 亚洲福利电影网| 亚洲精品成人精品456| 国产精品美女久久久久久久| 久久久久久久av麻豆果冻| 91麻豆精品国产综合久久久久久| 欧美视频一区二区在线观看| 不卡av免费在线观看| 国产精品亚洲第一区在线暖暖韩国| 日本大胆欧美人术艺术动态| 亚洲一区视频在线观看视频| 亚洲欧美日韩国产手机在线| 国产精品乱码人人做人人爱| 久久视频一区二区| 精品国产电影一区二区| 日韩一级二级三级精品视频| 欧美一卡二卡三卡| 欧美一级欧美一级在线播放| 337p亚洲精品色噜噜| 欧美日韩精品欧美日韩精品| 欧美日韩大陆一区二区| 欧美乱熟臀69xxxxxx| 欧美日韩www| 欧美一区二区网站| 日韩欧美亚洲另类制服综合在线| 日韩一级大片在线观看| 26uuu另类欧美| 精品久久久久久久久久久院品网| 亚洲精品一线二线三线| 国产亚洲精品bt天堂精选| 国产午夜精品一区二区三区嫩草 | 久久成人久久爱| 日韩av一区二| 精东粉嫩av免费一区二区三区| 午夜电影一区二区三区| 亚洲电影一级黄| 亚洲欧美日韩国产另类专区| 亚洲男人的天堂一区二区| ...中文天堂在线一区| 国产精品久久久一区麻豆最新章节| 久久久亚洲精华液精华液精华液| 久久一留热品黄| 久久久久成人黄色影片| 久久久久99精品一区| 欧美影院一区二区| 欧美成人在线直播| 精品国精品国产| 国产婷婷色一区二区三区在线| 国产片一区二区| 国产精品乱人伦中文| 中文字幕在线不卡视频| 亚洲电影在线免费观看| 日日摸夜夜添夜夜添国产精品| 免费三级欧美电影| 国产乱码字幕精品高清av| 国产老妇另类xxxxx| 国产成人亚洲综合色影视| 欧美在线小视频| 欧美一区二区网站| 国产片一区二区三区| 亚洲视频综合在线| 亚洲国产中文字幕| 视频一区二区三区中文字幕| 国产激情视频一区二区在线观看| av动漫一区二区| 欧美日韩久久一区| 精品国产成人系列| 国产精品进线69影院| 日韩在线一二三区| 福利电影一区二区| 精品视频在线看| 国产精品毛片久久久久久久| 午夜天堂影视香蕉久久| 国产美女一区二区| 欧洲av在线精品| 久久精品免视看| 日韩电影在线观看网站| 国产精品一区在线观看乱码| 在线观看不卡视频| 国产三级三级三级精品8ⅰ区| 亚洲黄色免费网站| 国产成人免费av在线| 欧美亚洲国产怡红院影院| 欧美视频日韩视频| 久久综合久久综合九色| 亚洲精品日产精品乱码不卡| 极品尤物av久久免费看| 欧美亚洲国产怡红院影院| 欧美国产一区二区| 免费在线成人网| 日本高清成人免费播放| 中文字幕的久久| 麻豆精品视频在线观看免费| 91国在线观看| 国产精品污网站| 久久不见久久见免费视频7 | 色婷婷国产精品| 精品国产一区a| 亚欧色一区w666天堂| 成人黄色电影在线| 日韩一级高清毛片| 日韩国产成人精品| 欧亚洲嫩模精品一区三区| 国产性色一区二区| 久久精品国产网站| 69成人精品免费视频| 日日骚欧美日韩| 色偷偷成人一区二区三区91 | 91网站最新网址| 亚洲国产精品国自产拍av| 国产成人综合亚洲网站| 欧美大片在线观看一区二区| 青青草原综合久久大伊人精品 | 欧美喷水一区二区| 国产成人午夜精品5599| 91精品国产免费| 午夜av一区二区三区| 91精品久久久久久久久99蜜臂| 一区二区三区资源| 91美女在线视频| 亚洲精品亚洲人成人网 | 欧美日韩中文字幕一区| 亚洲伊人色欲综合网| 91黄色免费版| 亚洲精品午夜久久久| 久久精品国产99国产| 久久久久久久精| 国产成人啪免费观看软件| 久久女同互慰一区二区三区| 久久97超碰国产精品超碰| 欧美一区二区国产| 国产精品一卡二| 中文字幕乱码一区二区免费| 丁香婷婷综合网| 中文字幕中文乱码欧美一区二区| 91久久精品日日躁夜夜躁欧美| 一区二区三区不卡视频|