《基于MFC的自助电话系统设计与实现毕业设计论文》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
毕业设计论文基于MFC的自助电话系统设计与实现III 毕业论文(设计)原创性声明本人所呈交的毕业论文(设计)是我在导师的指导下进行的研究工作及取得的研究成果。据我所知,除文中已经注明引用的内容外,本论文(设计)不包含其他个人已经发表或撰写过的研究成果。对本论文(设计)的研究做出重要贡献的个人和集体,均已在文中作了明确说明并表示谢意。作者签名:日期:毕业论文(设计)授权使用说明本论文(设计)作者完全了解**学院有关保留、使用毕业论文(设计)的规定,学校有权保留论文(设计)并向相关部门送交论文(设计)的电子版和纸质版。有权将论文(设计)用于非赢利目的的少量复制并允许论文(设计)进入学校图书馆被查阅。学校可以公布论文(设计)的全部或部分内容。保密的论文(设计)在解密后适用本规定。 作者签名:指导教师签名:日期:日期:III 注意事项1.设计(论文)的内容包括:1)封面(按教务处制定的标准封面格式制作)2)原创性声明3)中文摘要(300字左右)、关键词4)外文摘要、关键词5)目次页(附件不统一编入)6)论文主体部分:引言(或绪论)、正文、结论7)参考文献8)致谢9)附录(对论文支持必要时)2.论文字数要求:理工类设计(论文)正文字数不少于1万字(不包括图纸、程序清单等),文科类论文正文字数不少于1.2万字。3.附件包括:任务书、开题报告、外文译文、译文原文(复印件)。4.文字、图表要求:1)文字通顺,语言流畅,书写字迹工整,打印字体及大小符合要求,无错别字,不准请他人代写2)工程设计类题目的图纸,要求部分用尺规绘制,部分用计算机绘制,所有图纸应符合国家技术标准规范。图表整洁,布局合理,文字注释必须使用工程字书写,不准用徒手画3)毕业论文须用A4单面打印,论文50页以上的双面打印4)图表应绘制于无格子的页面上5)软件工程类课题应有程序清单,并提供电子文档5.装订顺序1)设计(论文)2)附件:按照任务书、开题报告、外文译文、译文原文(复印件)次序装订3)其它III 摘要MFC是各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法。MFC通过提供各种API接口让程序员可以轻松实现各种要求。自助电话系统是要求在软件平台上实现包括用户登录、电话呼出、电话呼入、通信录的查询、添加、修改、删除等功能的一个系统。本文主要对MFC及C++进行了简单的介绍,然后在Visualstudio2008平台将自助电话系统的基本功能都进行了实现,然后对整体程序的正确性进行了验证,给出了对该系统的改进的期望。关键词:MFC、C++、自助电话III ABSTRACTMFCisavarietyofclassescombinetoconstituteanapplicationframework,anditspurposeistoletprogrammersuptoestablishonthisbasistheapplicationunderWindows.MFCisamoresimplemethodthanrelativelySDK.MFCoffersavarietyofAPIinterface,sothatprogrammerscaneasilyimplementthevariousrequirements.Self-servicephonesystemsoftwareplatform,includinguserlogin,phoneoutgoingandincomingphonecalls,addressbookquery,add,modify,deletefunctionssuchasasystem.Inthispaper,asimpleintroductiontotheMFCandC++,Visualstudio2008platformwillbethebasicfunctionsoftheself-servicetelephonesystemtoachieve,andthenverifiedthecorrectnessoftheoverallprocess,giventheimprovementofthesystem.KEYWORDS:MFC、C++、Self-servicephonesystemIII 基于MFC的自助电话系统设计与实现目录摘要IABSTRACTII目录III第一章绪论11.1引言11.2平台的选择11.3本文工作1第二章MFC的基本知识介绍32.1MFC简单概述32.2对话框的体系42.3MFC的类层次和消息机制62.4重要的数据结构9第三章程序的主体框架和功能介绍163.1程序的主体框架163.2程序功能的实现17第四章软件测试214.1系统测试环境介绍214.2系统功能测试21第五章总结244.1论文的主要工作244.2工作中的不足及展望24参考文献25致谢26毕业设计小结27III 基于MFC的自助电话系统设计与实现第一章绪论1.1引言随着手机设备和计算机硬件的高速发展,在PC平台上实现一种手机的自助界面已经非常广泛了,现在比较流行的是在android平台上进行实现。在android平台上实现界面可能比较的美观和可行性更好,但是在MFC进行自助电话的实现也是一种可以实现的方法,既可以对MFC编程有一个深层次的了解,又可以对自己的自学能力和遇到问题解决问题的能力得到锻炼。1.2平台的选择在windows环境下,目前比较流行的可视化开发工具主要有[1]:VisualC++、VisualBasic、C++builder、Delphi、PowerBuilder及Jbuilder等,而本软件采用MicrosoftVisual2008作为开发工具,并使用MFCApplicationFramewor作为本软件的基本架构。采用C++来进行编程的主要原因是:与Java和C#等现代编程语言相比,C++在程序运行的小路和内存使用的可控性和编程的灵活性上具有优势。C++代码被编译成汇编语言可以在处理器上直接运行,效率比较高,而Java被编译成字节码,C#则被编译成中间语言,都是不能在处理器执行的,必须经过Java虚拟机或是.NET通用语言运行。因此效率比较低,因此采用C++进行编程比较合适。C++中大量使用指针,使得编程的灵活性很高,这虽然增加了程序出错的可能行,但是便于程序员施展编程技巧提高程序的效率。Java完全取消了指针,C#极大的限制了指针的使用,这都限制了程序员施展技巧。因此,使用C++进行界面的设计具有更大的灵活性[2]。而在以C++为核心语言的可视化编程工具中,MicrosoftVisual2008以其自身许多优异的特性而获得了最广泛的应用。鉴于以上原因,本设计使用MicrosoftVisual2008作为软件的开发平台。1.3本文工作本文的主要目的是在MFC平台上实现现在手机上界面的基本的功能。47 基于MFC的自助电话系统设计与实现包括手机账号密码的登录、登录以后电话的拨号、电话的接听、通信录的添加、保存、查找和删除等功能。论文共分为6个部分:第一章绪论部分,整体实现的自助电话界面的大概介绍。第二章MFC的基本知识介绍。第三章程序的主体框架和功能介绍第四章软件的测试第五章总结,对本次设计进行总结和展望参考文献47 基于MFC的自助电话系统设计与实现第一章MFC的基本知识介绍2.1MFC简单概述MFC也是一个window程序,那么它应该也会有一个Winmain()函数的[3-5],当然winmain()函数是存在的,但是打开MFC你会发现找不到winmain()函数。那是因为MFC将winmain()函数封装在其一个类中了。MFC包含两个最重要的类:CWinApp和CFrameWnd。CWinApp代表着程序的本体,winmain函数就是封装在其中,所以函数将从这个类中开始运行;CFrameWnd代表了一个主框窗口;在编写函数的时候你需要以这两个类为基础进行派生自己的类,并改写其一些成员函数以实现自己的程序的功能。一个骨干的MFC程序是必须包含下面这些MFC类:表2-1MFC类MFC类名称我的类名称功能CWinAppCScribbleAppApplicationobjectCMDIFrameWndCMianFrameMDI主窗口CMultiSDocTemplate直接使用管理Document/ViewCDocumentCScribbleDocDocument,负责管理数据接口和文件操作CViewCScribbleViewView,负责数据的显示和打印CMDIChildWndCChildFrameMDI子窗口CToolBar直接使用工具栏CStatus直接使用状态栏CDialogCAbotDlgAbout对话框2.1.1MFC是一个编程框架MFC(MicrosoftFoundationClassLibrary)[6-8]中的各种类结合起来构成了一个应用程序框架,它的目的就是让程序员在此基础上来建立Windows下的应用程序,这是一种相对SDK来说更为简单的方法。因为总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。MicrosoftVisualC++提供了相应的工具来完成这个工作:APP47 基于MFC的自助电话系统设计与实现Wizard可以用来生成初步的框架文件(代码和资源等);资源编辑辑器用于帮助直观的设计用户接口;Classwizard用来协助添加代码到框架文件;最后,编译,则通过类库实现了应用程序特定的逻辑。2.1.2封装构成MFC枢架的是MFC类库。MFC类库是C++类库。这些类或者封装了Win32应用程序编程接口,或者封装了应用程序的概念,或者封装了OLE特性,或者封装了ODBC和DAO数据访问的功能。2.1.3继承首先,MF抽象出众多类的共同特性,设计出一些基类作为实现其他类的基础。这些类中,最重要的类是CObject和CCmdTarget。CObjeet是MFC的根类,绝大多数MFC类是其派生的,包括CCmdTarget。CObject实现了一些重要的特性,包括动态类信息、动态创建、对象序列化、对程序调试的支持,等等。所有从CObjeet派生的类都将具备或者可以具备CObjeet所拥有的特性。CCmdTarget通过封装一些属性和方法,提供了消息处理的架构。MFC中,任何可以处理消息的类都从CCmdTarget派生。2.1.4虚拟函数和动态约束[9-10]MFC以“C++”为基础,自然支持虚拟函数和动态约束。但是作为一个编程框架,有一个问题必须解决:如果仅仅通过虚拟函数来支持动态约束,必然导致虚拟函数来支持动态约束,必然导致虚拟函数过于臃肿,消耗内存,效率低下。例如CWnd封装了Windows窗口对象时,每一条条Windows消息又对应一个成员函数,这些成员函数为派生类所继承。如果这些函数都设计成虚拟函数,由于数量太多,实现起来不现实。于是,MFC建立了消息映射机制,以一种富有效率、便于使用的手段解决消息处理函数的动态约束问题。这样,通过虚拟函数和消息映射,MFC类提供了丰富的编程接口。程序员继承基类的同时,把自己实现的虚拟函数和消息处理函数嵌入MFC的编程框架。MFC编程框架将在适当的时候、适当的地方来调用程序的代码。本文将充分的展示MFC调用虚拟函数和消息处理函数的内幕,可以对MFC的编程接口有清晰的理解。2.2对话框的体系对话框是一种次要窗口,包含按钮和各种选项,通过它们可以完成特定命令或任务。查找和替换对话框对话框与窗口有区别,它没有最大化按钮、没有最小化按钮、大都不能改变形状大小。(“打开文件”对话框是可以改变大小的)对话框:是人机交流的一种方式,用户对对话框进行设置,计算机就会执行相应的命令。对话框中有单选框、复选框等。对话框有两种不同的类型:模式对话框、无模式对话框。47 基于MFC的自助电话系统设计与实现1.模式对话框一个模式对话框是一个有系统菜单、标题栏、边线等的弹出式窗口。在创建对话框时指定WS_POPUP,WS_SYSMENU,WS_CAPTION和DS_MODALFRAME风格。即使没有指定WS_VISIBLE风格,模式对话框也会被显示。创建对话框窗口时,将发送WM_INITDIALOG消息(如果指定对话框的DS_SETFONT风格,还有WM_SETFONT消息)给对话框过程。对话框窗口被创建之后,Windows使得它成为一个激活的窗口,它保持激活直到对话框过程调用::EndDialog函数结束对话框的运行或者Windows激活另一个应用程序为止,在激活时,用户或者应用程序不可以激活它的所属窗口(Ownerwindow)。从某个窗口创建一个模式对话框时,Windows自动地禁止使用(Disable)这个窗口和它的所有子窗口,直到该模式对话框被关闭和销毁。虽然对话框过程可以Enable所属窗口,但是这样做就失去了模式对话框的作用,所以不鼓励这样做。Windows创建模式对话框时,给当前捕获鼠标输入的窗口(如果有的话)发送消息WM_CANCLEMODE。收到该消息后,应用程序应该终止鼠标捕获(Releasethemousecapture)以便于用户能把鼠标移到模式对话框;否则由于Owner窗口被禁止,程序将失去鼠标输入。为了处理模式对话框的消息,Windows开始对话框自身的消息循环,暂时控制整个应用程序的消息队列。如果Windows收到一个非对话框消息时,则它把消息派发给适当的窗口处理;如果收到了WM_QUIT消息,则把该消息放回应用程序的消息队列里,这样应用程序的主消息循环最终能处理这个消息。当应用程序的消息队列为空时,Windows发送WM_ENTERIDLE消息给Owner窗口。在对话框运行时,程序可以使用这个消息进行后台处理,当然应该注意经常让出控制给模式对话框,以便它能接收用户输入。如果不希望模式对话框发送WM_ENTERIDlE消息,则在创建模式对话框时指定DS_NOIDLEMSG风格。一个应用程序通过调用::EndDialog函数来销毁一个模式对话框。一般情况下,当用户从系统菜单里选择了关闭(Close)命令或者按下了确认(OK)或取消(CANCLE)按钮,::EndDialog被对话框过程所调用。调用::EndDialog时,指定其参数nResult的值,Windows将在销毁对话框窗口后返回这个值,一般,程序通过返回值判断对话框窗口是否完成了任务或者被用户取消。2.无模式对话框47 基于MFC的自助电话系统设计与实现一个无模式对话框是一个有系统菜单、标题栏、边线等的弹出式窗口。在创建对话框模板时指定WS_POPUP、WS_CAPTION、WS_BORDER和WS_SYSMENU风格。如果没有指定WS_VISIBLE风格,无模式对话框不会自动地显示出来。一个无模式对话框既不会禁止所属窗口,也不会给它发送消息(WM_ENTERIDlE)。当创建一个无模式对话框时,Windows使它成为活动窗口,但用户或者程序可以随时改变和设置活动窗口。如果对话框失去激活,那么即使所属窗口是活动的,在Z轴顺序上,它仍然在所属窗口之上。应用程序负责获取和派发输入消息给对话框。大部分应用程序使用主消息循环来处理,但是为了用户可以使用键盘在控制窗口之间移动或者选择控制窗口,应用程序应该调用::IsDialogMessage函数。这里,顺便解释::IsDialogMessage函数。虽然该函数是为无模式对话框设计的,但是任何包含了控制子窗口的窗口都可以调用它,用来实现类似于对话框的键盘选择操作。当::IsDialogMessage处理一个消息时,它检查键盘消息并把它们转换成相应对话框的选择命令。例如,当Tab键被压下时,下一个或下一组控制被选中,当DownArrow键按下后,一组控制中的下一个控制被选择。::IsDialogMessage完成了所有必要的消息转换和消息派发,所以该函数处理的消息一定不要传递给TranslateMessage和DispatchMessage处理。一个无模式对话框不能像模式对话框那样返回一个值给应用程序。但是对话框过程可以使用::SendMessage给所属窗口传递信息。在应用程序结束之前,它必须销毁所有的无模式对话框。使用::DestroyWindow销毁一个无模式对话框,不是使用::EndDiaLog。一般来说,对话框过程响应用户输入,如用户选择了“取消”按钮,则调用::DestroyWindow;如果用户没有有关动作,则应用程序必须调用::DestroyWindow。2.3MFC的类层次和消息机制2.3.1MFC的类的层次关系如图2-1:47 基于MFC的自助电话系统设计与实现图2-1MFC的类的层次关系CObject:是MFC提供的绝大多数类的基类。该类完成动态空间的分配与回收,支持一般的诊断、出错信息、处理和文档序列化等。CCmdTarget:主要负责将系统事件(消息)和窗口事件(消息)发送给响应这些事件的对象,完成消息、发送、等待和派遣调度等工作,实现应用程序的对象之间的一协调运行。CWinApp:是应用程序的主线程类,它是从CWinThread类派生而来的。CWinThread:用来完成对线程的控制,包括线程的创建、运行、终止、和挂起等。CDocument:是文档类,包含了应用程序在运行期问所用到的所有数据。CWnd:是一个通用窗口类,用来提供Windows中所有的通用特性、对话框和控件。CFramewnd:是从CWnd类继承而来的,并实现了标准框架应用程序。CDialog:用来控制对话框窗口。CView:用于让永华通过窗口来访问文档。CMDIFrameWnd和CMDIChildWnd:分别用于多文档应用程序的主框架窗口和文档子窗口的显示和管理。CMiniFrameWnd:是一种简化的框架窗口,它没有最大化和最小化窗卜的按钮,也没有窗口系统菜单,一般很少用到它。47 基于MFC的自助电话系统设计与实现2.3.2消息机制消息简单的说就是指通过输入设备向程序发出指令要执行某个操作。具体的某个操作是你的一系列代码。称为消息处理函数。在SDK中消息其实非常容易理解,当窗口建立后便会有一个函数(窗口处理函数)开始执行一个消息循环,我们还可以清楚的看到消息处理的脉络。一个switchcase语句就可以搞定,消息循环直到遇到WM_QUIT消息才会结束,其余的消息均被拦截后调用相应的处理函数。但在封装了API的MFC中,消息似乎变的有些复杂了,我们看不到熟悉的switchcase语句了,取而代之的是一个叫消息映射的东西。为什么MFC要引入消息映射机制,你可以想象一下,在现在的程序开发活动中,你的一个程序是否拥有多个窗体,主窗口就算只有一个,那菜单、工具条、控件这些都是子窗口,那我们需要写多少个switchcase,并且还要为每个消息分配一个消息处理函数,这样做是多么的复杂呀。因此MFC采用了一种新的机制。利用一个数组,将窗口消息和相对应的消息处理函数进行映射,你可以理解成这是一个表。这种机制就是消息映射。这张表在窗口基类CWnd定义,派生类的消息映射表如果你没有动作它是空的,也就是说如果你不手工的增加消息处理函数,则当派生窗口接受一个消息时会执行父类的消息处理函数。这样做显然是高效的。MFC提供的消息结构同时MFC定义了下面的两个主要结构:AFX_MSGMAP_ENTRYstructAFX_MSGMAP_ENTRY{UINTnMessage;//Windows消息的ID号UINTnCode;//控制消息的通知UINTnID;//Windows控制消息的IDUINTnLastID;//表示是一个指定范围的消息被映射的范围UINTnSig;//表示消息的动作标识AFX_PMSGpfn;//指向消息处理函数的指针};AFX_MSGMAPstructAFX_MSGMAP{#ifdef_AFXDLLconstAFX_MSGMAP*(PASCAL*pfnGetBaseMap)();#elseconstAFX_MSGMAP*pBaseMap;#endif47 基于MFC的自助电话系统设计与实现constAFX_MSGMAP_ENTRY*lpEntries;};///AFX_MSGMAP可以得到基类的消息映射入口地址和得到本身的消息映射入口地址。MFC下一个消息的处理过程是一般是这样的。1、_AfxCbtFilterHook截获消息(这是一个钩子函数)2、_AfxCbtFilterHook把窗口过程设定为AfxWndProc。3、函数AfxWndProc接收Windows操作系统发送的消息。4、函数AfxWndProc调用函数AfxCallWndProc进行消息处理。5、函数AfxCallWndProc调用CWnd类的方法WindowProc进行消息处理。2.4重要的数据结构在许多类型的程序的设计中,数据结构的选择是一个基本的设计考虑因素,许多系统的构造经验表明,系统实现的困难程度和系统的构造的质量都严重的依赖于是否选择了最有的数据结构,很多的时候,确定了数据结构后,软件设计就容易实现了,有时候事情也会反过来,根据特定的软件设计要求来选择合适的数据结构是非常重要的。在C++里面数据结构大多是以类的形式存在的,MFC中的类当然也是。在MFC中,己经提供了足够的从本的数据类型以供使用,例如CList、CObList、CPtrList等多种链表,CMap、CMapstringTostring、CMapstringTOptr等多种映射,以及CPoint、CRect、CSize等大小方位类型,这已经给程序的设计带来了极大的便利,使程序设计人员可以专心于程序结构和逻辑的设计,而不必再做这些没有意义、重复性的劳动。在本章,将首先简单介绍几个重要的MFC数据类型,这些数据结构在本设计过程中起到了非常重要的作用:之后,将着重介绍程序中几个常乖要的数据类型,但鱼油篇幅的限制,只介绍代表这些数据结构的类内的数据成员和重要的成员函数。2.4.1MFC的重要数据结构1.CStringCString是一种很有用的数据类型。它们很大程度上简化了MFC中的许多操作,使得MFC在做字符串操作的时候力一便了很多。不管怎样,使用CString有很多特殊的技巧。使用CString可以一让你对字符串的操作更加直截了当。这里囊括了大部分常见基本问题。(1)Cstring对象的连接47 基于MFC的自助电话系统设计与实现能体现出CString类型方便性特点的一个方面就是Cstring对象的连接,使用Cstring你能很方便地连按两个字符串,正如下面的例子:Csrringgray(”Gray”);Cstringcat(’‘Cat”):Cstringgrayeat=gray+cat(2)格式化字符串与其用sprintf()函数或wsprintf()函数来格式化一个字符串,还不如用CString对象的Format()方法,CStrings;inttotal;s.Format(”Thetotalis%d”,total);用这种方法的好处足你不用担心用来存放格式化后数据的缓冲区是否足够大,这些工作由CString类替你完成。格式化是一种把其它不是字符串类型的数据转化为CString类型的最常用技巧。(3)CString对象的查找和截取截取函数的原型如下:intFind(TCHARch)const:intFind(LPCTSTRlpszsub)const:intFind(TCHARch,intnstart)const:intFind(LPCTSTRlpszsub,intnstart)const:返回值是此CString对象中与需要的子字符串或字符匹配的第一个字符的从零开始的索引;如果没有找到子字符串或字符则返回-1。截取一般和查找配合使用,函数原型如下:CStringLeft(intnCount)const:CStringRight(intnCount)const;返回值是一个包含指定字符拷贝的CString对象。参数nCount是要从这个CString对象中提取的字符数目。(4)CString的转换OPeratorLPCTSTR()Const:返回值是一个指向字符串的数据的字符指针。例如:CStringstr=”aaa”;char*Pc=LPCTSTR(str);1.CstdioFileCStdioFile继承自CFile,一个CStdioFile对象代表一个用运行时函数fopen47 基于MFC的自助电话系统设计与实现打开的C运行时流式文件。流式文件是被缓冲的,而且可以以文本方式(缺省)或二进制方式打开。文本方式提供对硬回车—换行符对的特殊处理。当你将一个换行符(0x0A)写入一个文本方式的CStdioFile对象时,字节对(0x0D,0x0A)被发送给该文件。当你读一个文件时,字节对(0x0D,0x0A)被翻译为一个字节(0x0A)。(1)从文件读取CStdioFile::ReadString(LPTSTRlpsz,UINTnMax);读取一行文本到缓冲区,遇到“0x0D,0x0A”时停止读取,并且去掉硬回车“0x0D”,保留换行符“0x0A”,在字符串末尾添加“ ”(0x00)。nMax个字符里包含0x00这个字符。1)如果nMax<=字符数,读取(nMax-1)个字符+0x00。2)如果nMax=字符数+1,读取nMax个字符+0x00。3)如果nMax>字符数,读取nMax个字符+0x0A+0x00。CStdioFile::ReadString(CString&rString);读取一行文本到rString,遇到回车换行符停止读取。回车和换行符不读到rString,而且末尾也没有添加“ ”。(2)写入文件CStdioFile::WriteString(LPCTSTRlpsz);该函数不支持CString直接写入,将一个缓冲区中的数据写入与CStdioFile对象关联的文件中。结束的空字符(“ ”)不被写入该文件。lpsz中的所有换行符都被以一个硬回车换行符对写入该文件,即“ ”被转化成“r ”写入到文件里。(3)打开文件CstdioFile文件打开的方式有很多种,不同的模式下对与CstdioFile关联的文件的操作也就不一样。CFile::modeCreat:直接新建一个新的文件,若文件存在,则直接使其内容清空;CFile::modeNoTruncate:直接新建一个新的文件,若文件存在,对其内容部清空;CFile::modeRead:以只读方式打开文件,若无此文件则返回-1;CFile::modeReadWrite:以可读可写方式进行打开文件;CFile::modeWrite:以可写方式进行打开文件;CFile::modeNoInherit:文件不允许被子进程进行继承;例如下面:CStdioFilefile;file.Open("ts.txt",CFile::modeCreate|CFile::modeWrite);//写入文件47 基于MFC的自助电话系统设计与实现CStringstr;str.Format("%sr ","hello!Iamtalkingmute!");(4)关闭文件file.Close();2.4.2程序中重要的数据结构1.person结构体person结构体中主要记录的是通信录中的人员的对应的参数,其定义如下:typedefstructPerson{CStringm_name;CStringm_tel;CStringm_qq;CStringm_address;}person;其中CStringm_name对应的通信录中的人员的姓名CStringm_tel对应的是通信录中人员的电话号码CStringm_qq对应的是通信录中人员的QQ号码CStringm_address对应的是通信录中人员的地址,因为CString数据类型是不需要管理其长度的,故对应的地址的长度是随意长度的。2.Cphone数据类型Cphone数据类型是一个从CDialog类继承的一个子类,其定义为:classCphone:publicCDialog{DECLARE_DYNAMIC(Cphone)public:Cphone(CWnd*pParent=NULL);//标准构造函数virtual~Cphone();//对话框数据enum{IDD=IDD_CALL1_DIALOG};protected:virtualBOOLOnInitDialog();virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持DECLARE_MESSAGE_MAP()public:CStringm_Edit3;47 基于MFC的自助电话系统设计与实现CStringm_Num;//拨号号码CStringMessage;CDialog*CpDlg;personm_person1[200];};Cphone子对话框是在用户登录以后的一个字对话框,是用户进行拨号和接听的时保持的一个对话框,在此对话框中用户可以进行拨号和接听电话,同时可以进行打开通信录进行修改等操作。CStringm_Edit3关联着Cphone这个对话框中的唯一的一个显示的Edit控件,用于将用户播出的号码实时的显示在Edit控件上,并记录下来。CStringMessage是一个提示信息的变量,提供当有电话呼入或呼出的时候显示信息。CDialogCpDlg是一个新的CDialog的子类,是在点击打开通信录时新建通信录对话框的。Personm_person[200]是定义的一个通信录的人员的结构体组,记录下每一个通信录中的人员的数据。1.ClistboxCListBox类提供Windows列表框的功能。列表框显示项的列表,如用户可以见到和选择的文件名称。在单选列表框里,用户只可选择一个项。在多选列表框里,可选择许多项。当用户选择某项时,其高亮显示且列表框给父窗口发送一个通知消息。(1)Listbox控件可以设置属性为:LBS_CHILD:(默认)子窗口LBS_Visible:(默认)可视LBS_Multiplesel:可选择多行LBS_Extendedsel:可以使用shift或ctrl选择多行LBS_SORT:所有行按字母顺序进行排序(2)对Listbox进行操作:Intlistbox.AddString(LPCTSTRStr):对listbox的首行添加一个str的文本行,即此时nIndex为0;Intlistbox.DeleteString(uintnIndex):删除listbox中第nIndex行的文本行,注意nIndex是从0起始的;intlistbox.InsertString(uintxIndex,LPCTSTRStr):在listbox中第nIndex行插入一个str的文本行;Intlistbox.GetCount():获取listbox的行的总数目;47 基于MFC的自助电话系统设计与实现Intlistbox.GetCurSel():得到listbox选中的文本行的行数。Voidlistbox.ResetContent():清除listbox中的所有数据;Intlistbox.GetCurCount():获取listbox被选中的行的数目;Intlistbox.FindString(intnstart,LPCTSTRStr):从第nstart行开始起进行查找,查找Str的文本行;Intlistbox.SelectString(intnstart,LPCTSTRStr):从第nstart行开始,选择包含Str字符串的那一行;(3)对Listbox中某一行进行双击操作,要产生一个响应函数的步骤:在BEGIN_MESSAGE_MAP()END_MESSAGE_MAP()之间添加响应函数的消息映射,如函数名为C**Dlg::OnLbnDblClk,添加下面代码ON_LBN_DBLCLK(IDC_LIST1,&C**Dlg::OnLbnDblClk)//IDC_LIST1为listbox控件的ID然后在C**Dlg.h中添加函数OnLbnDblClk()的声明最后在C**Dlg::OnLbnDblClk()函数中添加实现代码即可1.CAdressBookCadressBook同样是一个继承于CDialog类型的一个子对话框,其重要是实现对通信录进行添加、浏览、修改、删除等功能。其定义为:classCAddressBook:publicCDialog{DECLARE_DYNAMIC(CAddressBook)public:CAddressBook(CWnd*pParent=NULL);//标准构造函数virtual~CAddressBook();//对话框数据enum{IDD=IDD_Address_DIALOG};protected:HICONm_hIcon;virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDV支持DECLARE_MESSAGE_MAP()public:CStringm_Eaddress;CStringm_Ename;47 基于MFC的自助电话系统设计与实现CStringm_Eqq;CStringm_Etel;CListBoxm_list;Personm_person[200];afx_msgvoidOnBnClickedButAdd();voidOnFileOpen();voidSaveListToFile();BOOLOnInitDialog();afx_msgvoidOnBnClickedButAmend();afx_msgvoidOnBnClickedButDelete();afx_msgvoidOnLbnDblClk();afx_msgvoidOnBnClickedButCancel();};其中CStringm_Ename是和姓名栏的Edit控件关联的,能及时将控件和person结构体中数据进行交互CStringm_Eqq、CStringm_Etel、CStringm_Eaddress都是和对应的控件进行关联的。Personm_person[200]是通信录中的人员结构体,能从文件中读取数据到该结构体组中进行操作。OnBnClickedButAdd()函数是对通信录进行person添加操作的。OnBnClickedButAmend()函数是对当前选择的person的数据进行修改。OnBnClickedButDelete()函数是对当前选择的person的数据进行删除。OnBnClickedButCancel()函数是退出该子对话框。OnLbnDblClk()是一个映射函数,对应的是ON_LBN_DBLCLK消息的处理函数,实现了对ClistBox控件中某一行进行双击的时候,选择该一行,并将该一行对应的数据显示在Edit控件中。OnFileOpen()函数实现了对Addressbook.txt文件的打开,并从text文件中读取存取的数据到m_person[200]中。SaveListToFile()函数实现了先打开Addressbook.txt文件,并将m_person[200]中的数据存储到Addressbook.txt中,并保存。47 基于MFC的自助电话系统设计与实现第一章程序的主体框架和功能介绍本章主要先介绍程序的主体的流程和框架,然后重点介绍实现的功能。3.1程序的主体框架整个程序是基于MFC的Dialog模式下建立的电话自助服务系统,主要的框架如下:1.登录界面是第一个Cdailog类,在这个类中实现了请求输入用户名和密码的模式,而且密码以*模式进行显示,只有拥有权限的用户才能进入下一个界面。2.在登录以后,进入拨号界面,用户可以自己选择需要进行的操作,可以进行拨号,显示拨号的信息,在呼出的时候,若播出的号码是通信录中有的,直接显示通信录中的对应人员的名字,若是通信录中没有该电话号码,则直接显示该号码。3.同样在有电话呼入的时候一样,会对通信录进行查找,若该呼入的号码在通信录中存在,则显示出该号码对应的人员的姓名,若是没有,则直接显示该号码。4.在登录界面可以点击open进入通信录界面,可以对通信录存在的数据进行添加、查看、修改和删除功能。47 基于MFC的自助电话系统设计与实现3.2程序功能的实现3.2.1登录界面的实现首先必须在Visualstdio2008中建立一个MFC的工程,建立好以后,编译一下,应该是可以通过。然后添加两个Edit控件,并对控件和变量进行关联,对关联的变量进行初始化,对“确认”按钮对应函数OnBnClickedBenter()进行登录功能的实现。voidCcallDlg::OnBnClickedBenter(){UpdateData(TRUE);//检测UserID是否输入if(m_UserID.IsEmpty()){AfxMessageBox("请输入用户名!");m_CUserID.SetFocus();return;}//检查Password是否输入if(m_Password.IsEmpty()){AfxMessageBox("请输入密码!");m_CPassword.SetFocus();return;}GetDlgItem(IDC_EUserID)->GetWindowText(m_UserID);//获取IDC_EuserID控件中的内容到m_UserIDGetDlgItem(IDC_EPassword)->GetWindowText(m_Password);//获取控件IDC_Epassword的内容到m_Passwordif(m_UserID!=userid){AfxMessageBox("PleasecheckoutyourUserIDorPassword");m_UserID=_T("");m_Password=_T("");m_CUserID.SetFocus();UpdateData(FALSE);47 基于MFC的自助电话系统设计与实现}elseif(m_Password!=password){AfxMessageBox("PleasecheckyourUserIDorPassword");m_UserID=_T("");m_Password=_T("");m_CUserID.SetFocus();UpdateData(FALSE);}else{pDlg=newCphone(this);//新建一个Cphone的新窗口pDlg->Create(IDD_CALL1_DIALOG,NULL);pDlg->ShowWindow(SW_SHOW);//显示新建的窗口ShowWindow(SW_HIDE);//隐藏本窗口}}3.2.2电话呼入呼出界面添加一个新的dialog的资源,并重新建立一个与之关联的新类Cphone。在类Cphone添加一个CStringm_Edit3的变量,将界面上拨号的数据存放到该变量中。在呼出函数voidCphone::OnBnClickedBCall()中添加对通信录遍历的函数,并与变量m_Edit3对比,若没有找到与之相同的则,直接将m_Edit3显示,若找到相同的,则将对应的人员的姓名成员显示即可。对于呼入函数也一样。voidCphone::OnBnClickedBCall(){introw=0;intj=-1;CStringtemp;CStringm_temp1;CStdioFilefp;if(fp.Open("Addressbook.txt",CFile::modeRead|CFile::modeNoTruncate)!=0){while(fp.ReadString(temp)){47 基于MFC的自助电话系统设计与实现AfxExtractSubString(m_person1[row].m_name,temp,0,',');AfxExtractSubString(m_person1[row].m_tel,temp,1,',');AfxExtractSubString(m_person1[row].m_qq,temp,2,',');AfxExtractSubString(m_person1[row].m_address,temp,3,',');row++;}}for(inti=0;i
此文档下载收益归作者所有