`
javababy1
  • 浏览: 1169449 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

使用MFC的数组类

 
阅读更多

    MFC的数组类支持的数组类似于C++中的常规数组,可以存放任何数据类型。C++的常规数组在使用前必须将其定义成能够容纳所有可能需要的元素,而MFC数组类创建的对象可以根据需要动态地增大或减小,数组的起始下标是0,而上限可以是固定的,也可以随着元素的增加而增加,数组在内存中的地址仍然是连续分配的。

    MFC定义了数组模板类CArray,并针对各种常用变量类型定义了CByteArrayCWordArrayCUIntArrayCDWordArrayCStringArrayCObArrayCPtrArray。详见下表:

    数组类

    变量类型

    变量数值范围

    头文件

    CArray

    通过模板类的参数类型设定各种类型

    Afxtempl.h

    CByteArray

    8位无符号整数 BYTE类型

    0—255

    Afxcoll.h

    CWordArray

    16位无符号整数 WORD类型

    0—65535

    Afxcoll.h

    CDWordArray

    32位无符号整数 DWORD类型

    0—4294967295

    Afxcoll.h

    CUIntArray

    32位无符号整数 UINT类型

    0—4294967295

    Afxcoll.h

    CStringArray

    CString字符串 string字符串

    Afxcoll.h

    CObArray

    CObject类及其派生类

    Afxcoll.h

    CPtrArray

    void* 类型指针

    Afxcoll.h

    MFC数组类使用方法基本相同,下面分别以CArrayCUIntArray为例演示说明数组类的使用方法。

    使用 CArray

    打开VC++ 6.0,创建基于对话框的工程ArrayCArrayDlg类声明文件(ArrayDlg.h)中添加语句:

    #include <afxtempl.h>

    请记住:使用CArray一定要包含头文件afxtempl.h

    打开主对话框资源IDD_ARRAY_DIALOG,添加一个按钮IDC_ARRAY_CPOINT,标题为CArray_CPoint,双击该按钮,在OnArrayCpoint()函数中添加如下代码:

    void CArrayDlg::OnArrayCpoint()
    {
    CArray <CPoint,CPoint&> m_Array;
    m_Array.SetSize(10,10);
    CPoint pt1(10,10);
    m_Array.Add(pt1);
    CPoint pt2(10,50);
    m_Array.Add(pt2);
    CPoint pt3(10,100);
    m_Array.Add(pt3);
    int size=m_Array.GetSize();
    CClientDC dc(this);
    dc.MoveTo(0,0);
    CPoint pt;
    for(int i=0;i<size;i++)
    {
    pt=m_Array.GetAt(i);
    dc.LineTo(pt);
    }
    }

    代码简要说明:

    CArray <CPoint,CPoint&> m_Array;

    该语句定义一个CArray数组对象,模板类CArray有两个参数,第一个参数为数组元素的类型,该例中是CPoint,即m_ArrayCPoint数组;第二个参数为引用类型,一般有两种选择,一种选择与第一个参数类型相同,它意味着数组对象作为参数传递时,传递的是数组对象。第二种选择是第一个参数类型的引用,它意味着数组对象作为参数传递时,传递的是数组对象的指针。因此,尤其对于较复杂的数组结构类型,推荐使用引用传递,节约内存同时加快程序运行速度,正如本例使用的是CPoint&

    m_Array.SetSize(10,10);

    SetSize函数设定数组的大小,该函数有两个参数,第一个参数设定数组的大小;第二个参数设定数组增长时内存分配的大小,缺省值是-1,使用缺省值可以保证内存分配得更加合理。本例中第二个参数是10,意即增加一个数组元素会分配10个元素大小的内存供数组使用。

    您可以随时使用SetSize函数设定数组的大小,如果第一个参数值小于数组已有成员数量,多于第一个参数值的成员将被截去并释放相应内存。

    在使用CArray数组前,最好先使用SetSize确定其大小并申请存储空间。如果不这样做,向数组中增加元素时,需要不断地移动和拷贝元素造成运行的低效率和内存碎块。

    m_Array.Add(pt1);

    Add函数添加数组元素。

    int size=m_Array.GetSize();

    GetSize返回数组元素的数目。

    for(int i=0;i<size;i++)
    {
    pt=m_Array.GetAt(i);
    dc.LineTo(pt);
    }

    为了直观显示,该段代码将各数组元素作成折线画到屏幕上,其中GetAt(int index)通过index值得到相应的元素值。 编译并运行程序,观察运行结果。

    继续演示如何使用CArray

    再次打开主对话框资源IDD_ARRAY_DIALOG,添加一个按钮IDC_ARRAY_CSTRING,标题为CArray_CString,双击该按钮,在OnArrayCstring ()函数中添加如下代码:

    void CArrayDlg::OnArrayCstring()
    {
    CArray<cstring,cstring&> m_string;
    CString sztiger("tiger");
    CString szbear("bear");
    CString szdog("dog");
    m_string.SetAtGrow(0,sztiger);
    m_string.SetAtGrow(2,szdog);
    m_string.InsertAt(1,szbear);
    int count=m_string.GetSize();
    CClientDC dc(this);
    dc.SetBkMode(TRANSPARENT);
    TEXTMETRIC textMetric;
    dc.GetTextMetrics(&textMetric);
    int fontHeight=textMetric.tmHeight;
    int displayPos=10;
    for(int x=0;x<count;++x)
    {
    dc.TextOut(10,displayPos,m_string[x]);
    displayPos+=fontHeight;
    }
    AfxMessageBox("Continue...");

    m_string.RemoveAt(2);
    count=m_string.GetSize();
    for(x=0;x<count;++x)
    {
    dc.TextOut(10,displayPos,m_string[x]);
    displayPos+=fontHeight;
    }
    AfxMessageBox("A string has delete,continue...");
    m_string.RemoveAll();
    count=m_string.GetSize();
    if(count==0)
    AfxMessageBox("All elements are deleted.");
    }
    </cstring,cstring&>

    代码简要说明:

    m_string.SetAtGrow(2,szdog);

    SetAtGrow有两个参数,第一个参数决定数组元素的序号值,第二个参数是元素的值。该函数根据序号值设置相应数组元素的值,功能与SetAt相近,不同之处是使用该函数设置元素值时,如果序号值大于数组的上界,数组会自动增长。

    编译运行程序,细心的读者您可能会看到,第一行字符是“tiger”,第二行字符是“bear”,这是我们预料之中的,但第三行是空串,第四行是“dog”。空串是怎样造成的呢?细分析下面三行代码就可以知道:

    m_string.SetAtGrow(0,sztiger);
    m_string.SetAtGrow(2,szdog);
    m_string.InsertAt(1,szbear);

    第一行设定元素0“tiger”,这是没有疑义的。

    第二行设定元素2“dog”,但是在设定元素2的同时自动将元素1填充为空串。

    第三行插入“bear”为元素1,同时原来的元素1和元素2后移为元素2和元素3

    怎么样,这回明白了吧。

    m_string.InsertAt(1,szbear);

    InsertAt函数在指定序号处插入相应元素,该函数在执行过程中,插入点后面的元素会自动后移。 dc.TextOut(10,displayPos,m_string[x]); 其中,m_string[x]是数组类对操作符[]的重载,数组类CArray允许使用[]操作符,类似于C++的常规数组。m_string[x]也可以用m_string.GetAt(x)替代。

    m_string.RemoveAt(2);

    RemoveAt只有一个参数,即元素序号值。该函数根据元素序号值删除相应元素值,后面的元素会自动前移。

    m_string.RemoveAll();

    RemoveAll删除所有元素值

    演示使用CUIntArray

    打开主对话框资源IDD_ARRAY_DIALOG,添加一个按钮IDC_CUINTARRAY,标题为CUIntArray,双击该按钮,在OnCuintarray ()函数中添加如下代码:

    void CArrayDlg::OnCuintarray()
    {
    CUIntArray m_array;
    m_array.SetSize(5,5);
    m_array.SetAt(0,0);
    m_array.SetAt(1,1);
    m_array.SetAt(2,2);
    m_array.SetAt(3,3);
    m_array.SetAt(4,4);
    int count=m_array.GetSize();
    CClientDC dc(this);
    dc.SetBkMode(TRANSPARENT);
    TEXTMETRIC textMetric;
    dc.GetTextMetrics(&textMetric);
    int fontHeight=textMetric.tmHeight;
    int displayPos=10;
    for(int x=0;x<count;++x)
    {
    CString str;
    str.Format("%d",m_array.GetAt(x));
    dc.TextOut(10,displayPos,str);
    displayPos+=fontHeight;
    }
    }

    这部分代码不作说明,请读者自行分析。

    最后再说明一点:RemoveAtInsertAt函数操作时会使得数组元素移位,运行时间大于SetAtRemoveAllAdd函数。

    希望这篇文章能对您有所帮助。

    源文档 <http://www.vckbase.com/document/viewdoc/?id=1668>

分享到:
评论

相关推荐

    MFC数组类CArray

    MFC数组类CArray的使用的操作详解,

    MFC数组类CArray动态初始化列表控件实例

    定义MFC数组类CArray,在一个对话框的编辑框中输入数据按确定后在另一个对话框的列表控件中显示

    基于MFC的VC 数组类应用示例.rar

    基于MFC的VC 数组类应用示例,通过这个测试代码,你或许会对MFC数组类的使用有一个简单的理解,面向初学者的代码,值得参考。

    MFC的数组类CArray使用详解-赞

    MFC中的数组类CArray的使用详细解析 写的很具体 条理清晰 很赞的总结帖子

    一个使用MFC的VC++数组类代码

    内容索引:VC/C++源码,其它分类,数组,MFC 一个使用MFC的VC++数组类代码,大家都知道,MFC的数组类可以存放任何数据类型,C++的常规数组在使用前必须将其定义成能够容纳所有可能需要的元素,而MFC数组类创建的对象...

    MFC中动态数组CArray的使用

    CArray类支持与CArray相似的数组,但是必要时可以动态压缩并扩展。数组索引从0开始。可以决定是固定数组上界还是允许当添加元素时扩展当前的边界。内存对上界是连续地分配空间,甚至一些元素可为空。和CArray一样,...

    MFC(VC6.0)从txt文件导入二维数组并输出保存(源码)

    VC6.0源代码:基于MFC,采用COpenfileDlg,CStdioFile等类实现从txt文件读取二维数组(读取后可用于数据处理,本程序未加处理)。程序实现保存对话框,可将二维数组保存为txt文件。 PS:txt文件中数据用一位空格隔开...

    C++数组类简介

    C++的常规数组在使用前必须将其定义成能够容纳所有可能需要的元素,而MFC数组类创建的对象可以根据需要动态地增大或减小,数组的起始下标是0,而上限可以是固定的,也可以随着元素的增加而增加,数组在内存中的地址...

    MFC常用类、成员函数、数组类、Cstring类、CTime类、CPoint类

    主要是一些类及其函数的介绍,有利于大家对此类函数的使用,提高MFC的编程技能

    C++_MFC_类数组

    我们应该注意到,没有一个受过伦理教育的软件工程师会同意开发出“摧毁巴格达”的程序。然而基本的职业道德却可以要求他们开发出“摧毁城市”的程序,巴格达只是这个程序的一个参数。

    MFC通用类的使用.docx

    介绍MFC通用类的使用,包括数组类、列表类、字符串类、时间类和映射类等通用类,如CString、CStringArray等等

    MFC_class.rar_mfc class_mfc类

    文档中主要是一些MFC常用类、成员函数、数组类、Cstring类、CTime类、CPoint类,可以方便平时的使用

    VC 使用CStringArray类创建和使用字符串数组.rar

    VC 使用CStringArray类创建和使用字符串数组, m_array.InsertAt(m_pos,m_str);//在数组的指定位置插入字符串  m_list.ResetContent();//清空列表框  for(i=0;i m_list.AddString(m_array.GetAt(i));//按数组...

    C#实现 MFC的CString字节数组转换为C#的String

    C#实现 MFC的CString字节数组转换为C#的String 由于项目需要兼容老的MFC软件所保存的文档,而这些文档中又包含了CString数据,所以研究了一下CString保存结构,写了这个类。

    MFC扩展位图按钮类

    MFC的CBitmapButton的扩展类,实现了: 按钮正常、按下、弹起、禁用等不同状态图片切换; 鼠标经过按钮时按钮状态图片的改变; 鼠标指针在按钮上时形状的改变; 异形按钮,利用按钮自绘实现了特殊形状按钮; 按钮...

    简易图书馆管理系统

    实现读者与图书信息的增加,借书,还书及查看书籍情况

    MFC教程.zip

    1.5 怎样使用MFC创建一个窗口类 11 1.5.1 使用AfxRegisterWndClass () 函数注册一个窗口类 11 1.5.2 使用AfxRegisterClass ()函数 创建一个窗口类 12 1.6 怎样销毁一个MFC窗口类 14 1.7 厂商安装的窗口类 14 1.8 ...

    (MFC)SerialPort类实现串口发送16进制数字

    很简单实用的16进制串口通信demo,还带非常实用的虚拟串口和串口监视工具

    C++MFC编程实例

    1.5 怎样使用MFC创建一个窗口类 11 1.5.1 使用AfxRegisterWndClass () 函数注册一个窗口类 11 1.5.2 使用AfxRegisterClass ()函数 创建一个窗口类 12 1.6 怎样销毁一个MFC窗口类 14 1.7 厂商安装的窗口类 14 1.8 ...

    visual c++6.0MFC类库参考手册

    MFC库按照应用功能划分为根类,MFC应用结构类,窗口、对话和控件类,绘画和打印类,简单的数据类型类,数组、列表和映射类,文件和数据库类,Internet和网络类,OLE类,调试和异常类等类。而其中的每一分类都是应用...

Global site tag (gtag.js) - Google Analytics