友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
富士康小说网 返回本书目录 加入书签 我的书架 我的书签 TXT全本下载 『收藏到我的浏览器』

C语言实例教程(PDF格式)-第39部分

快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!



的集合类中生成类型安全的集合类。  



MFC提供的新的基于模板的集合类对于数组、列表和映射的实现如表 

8。3所示。  


…………………………………………………………Page 445……………………………………………………………

                     表8。3 基于模板的MFC集合类  



           集合内   数组           列表          映射  

           容  



           任意类   CArray       Clist      CMap  

           型的对 

           象  



           指向任   CTypedPtrArray  CTypedPtrList  CTypedPtrMap  

           意对象 

           的指针  



表8。4所示的不基于模板的MFC集合类仍可以使用。  



您可以根据上面所给的特点来为您的应用程序选定的合适的集合类。 

下面我们将举例来说明各个集合类的基本使用方法。  



                        表8。 4 非模板集合类  



              数组        列表         映射  



             CObArray   CObList   CMapPtrToWord  



             CByteArray  CPtrList  CMapPtrToPtr  



             CDWordArray  CStringList  CMapStringToOb  



             CPtrArray            CMapStringToPtr  



             CStringArray         CMapStringToString  



             CWordArray           CMapWordToOb  



             CUIntArray           CMapWordToPtr  



    (1) 使用CArray模板创建数组集合  



正如同前面所说,很多时候我们使用集合类来保存文档中的数据。在 

下面的例子中,我们在文档中使用集合类来创建一个功能非常简单的 

文本文件查看程序。这个实用程序的功能还很单一,这里我们仅是用 

它来作为说明集合类的使用的示例。  



首先我们需要为这个示例创建一个MDI工程,可以使用AppWizard来完 

成很多模式化的东西,这里我们假定读者已经对如何使用AppWizard 

创建起始工程非常地熟悉,所以不再重复的讲述这个过程。如果您需 


…………………………………………………………Page 446……………………………………………………………

要帮助的话,可以看一看          “8。2使用AppWizard创建框架应用程序” 

和   “8。3生成文档”  中的示例。在下面的讲述中,我们假定您所创 

建的工程名为TextViewer,相应的文档类和视类为CTextDoc和 

CTextView。  



刚开始的时候我们考虑使用CArray模板来创建该应用程序,这也是最 

直观的想法。  



要在程序中使用MFC模板类,需要添加头文件afxtempl。h,由于在整 

个过程中我们都  没有必要去修改这个头文件 (并且,我们也不建议您 

去修改这个头文件),所以我们可以把它添加工程TextViewer的预编 

译头文件StdAfx。h中。这样做还可以获得额外的好处,就是没有必要 

对每一个包含了StdAfx。h头文件的源文件都添加  



#include   



一行。由于由AppWizard和ClassWizard生成的文件大多添加了下面的 

代码:  



#include   



因此,我们就可以避免为每一个需要使用模板的源文件都手动的添加 

对afxtempl。h的包含。  



完成这一步之后,在CTextDoc的定义中添加下面的代码:  



public:  



CArray  m_text;  



从CArray模板生成指定类型的元素的数组的语法为  



CArray  myArray;  



其中使用到了两个参数,第一个参数TYPE为数组类所存储的元素类 

型,可以指定的元素类型包括:基本C++数据类型、C++结构和类以及 

其它的用户自定义类型。第二个参数指定在函数参数传递中的使用的 

数据类型,对于结构和类类型的元素,我们一般都将ARG_TYPE参数设 

置为对TYPE参数指定的数据的引用,如上面的例子。把函数参数指定 

为对数据的引用可以生成更有效的代码,这对于在集合类中使用大的 

类对象非常有意义。  



在本示例中使用向集合类中添加元素是在文档的串行化时进行的。按 

下面的代码重载类CTextDoc的Serialize成员函数:  


…………………………………………………………Page 447……………………………………………………………

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



// CTextDoc 串行化  



void CTextDoc::Serialize(CArchive& ar)  



 {  



CString str;  



if (ar。IsStoring())  



 {  



for (int i=0; i” 

运算符将得不到正确的结果;出于同样的原因,如果是使用                   “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; // 所显示的总行数; 用来计算文本的输出位置  



for (int i=0; iGetTabbedTextExtent(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);  



}  



pHead=pCur;  



}while(pCurm_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…pHead
返回目录 上一页 下一页 回到顶部 9 9
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!