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


使用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
小说推荐
返回首页返回目录