第十章 MFC通用类.docx

上传人:b****5 文档编号:4214781 上传时间:2022-11-28 格式:DOCX 页数:29 大小:71.19KB
下载 相关 举报
第十章 MFC通用类.docx_第1页
第1页 / 共29页
第十章 MFC通用类.docx_第2页
第2页 / 共29页
第十章 MFC通用类.docx_第3页
第3页 / 共29页
第十章 MFC通用类.docx_第4页
第4页 / 共29页
第十章 MFC通用类.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

第十章 MFC通用类.docx

《第十章 MFC通用类.docx》由会员分享,可在线阅读,更多相关《第十章 MFC通用类.docx(29页珍藏版)》请在冰豆网上搜索。

第十章 MFC通用类.docx

第十章MFC通用类

第十章MFC通用类

MFC不仅提供了大量的用于编写图形用户界面的类,它也包含了许多通用类用于处理字符串、列表、数组、日期和时间,有了这些通用类,编写程序时就可以避免使用复杂的数据结构。

例如,由于MFC的数组类能够自动的改变大小,我们在不知道数组维数的情况下就不必使用一个大数组,这样就可以节约内存,提高程序的运行速度。

本章主要涉及以下内容:

数组类

列表类

映射类

字符串类

日期和时间类

第一节数组类

MFC的数组类使你可以创建和操作一个实际上可以处理各种数据类型的一维数组对象。

除了MFC可以在运行时动态的增大和缩小数组对象外,这些数组对象非常象常规的数组。

这也意味者在声明数组对象时不必关心它的维数。

由于MFC可以动态的变大和变小,你不必考虑使用常规数组时出现的内存浪费。

使用常规数组时你必须将其定义成能够容纳所有可能需要的元素,而不管这些元素是否真的被会使用。

MFC的数组类包含CByteArray、CDWordArray、CPtrArray、CUIntArray、CWordArray和CStringArray.。

从这些类的名称可以看出,每一个类都被设计成能够处理一个特定的数据类型。

例如,在本节例子中将要用到的CUIntArray类是一个处理无符号整形数的数组类,而CObjecArray类代表对象数组类。

这些数组类几乎相同,仅仅的区别在于它们储存的数据类型不同。

如果你学会使用其中的一种数组类的使用,你就学会了所有数组类的使用。

数组类有下列成员函数:

Add()

在数组的最后追加一个元素,可以根据需要增大数组大小。

ElementAt()

获得一个指向数组元素的指针

FreeExtra()

释放不用的数组内存

GetAt()

获取数组内指定位置处的值

GetSize()

获取数组中包含的元素个数

GetUpperBound()

获取数组的上界值。

InsertAt()

在数组的指定位置处插入一个元素,后面的元素的下标加1。

RemoveAll()

删除数组中所有的元素。

SetAt()

设定数组指定位置处的值。

因为制革函数不会增加数组的大小,故这个下标此时一定要有效。

SetAtGrow()

设定数组的指定位置处的值,可以根据需要增大数组的大小。

SetSize()

设置数组的初始大小。

下面将介绍一个数组的程序,这个程序可以让你测试一下MFC的数组类。

首先,这个程序在View类中声明一个数组对象,如下:

CUIntArrayarray;

接着,在View类的构造函数中初始化数组,将其设置成包含十个元素,

array.SetSize(10,5);

SetSize()函数有两个参数,第一个参数是数组的初始大小,第二个参数是数组元素每次增加时增加的个数。

在设置完数组的大小之后,程序等待用户在窗口中单击鼠标左键或右键。

如果用户这样做了,程序将显示一个合适的对话框并且处理输入到对话框中的数据。

下面的代码是该程序的OnLButtonDown()函数,用于处理用户单击右键的事件。

voidCArrayView:

:

OnLButtonDown(UINTnFlags,CPointpoint)

{

CArrayAddDlgdialog(this);

dialog.m_index=0;

dialog.m_value=0;

dialog.m_radio=0;

intresult=dialog.DoModal();

if(result==IDOK)

{

if(dialog.m_radio==0)

array.SetAtGrow(dialog.m_index,dialog.m_value);

elseif(dialog.m_radio==1)

array.InsertAt(dialog.m_index,dialog.m_value,1);

else

array.Add(dialog.m_value);

Invalidate();

}

CView:

:

OnLButtonDown(nFlags,point);

}

这段代码开始先创建一个对话框对象并初始化。

如果用户选择对话框的“确定”按钮,OnLButton()函数将检查对话框的成员变量m_radio。

值为0表示第一个单选按钮(设置)被选中,值为1表示第二个单选按钮(插入)被选中,值为2表示第三个单选按钮(添加)被选中。

如果用户希望设置数组的元素,程序将调用SetAtGrow()函数,它需要两个参数,一个是数组元素的下标值,另一个是希望设置的值。

它不象常规的SetAt()函数,用户必须使用当前有效的数组下标值。

SetAtGrow()为了设置指定位置处的值将根据需要增大数组的大小。

当用户选择了“插入”单选按钮,程序将调用InsertAt()函数,它需要两个参数,一个是要插入的数组元素的下标,另一个是该数组元素的值。

这将在指定位置处创建一个新的数组元素,并将把后面的元素往后推。

最后当用户选择了“添加”按钮,程序将调用Add()函数,这将在数组的后面添加一个元素。

对Invalidate()的调用将使程序重新显示数据。

下面的OnDraw()函数读取并显示数组。

voidCArrayView:

:

OnDraw(CDC*pDC)

{

CArrayDoc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

//Getthecurrentfont'sheight.

TEXTMETRICtextMetric;

pDC->GetTextMetrics(&textMetric);

intfontHeight=textMetric.tmHeight;

//Getthesizeofthearray.

intcount=array.GetSize();

intdisplayPos=10;

//Displaythearraydata.

for(intx=0;x

{

UINTvalue=array.GetAt(x);

chars[81];

wsprintf(s,"Element%dcontainsthevalue%u.",x,value);

pDC->TextOut(10,displayPos,s);

displayPos+=fontHeight;

}

}

这里,程序首先获得当前字体的高度,然后程序通过调用GetSize()函数获得数组元素的个数。

最后,使用数组元素的个数控制一个for循环,调用GetAt()函数获得当前下标处的数组元素的值。

为了显示程序将数组元素的值转化成字符串。

程序的OnRButtonDown()函数用来响应用户按下鼠标右键的事件,此函数用来处理删除数组元素的任务。

下面是该函数的代码:

voidCArrayView:

:

OnRButtonDown(UINTnFlags,CPointpoint)

{

//TODO:

Addyourmessagehandlercodehereand/orcalldefault

CArrayRemoveDlgdialog(this);

dialog.m_radio=1;

dialog.m_index=0;

intresult=dialog.DoModal();

if(result==IDOK)

{

if(dialog.m_radio==0)

array.RemoveAll();

else

array.RemoveAt(dialog.m_index);

Invalidate();

}

CView:

:

OnRButtonDown(nFlags,point);

}

在这个函数中,当显示完对话框后,程序检查对话框的成员变量m_removeAll。

如果这个值为真意味着用户希望删除数组中所有的元素。

这种情况下,程序调用数组类的成员函数RemoveAll()。

否则,程序将调用RemoveAt()删除指定位置处的数组元素。

最后调用Invalidate()函数刷新数据显示。

下面将介绍对话框类CArrayAddDlg,按照下面的步骤创建这个对话框类。

1.创建如图10.1所示的对话框,3个单选按钮的ID分别为IDC_ADD0,IDC_ADD1,IDC_ADD2。

图10.1添加元素对话框

2.在ClassWizard中为两个文本框映射两个UINT类型的变量m_index,m_value。

3.给该对话框添加一个UINT类型的成员变量m_radio。

4.为WM_INITDIALOG添加函数OnInitDialog(),在其中设置单选按钮的初始状态。

BOOLCArrayAddDlg:

:

OnInitDialog()

{

CDialog:

:

OnInitDialog();

//TODO:

Addextrainitializationhere

((CButton*)GetDlgItem(IDC_ADD0))->SetCheck

(1);

returnTRUE;//returnTRUEunlessyousetthefocustoacontrol

//EXCEPTION:

OCXPropertyPagesshouldreturnFALSE

}

5.添加三个函数用以响应用户单击单选按钮。

voidCArrayAddDlg:

:

OnAdd0()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

GetDlgItem(IDC_INDEX)->EnableWindow(true);

}

voidCArrayAddDlg:

:

OnAdd1()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

GetDlgItem(IDC_INDEX)->EnableWindow(true);

}

voidCArrayAddDlg:

:

OnAdd2()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

GetDlgItem(IDC_INDEX)->EnableWindow(false);

}

为了确定用户选择了哪一个单选按钮,重载CDialog:

:

OnOK()。

voidCArrayAddDlg:

:

OnOK()

{

//TODO:

Addextravalidationhere

UINTnRadio=GetCheckedRadioButton(IDC_ADD0,IDC_ADD2);

switch(nRadio)

{

caseIDC_ADD0:

m_radio=0;

break;

caseIDC_ADD1:

m_radio=1;

break;

caseIDC_ADD2:

m_radio=2;

break;

default:

break;

}

CDialog:

:

OnOK();

}

按照下面的步骤创建另一个对话框类CRemoveDlg。

1.创建如图10.2所示的对话框,两个单选按钮的ID分别是IDC_REMOVE0和IDC_REMOVE1。

图10.2删除数组元素对话框

2.在ClassWizard中为文本框映射一个UINT类型的变量m_index。

3.给该对话框添加一个UINT类型的成员变量m_radio。

4.为WM_INITDIALOG添加函数OnInitDialog(),在其中设置单选按钮的初始状态。

BOOLCArrayRemoveDlg:

:

OnInitDialog()

{

CDialog:

:

OnInitDialog();

//TODO:

Addextrainitializationhere

((CButton*)GetDlgItem(IDC_REMOVE1))->SetCheck

(1);

returnTRUE;//returnTRUEunlessyousetthefocustoacontrol

//EXCEPTION:

OCXPropertyPagesshouldreturnFALSE

}

5.添加两个函数用以响应用户单击单选按钮。

voidCArrayRemoveDlg:

:

OnRemove0()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

GetDlgItem(IDC_INDEX)->EnableWindow(false);

}

voidCArrayRemoveDlg:

:

OnRemove1()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

GetDlgItem(IDC_INDEX)->EnableWindow(true);

}

6.为了确定用户选择了哪一个单选按钮,重载CDialog:

:

OnOK()。

voidCArrayRemoveDlg:

:

OnOK()

{

//TODO:

Addextravalidationhere

UINTnRadio=GetCheckedRadioButton(IDC_REMOVE0,IDC_REMOVE1);

switch(nRadio)

{

caseIDC_REMOVE0:

m_radio=0;

break;

caseIDC_REMOVE1:

m_radio=1;

break;

default:

break;

}

CDialog:

:

OnOK();

}

现在编译并运行这个程序,首先在窗口中显示一个有十个元素的数组,如图10.3所示。

单击左键弹出如图10.1所示的对话框,你可以选择三种数组操作:

设置、插入和添加。

单击右键弹出如图10.2所示的对话框,你可以选择两种删除操作:

删除全部元素和删除指定元素。

Element0containsthevalue0.

Element1containsthevalue0.

Element2containsthevalue0.

Element3containsthevalue0.

Element4containsthevalue0.

Element5containsthevalue0.

Element6containsthevalue0.

Element7containsthevalue0.

Element8containsthevalue0.

Flemenf9cnnfainstheValne0.

图10.3程序运行初始窗口

第二节列表类

列表类象是有特殊功能的数组。

列表的元素被称为节点。

列表使用指针来连结它的节点。

如果你希望快速的插入和删除数组元素,列表类是一个比较好的选择。

但是在列表中查找一个元素要比在数组中慢,因为列表需要按照指针顺序从一个节点到另外一个节点。

通常我们称列表中第一个节点为列表的头,列表中最后一个节点是列表的尾。

列表类有以下成员函数:

Clist()

Clist类的构造函数,其中的参数指定分配内存的基本单元。

GetHead()

获得列表的第一个元素的值。

GetTail()

获得列表的最后一个元素的值。

RemoveHead()

删除列表中第一个元素

RemoveTail()

删除列表中最后一个元素。

AddHead()

在列表的头部添加一个节点,使这个节点成为列表的新的头。

AddTail()

在列表的尾部添加一个节点,使这个节点成为列表的新的尾。

RemoveAll()

删除节点中所有的元素。

GetHeadPosition()

获得列表的头节点的位置。

GetTailPosition()

获得列表中尾节点的位置。

GetNext()

获得指定位置下一个节点处的值。

GetPrev()

获得指定位置上一个节点处的值。

GetAt()

获得指定位置处节点的值。

SetAt()

设置指定位置处节点的值。

RemoveAt()

删除指定位置处的节点。

InsertBefore()

在指定位置的前面插入一个节点。

InsertAfter()

在指定位置的后面插入一个节点。

Find()

按照列表顺序搜索给定的对象指针,返回一个POSITION类型的量。

FindIndex()

按照列表顺序搜索指定的下标。

GetCount()

获得列表中包含的节点个数。

IsEmpty()

检查一个列表是否不含有任何节点。

下面的程序将允许用户添加和删除节点,按照以下步骤进行:

1.使用MFCAppWizard创建一个单文档应用程序List。

2.添加一个对话框类CAddStudentDlg,其对应的对话框如图10.4所示。

图10.4添加节点对话框

3.为两个文本框映射两个变量m_name,m_score。

4.添加一个对话框类CRemoveStudentDlg,其对应的对话框如图10.5所示。

两个单选按钮的ID为IDC_REMOVE0和IDC_REMOVE1。

图10.5删除节点对话框

5.为对话框类添加一个UINT类型的成员变量m_radio。

6.在OnInitDialog()函数中设置单选按钮的初始状态。

BOOLCRemoveStudentDlg:

:

OnInitDialog()

{

CDialog:

:

OnInitDialog();

//TODO:

Addextrainitializationhere

((CButton*)GetDlgItem(IDC_REMOVE0))->SetCheck

(1);

returnTRUE;//returnTRUEunlessyousetthefocustoacontrol

//EXCEPTION:

OCXPropertyPagesshouldreturnFALSE

}

7.为了知道用户选择了哪一个单选按钮,在OnOk()函数中添加下面的代码。

voidCRemoveStudentDlg:

:

OnOK()

{

//TODO:

Addextravalidationhere

UINTnRadio=GetCheckedRadioButton(IDC_REMOVE0,IDC_REMOVE1);

switch(nRadio)

{

caseIDC_REMOVE0:

m_radio=0;

break;

caseIDC_REMOVE1:

m_radio=1;

break;

default:

break;

}

CDialog:

:

OnOK();

}

8.在ListView.h中CListView类的声明之前添加如下代码,用来定义一个结构体CStudent,包含两个变量m_name和m_score,分别用于存放学生的姓名和成绩。

structCStudent

{

CStringm_name;

intm_score;

};

9.为ClistView添加一个类型为CptrList的成员变量m_list。

10.在ListView.cpp中添加下列语句:

#include"AddStudentDlg.h"

#include"RemoveStudentDlg.h"

11.当用户单击左键后,弹出如图10.4所示的对话框,可以添加一个节点。

对应的OnLButtonDown()函数代码如下:

voidCMyListView:

:

OnLButtonDown(UINTnFlags,CPointpoint)

{

//TODO:

Addyourmessagehandlercodehereand/orcalldefault

CAddStudentDlgdialog;

dialog.m_name="";

dialog.m_score=0;

//Displaythedialogbox.

intresult=dialog.DoModal();

if(result==IDOK)

{

//Createandinitializethenewnode.

CStudent*m_pStudent=newCStudent;

m_pStudent->m_name=dialog.m_name;

m_pStudent->m_score=dialog.m_score;

//Addthenodetothelist.

m_list.AddTail(m_pStudent);

//Repaintthewindow.

Invalidate();

}

CView:

:

OnLButtonDown(nFlags,point);

}

12.当用户单击右键后,弹出如图10.5所示的对话框,可以删除一个节点。

对应的OnRButtonDown()函数代码如下:

voidCMyListView:

:

OnRButtonDown(UINTnFlags,CPointpoint)

{

//TODO:

Addyourmessagehandlercodehereand/orcalldefault

CRemoveStudentDlgdialog;

dialog.m_radio=0;

//Displaythedialogbox.

intresult=dialog.DoModal();

//IftheuserclickedtheOKbutton...

if(result==IDOK)

{

CStudent*m_pStudent=newCStudent;

//Makesurethelistisn'tempty.

if(m_list.IsEmpty())

MessageBox("节点已经全部删除!

");

else

{

//Removethespecifiednode.

if(dialog.m_radio==0)

m_pStudent=(CStudent*)m_list.RemoveHead();

else

m_pStudent=(CStudent*)m_list.RemoveTail();

//Deletethenodeobjectandrepaintthewindow.

deletem_pStudent;

Invalidate();

}

}

CView:

:

OnRButtonDown(nFlags,point);

}

13.最后设置OnDraw()函数用来响应Invalidate()。

voidCMyListView:

:

OnDraw(CDC*pDC)

{

CListDoc*pDoc=GetDocument();

ASSERT_VALID(pDoc);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1