友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
狗狗书籍 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

C语言实例教程(PDF格式)-第98章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!






使用CList模板创建列表集合类的方法和使用CArray模板非常相似。 

我们同样需要两个参数TYPE和ARG_TYPE,其含义仍如前面的讲述过的 

一样。如可以使用下面的语句更改示例TextViewer中的类CTextDoc的 

成员m_text的定义:  



CList  m_text;  



前面已经提到过,列表并没有一个象数组那样的索引,因此,必须修 

改CTextView中的OnDraw成员函数以及CTextDoc中的Serialize成员函 

数来正确的使用和遍历列表中的所有元素。  



修改过的Serialize成员函数如下:  



/////////////////////////////////////////////////////////////  



// CTextDoc serialization  



void CTextDoc::Serialize(CArchive& ar)  



{  



CString str;  



if (ar。IsStoring())  



{  


…………………………………………………………Page 454……………………………………………………………

POSITION pos=m_text。GetHeadPosition();  



while (pos!=NULL)  



{  



str=m_text。GetNext(pos);  



ar。WriteString(str+CString(〃rn〃));  



}  



}  



else  



{  



while (ar。ReadString(str))  



{  



m_text。AddTail(str);  



}  



}  



}  



由于不存在索引的概念,列表使用类型为POSITION的32位值来标识列 

表中的数据的位置。在上面的代码中,CList的成员函数 

GetHeadPosition返回列表中第一个元素的位置。成员函数GetNext以 

一个对POSITION变量的引用为参数,除了返回指定位置的元素外, 

GetNext还将传递给它的POSITION变量引用的值置为所返回元素的下 

一个元素的位置,如果该引用的值被置为NULL,则说明已遍历至列表 

尾。  



使用列表时添加元素的方法也与数组有所不同。CList类模板中并没 

有名为Add的成员函数,取而代之的是两个成员函数AddHead和 

AddTail。它们分别把指定的元素添加到列表的首部和尾部,并返回 

所添加元素在列表中的位置,这是一个POSITION类型的值。另外,成 

员函数InsertBefore和InsertAfter分别将新的元素插入到指定位置 

之前或之后。前面已经说过,由于列表相对于数组具有特殊的结构, 

在列表中插入或删除元素并不需要移动插入点之后的元素,因此在列 

表中插入和删除元素要比对数组进行同样的操作快上很多,尤其是对 

于较大的集合对象。  


…………………………………………………………Page 455……………………………………………………………

按下面的清单修改CTextView类的OnDraw成员函数。  



void CTextViewerView::OnDraw(CDC* pDC)  



 {  



CTextViewerDoc* pDoc = GetDocument();  



ASSERT_VALID(pDoc);  



CList & text=pDoc…》m_text;  



TEXTMETRIC tm;  



pDC…》GetTextMetrics(&tm);  



CRect rect;  



GetClientRect(&rect);  



pDC…》DPtoLP(&rect);  



int cpl=rect。Width()/tm。tmAveCharWidth;  



int h=int(tm。tmHeight*1。5);  



int cl=0;  



POSITION pos=text。GetHeadPosition();  



while (pos!=NULL)  



 {  



CString str=text。GetNext(pos);  



LPCTSTR pHead=str。LockBuffer();  



LPCTSTR pTail=LPCTSTR(str)+str。GetLength();  



LPCTSTR pCur=pHead;  



do  



 {  



while(pCur…pHeadTabbedTextOut(0; (cl++)*h; pHead;   



int(pCur…pHead); 0; NULL; 0);  



}  



else  



 {  



while(pDC…》GetTabbedTextExtent(pHead;   



int(pCur…pHead); 0; NULL)。cx》rect。Width())  



 {  



pCur=_tcsdec(pHead;pCur);  



}  



pDC…》TabbedTextOut(0; (cl++)*h; pHead;   



int(pCur…pHead); 0; NULL; 0);  



}  


…………………………………………………………Page 457……………………………………………………………

pHead=pCur;  



}while(pCur
返回目录 上一页 下一页 回到顶部 0 0
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!