ImageVerifierCode 换一换
格式:DOCX , 页数:29 ,大小:71.19KB ,
资源ID:4214781      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4214781.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第十章 MFC通用类.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第十章 MFC通用类.docx

1、第十章 MFC通用类第十章 MFC通用类MFC不仅提供了大量的用于编写图形用户界面的类,它也包含了许多通用类用于处理字符串、列表、数组、日期和时间,有了这些通用类,编写程序时就可以避免使用复杂的数据结构。例如,由于MFC的数组类能够自动的改变大小,我们在不知道数组维数的情况下就不必使用一个大数组,这样就可以节约内存,提高程序的运行速度。 本章主要涉及以下内容:数组类列表类映射类字符串类日期和时间类第一节 数组类MFC的数组类使你可以创建和操作一个实际上可以处理各种数据类型的一维数组对象。除了MFC可以在运行时动态的增大和缩小数组对象外,这些数组对象非常象常规的数组。这也意味者在声明数组对象时不

2、必关心它的维数。由于MFC可以动态的变大和变小,你不必考虑使用常规数组时出现的内存浪费。使用常规数组时你必须将其定义成能够容纳所有可能需要的元素,而不管这些元素是否真的被会使用。MFC的数组类包含CByteArray、CDWordArray、CPtrArray、CUIntArray、CWordArray和CStringArray.。从这些类的名称可以看出,每一个类都被设计成能够处理一个特定的数据类型。例如,在本节例子中将要用到的CUIntArray类是一个处理无符号整形数的数组类,而CObjecArray类代表对象数组类。这些数组类几乎相同,仅仅的区别在于它们储存的数据类型不同。如果你学会使用

3、其中的一种数组类的使用,你就学会了所有数组类的使用。 数组类有下列成员函数:Add()在数组的最后追加一个元素,可以根据需要增大数组大小。ElementAt()获得一个指向数组元素的指针FreeExtra()释放不用的数组内存GetAt()获取数组内指定位置处的值GetSize()获取数组中包含的元素个数GetUpperBound()获取数组的上界值。InsertAt()在数组的指定位置处插入一个元素,后面的元素的下标加1。RemoveAll()删除数组中所有的元素。SetAt()设定数组指定位置处的值。因为制革函数不会增加数组的大小,故这个下标此时一定要有效。SetAtGrow()设定数组的

4、指定位置处的值,可以根据需要增大数组的大小。SetSize()设置数组的初始大小。下面将介绍一个数组的程序,这个程序可以让你测试一下MFC的数组类。首先,这个程序在View类中声明一个数组对象,如下:CUIntArray array;接着,在View类的构造函数中初始化数组,将其设置成包含十个元素,array.SetSize(10, 5);SetSize()函数有两个参数,第一个参数是数组的初始大小,第二个参数是数组元素每次增加时增加的个数。在设置完数组的大小之后,程序等待用户在窗口中单击鼠标左键或右键。如果用户这样做了,程序将显示一个合适的对话框并且处理输入到对话框中的数据。下面的代码是该程

5、序的OnLButtonDown()函数,用于处理用户单击右键的事件。void CArrayView:OnLButtonDown(UINT nFlags, CPoint point)CArrayAddDlg dialog(this);dialog.m_index = 0;dialog.m_value = 0;dialog.m_radio = 0;int result = dialog.DoModal();if (result = IDOK)if (dialog.m_radio = 0)array.SetAtGrow(dialog.m_index, dialog.m_value);else if

6、(dialog.m_radio = 1)array.InsertAt(dialog.m_index, dialog.m_value, 1);elsearray.Add(dialog.m_value);Invalidate();CView:OnLButtonDown(nFlags, point);这段代码开始先创建一个对话框对象并初始化。如果用户选择对话框的“确定”按钮,OnLButton()函数将检查对话框的成员变量m_radio。值为0表示第一个单选按钮(设置)被选中,值为1表示第二个单选按钮(插入)被选中,值为2表示第三个单选按钮(添加)被选中。如果用户希望设置数组的元素,程序将调用Set

7、AtGrow()函数,它需要两个参数,一个是数组元素的下标值,另一个是希望设置的值。它不象常规的SetAt()函数,用户必须使用当前有效的数组下标值。SetAtGrow()为了设置指定位置处的值将根据需要增大数组的大小。当用户选择了“插入”单选按钮,程序将调用InsertAt()函数,它需要两个参数,一个是要插入的数组元素的下标,另一个是该数组元素的值。这将在指定位置处创建一个新的数组元素,并将把后面的元素往后推。最后当用户选择了“添加”按钮,程序将调用Add()函数,这将在数组的后面添加一个元素。对Invalidate()的调用将使程序重新显示数据。下面的OnDraw()函数读取并显示数组。

8、void CArrayView:OnDraw(CDC* pDC)CArrayDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ Get the current fonts height.TEXTMETRIC textMetric;pDC-GetTextMetrics(&textMetric);int fontHeight = textMetric.tmHeight;/ Get the size of the array.int count = array.GetSize();int displayPos = 10;/ Display the array

9、 data.for (int x=0; xTextOut(10, displayPos, s);displayPos += fontHeight;这里,程序首先获得当前字体的高度,然后程序通过调用GetSize()函数获得数组元素的个数。最后,使用数组元素的个数控制一个for循环,调用GetAt()函数获得当前下标处的数组元素的值。为了显示程序将数组元素的值转化成字符串。程序的OnRButtonDown()函数用来响应用户按下鼠标右键的事件,此函数用来处理删除数组元素的任务。下面是该函数的代码:void CArrayView:OnRButtonDown(UINT nFlags, CPoint

10、point)/ TODO: Add your message handler code here and/or call defaultCArrayRemoveDlg dialog(this);dialog.m_radio= 1;dialog.m_index= 0;int result = dialog.DoModal();if (result = IDOK)if (dialog.m_radio=0)array.RemoveAll();elsearray.RemoveAt(dialog.m_index);Invalidate();CView:OnRButtonDown(nFlags, poin

11、t);在这个函数中,当显示完对话框后,程序检查对话框的成员变量m_removeAll。如果这个值为真意味着用户希望删除数组中所有的元素。这种情况下,程序调用数组类的成员函数RemoveAll()。否则,程序将调用RemoveAt()删除指定位置处的数组元素。最后调用Invalidate()函数刷新数据显示。下面将介绍对话框类CArrayAddDlg,按照下面的步骤创建这个对话框类。1. 创建如图10.1所示的对话框,3个单选按钮的ID分别为IDC_ADD0,IDC_ADD1,IDC_ADD2。 图10. 1 添加元素对话框2. 在ClassWizard中为两个文本框映射两个UINT类型的变量m

12、_index,m_value。3. 给该对话框添加一个UINT类型的成员变量m_radio。4. 为WM_INITDIALOG添加函数OnInitDialog(),在其中设置单选按钮的初始状态。BOOL CArrayAddDlg:OnInitDialog()CDialog:OnInitDialog();/ TODO: Add extra initialization here(CButton*)GetDlgItem(IDC_ADD0)-SetCheck(1);return TRUE; / return TRUE unless you set the focus to a control/ EX

13、CEPTION: OCX Property Pages should return FALSE5. 添加三个函数用以响应用户单击单选按钮。void CArrayAddDlg:OnAdd0()/ TODO: Add your control notification handler code hereGetDlgItem(IDC_INDEX)-EnableWindow(true);void CArrayAddDlg:OnAdd1()/ TODO: Add your control notification handler code hereGetDlgItem(IDC_INDEX)-Enable

14、Window(true);void CArrayAddDlg:OnAdd2()/ TODO: Add your control notification handler code hereGetDlgItem(IDC_INDEX)-EnableWindow(false);为了确定用户选择了哪一个单选按钮,重载CDialog:OnOK()。void CArrayAddDlg:OnOK()/ TODO: Add extra validation hereUINT nRadio=GetCheckedRadioButton(IDC_ADD0,IDC_ADD2);switch(nRadio)case I

15、DC_ADD0:m_radio=0;break;case IDC_ADD1:m_radio=1;break;case IDC_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

16、添加函数OnInitDialog(),在其中设置单选按钮的初始状态。BOOL CArrayRemoveDlg:OnInitDialog()CDialog:OnInitDialog();/ TODO: Add extra initialization here(CButton*)GetDlgItem(IDC_REMOVE1)-SetCheck(1);return TRUE; / return TRUE unless you set the focus to a control/ EXCEPTION: OCX Property Pages should return FALSE5添加两个函数用以响

17、应用户单击单选按钮。void CArrayRemoveDlg:OnRemove0()/ TODO: Add your control notification handler code hereGetDlgItem(IDC_INDEX)-EnableWindow(false);void CArrayRemoveDlg:OnRemove1()/ TODO: Add your control notification handler code hereGetDlgItem(IDC_INDEX)-EnableWindow(true);6. 为了确定用户选择了哪一个单选按钮,重载CDialog:OnO

18、K()。void CArrayRemoveDlg:OnOK()/ TODO: Add extra validation hereUINT nRadio=GetCheckedRadioButton(IDC_REMOVE0,IDC_REMOVE1);switch(nRadio)case IDC_REMOVE0:m_radio=0;break;case IDC_REMOVE1:m_radio=1;break;default:break;CDialog:OnOK();现在编译并运行这个程序,首先在窗口中显示一个有十个元素的数组,如图10.3所示。单击左键弹出如图10.1所示的对话框,你可以选择三种数组

19、操作:设置、插入和添加。单击右键弹出如图10.2所示的对话框,你可以选择两种删除操作:删除全部元素和删除指定元素。Element 0 contains the value 0.Element 1 contains the value 0.Element 2 contains the value 0.Element 3 contains the value 0.Element 4 contains the value 0.Element 5 contains the value 0.Element 6 contains the value 0.Element 7 contains the val

20、ue 0.Element 8 contains the value 0.Flemenf 9 cnnfains the Valne 0.图10. 3 程序运行初始窗口第二节 列表类列表类象是有特殊功能的数组。列表的元素被称为节点。列表使用指针来连结它的节点。如果你希望快速的插入和删除数组元素,列表类是一个比较好的选择。但是在列表中查找一个元素要比在数组中慢,因为列表需要按照指针顺序从一个节点到另外一个节点。通常我们称列表中第一个节点为列表的头,列表中最后一个节点是列表的尾。列表类有以下成员函数:Clist()Clist类的构造函数,其中的参数指定分配内存的基本单元。GetHead( )获得列表的

21、第一个元素的值。GetTail( )获得列表的最后一个元素的值。RemoveHead( )删除列表中第一个元素RemoveTail( )删除列表中最后一个元素。AddHead()在列表的头部添加一个节点,使这个节点成为列表的新的头。AddTail()在列表的尾部添加一个节点,使这个节点成为列表的新的尾。RemoveAll()删除节点中所有的元素。GetHeadPosition( )获得列表的头节点的位置。GetTailPosition( )获得列表中尾节点的位置。GetNext()获得指定位置下一个节点处的值。GetPrev()获得指定位置上一个节点处的值。GetAt()获得指定位置处节点的值

22、。SetAt()设置指定位置处节点的值。RemoveAt()删除指定位置处的节点。InsertBefore()在指定位置的前面插入一个节点。InsertAfter()在指定位置的后面插入一个节点。Find()按照列表顺序搜索给定的对象指针,返回一个POSITION类型的量。FindIndex()按照列表顺序搜索指定的下标。GetCount()获得列表中包含的节点个数。IsEmpty()检查一个列表是否不含有任何节点。下面的程序将允许用户添加和删除节点,按照以下步骤进行:1. 使用MFC AppWizard创建一个单文档应用程序List。2. 添加一个对话框类CAddStudentDlg,其对应

23、的对话框如图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()函数中设置单选按钮的初始状态。BOOL CRemoveStudentDlg:OnInitDialog()CDialog:OnInitDialog();/ TODO: Add extra initia

24、lization here(CButton*)GetDlgItem(IDC_REMOVE0)-SetCheck(1);return TRUE; / return TRUE unless you set the focus to a control/ EXCEPTION: OCX Property Pages should return FALSE7. 为了知道用户选择了哪一个单选按钮,在OnOk()函数中添加下面的代码。void CRemoveStudentDlg:OnOK()/ TODO: Add extra validation hereUINT nRadio=GetCheckedRadi

25、oButton(IDC_REMOVE0,IDC_REMOVE1);switch(nRadio)case IDC_REMOVE0:m_radio=0;break;case IDC_REMOVE1:m_radio=1;break;default:break;CDialog:OnOK();8. 在ListView.h中CListView类的声明之前添加如下代码,用来定义一个结构体CStudent,包含两个变量m_name和m_score,分别用于存放学生的姓名和成绩。struct CStudentCString m_name;int m_score;9. 为ClistView添加一个类型为CptrL

26、ist的成员变量m_list。10. 在ListView.cpp中添加下列语句:#include AddStudentDlg.h#include RemoveStudentDlg.h11. 当用户单击左键后,弹出如图10.4所示的对话框,可以添加一个节点。对应的OnLButtonDown()函数代码如下:void CMyListView:OnLButtonDown(UINT nFlags, CPoint point)/ TODO: Add your message handler code here and/or call defaultCAddStudentDlg dialog;dialog

27、.m_name = ;dialog.m_score = 0 ;/ Display the dialog box.int result = dialog.DoModal();if (result = IDOK)/ Create and initialize the new node.CStudent* m_pStudent = new CStudent;m_pStudent-m_name = dialog.m_name;m_pStudent-m_score = dialog.m_score;/ Add the node to the list.m_list.AddTail(m_pStudent)

28、;/ Repaint the window.Invalidate();CView:OnLButtonDown(nFlags, point);12. 当用户单击右键后,弹出如图10.5所示的对话框,可以删除一个节点。对应的OnRButtonDown()函数代码如下:void CMyListView:OnRButtonDown(UINT nFlags, CPoint point)/ TODO: Add your message handler code here and/or call defaultCRemoveStudentDlg dialog;dialog.m_radio = 0;/ Dis

29、play the dialog box.int result = dialog.DoModal();/ If the user clicked the OK button.if (result = IDOK)CStudent* m_pStudent=new CStudent;/ Make sure the list isnt empty.if (m_list.IsEmpty()MessageBox(节点已经全部删除!);else/ Remove the specified node.if (dialog.m_radio = 0)m_pStudent = (CStudent*)m_list.RemoveHead();elsem_pStudent = (CStudent*)m_list.RemoveTail();/ Delete the node object and repaint the window.delete m_pStudent;Invalidate();CView:OnRButtonDown(nFlags, point);13. 最后设置OnDraw()函数用来响应Invalidate()。void CMyListView:OnDraw(CDC* pDC)CListDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);

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

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