《VC使用MFC创建应用程序框架操作步骤教案.pptx》由会员分享,可在线阅读,更多相关《VC使用MFC创建应用程序框架操作步骤教案.pptx(50页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、会计学1VC使用使用MFC创建应用程序框架操作步骤创建应用程序框架操作步骤实例程序的技术要点:如何从CAsyncSocket类派生出自己的WinSock类。理解WinSock类与应用程序框架的关系。重点学习流式套接字对象的使用。处理网络事件的方法。实例简单,但能说明网络编程的许多问题。下面结合它详细说明MFC编程的细节。第1页/共50页创建客户端程序创建客户端程序创建客户端程序创建客户端程序1 1使使使使用用用用MFC MFC AppWizardAppWizard创创创创建建建建服服服服务务务务器器器器端端端端应应应应用用用用程程程程序序序序框框框框架。架。架。架。2 2为对话框界面添加控件对
2、象为对话框界面添加控件对象为对话框界面添加控件对象为对话框界面添加控件对象3 3为对话框中的控件对象定义相应的成员变量为对话框中的控件对象定义相应的成员变量为对话框中的控件对象定义相应的成员变量为对话框中的控件对象定义相应的成员变量4 4创建从创建从创建从创建从CAsyncSocketCAsyncSocket类继承的派生类类继承的派生类类继承的派生类类继承的派生类5 5为为为为CAsyncSocketCAsyncSocket类类类类继继继继承承承承的的的的派派派派生生生生类类类类添添添添加加加加控控控控件件件件对对对对象象象象事件的响应函数事件的响应函数事件的响应函数事件的响应函数6 6为对话
3、框类添加控件对象事件的响应函数为对话框类添加控件对象事件的响应函数为对话框类添加控件对象事件的响应函数为对话框类添加控件对象事件的响应函数7 7为为为为CTalkcDlgCTalkcDlg对对对对话话话话框框框框类类类类添添添添加加加加其其其其它它它它的的的的成成成成员员员员函函函函数数数数和和和和成成成成员变量员变量员变量员变量8 8手工添加代码手工添加代码手工添加代码手工添加代码第2页/共50页创建客户端应用程序,采用对话框架构创建客户端应用程序,采用对话框架构1使用使用MFC AppWizard创建客户端应用程序框架。创建客户端应用程序框架。(1)在New对话框中,选择Projects卡
4、,如图所示。选MFC AppWizard(exe),在Project Name处填入工程名Talkc,在Location处选定存放此工程的目录。然后点击OK按钮。第3页/共50页(2)出现MFC AppWizard设置的第一步对话框(MFC AppWizard Step 1),如图所示。从中选择Dialog based的应用程序类型,语言支持选择中文(中国),使此工程能够正确地进行中文的输入、输出、显示及处理。然后点击NEXT按钮。第4页/共50页(3)出现MFC AppWizard设置的第二步对话框(MFC AppWizards Step 2 of 4),如图所示,在在Windows Soc
5、kets复选框上打上选择标记复选框上打上选择标记,表示应用程序将支持WinSock套接字。接受其它的默认设置。跳过后面的步骤,直接点击直接点击Finsh按钮按钮。第5页/共50页(4)出现新工程信息对话框(New Project Information),说明了所创建的骨架工程的有关信息。如图所示。所创建的程序是一个基于对话框的Win32应用程序,将自动创建两个类:应用程序类CTalkcApp,对应的文件是talkc.h和talkc.cpp;对话框类CTalkcDlg,对应的文件是talkcDlg.h和talkcDlg.cpp。支持Windows Socket使用共享的DLL实现MFC42.D
6、LL。第6页/共50页2为对话框界面添加控件对象为对话框界面添加控件对象在创建了应用程序骨架之后,可以布置程序的主对话框。在MFC界面左方的工作区(workspace)中选择resourceView卡,从中选择Dialog,双击IDD_TALKC_DIALOG,右边会出现对话框,会出现控件面板。利用控件面板可以方便地在程序的主对话框界面中添加相应的可视控件对象,如图所示。第7页/共50页在主对话框中添加控件在主对话框中添加控件 第8页/共50页对话框中的控件属性按照下表修改控件属性。图 Talkc程序的主对话框 第9页/共50页控件类型控件IDCaption静态文本 static textID
7、C_STATIC_SERVNAME服务器名称静态文本 static textIDC_STATIC_SERVPORT服务器端口静态文本 static textIDC_STATIC_MSG消 息静态文本 static textIDC_STATIC_SENT发送的消息静态文本 static textIDC_STATIC_RECEIVED接收的消息编辑框 edit boxIDC_EDIT_SERVNAME编辑框 edit boxIDC_EDIT_SERVPORT编辑框 edit boxIDC_EDIT_MSG命令按钮 buttonIDC_BUTTON_CONNECT连接命令按钮 buttonIDC_B
8、UTTON_CLOSE断开命令按钮 buttonIDOK发送列表框 listboxIDC_LIST_SENT列表框 listboxIDC_LIST_RECEIVED表表 Talkc程序主对话框中的控件属性程序主对话框中的控件属性 第10页/共50页3为对话框中的控件对象定义相应的成员变量为对话框中的控件对象定义相应的成员变量在窗口菜单中点查看/建立类向导,进入类向导(Class Wizard)对话框,如图。第11页/共50页选择成员变量卡(Member Variables),用类向导为对话框中的控件对象定义相应的成员变量。确认Class Name是CTalkcDlg,在左边的列表框中选择一个控
9、件,然后点“Add Variable”按钮,会弹出”Add Member Variable”对话框,如图所示,然后按照表输入即可。图 增加控件成员变量的对话框 第12页/共50页表 客户端程序对话框中的控件对象对应的成员变量 控件IDControl IDs变量名称Member Variable Name变量类别Category变量类型Variable TypeIDC_BUTTON_CONNECTm_btnConnectControlCButtonIDC_EDIT_SERVNAMEm_strServNameValueCStringIDC_EDIT_SERVPORTm_nServPortValue
10、intIDC_EDIT_MSGm_strMsgValueCStringIDC_LIST_SENTm_listSentControlCListBoxIDC_LIST_RECEIVEDm_listRecetvedControlCListBox第13页/共50页定义了一个枚举变量定义了一个枚举变量IDD,值,值为为IDD_TALKC_DIALOG。这个对话框类就是通过这个这个对话框类就是通过这个IDD和对话框资源建立了联系。和对话框资源建立了联系。第14页/共50页CTalkcDlg类类的构造函数的构造函数类向导生成的类向导生成的对话框控件和对话框控件和对应的控件变对应的控件变量的映射语句量的映射语
11、句把控件把控件ID与类的成员与类的成员变量匹配起来变量匹配起来第15页/共50页4创建从创建从CAsyncSocket类继承的派生类类继承的派生类(1)为了能够捕获并响应socket事件,应创建用户自己的套接字类,它应当从CAsyncSocket类派生,还能将套接字事件传递给对话框,以便执行用户自己的事件处理函数。选择菜单“插入/类”,进入“New Class”对话框,如图所示。图 添加自己的套接字类 第16页/共50页选择或输入以下信息:Class Type:选择MFC ClassClass Infoumation下的Name:输入CMySocketClass Infoumation下 的
12、Base class:选 择CAsyncSocket点击“OK”按钮,系统会自动生成CMySocket类对应的包含文件MySocket.h和MySocket.cpp文件。在VC界面的Class View中就可以看到这个类。第17页/共50页类类CMySocket的定义的定义第18页/共50页CMySocket的构造函数的构造函数CMySocket的析构函数的析构函数第19页/共50页(2)利用类向导ClassWizard为这个套接字类添加响应消息的事件处理成员函数。点菜单View/ClassWizard.,进入类向导对话框,选择Message Maps(消息映射)卡,确认Class name是
13、CMySocket,从Messages(消息)栏中选择事件消息,然后点击Add Function按钮,就会看到在Member Function栏中添加了相应的事件处理函数。如图所示,此程序中需要添加OnConnect,OnClose和OnReceive三个函数。这一步会在CMySocket类的MySocket.h中自动生成这些函数的声明,在MySocket.cpp中生成这些函数的框架,以及消息映射的相关代码。可参看后面的程序清单。第20页/共50页图 为套接字类添加响应消息的事件处理成员函数 第21页/共50页第22页/共50页(3)为套接字类添加一般的成员函数和成员变量在VC+的界面中,在工
14、作区窗口选择ClassView卡,用右键单击CMySocket类,会弹出快捷菜单,选择其中的Add Member Function 可以为该类添加成员函数;选择Add Member Variable可以为该类添加成员变量。第23页/共50页对这个套接字类,添加一个私有的成员变量:对话框类的指针。private:CTalkcDlg*m_pDlg;图 为套接字类添加一般的成员变量 第24页/共50页再添加一个成员函数:void SetParent(CTalkcDlg*pDlg);这一步同样会在MySocket.h中生成变量或函数的声明,在MySocket.cpp中生成函数的框架代码。如果熟悉的话,
15、这一步的代码也可以直接手工添加。第25页/共50页(4)手工添加其他代码在VC+的界面中,在工作区窗口选择FileView卡,双击要编辑的文件,在右面的窗口中就会展示该文件的代码,可以编辑添加。对于MySocket.h,应在文件开头,添加对于此应用程序对话框类的声明。class CTalkcDlg;第26页/共50页对于MySocket.cpp,有四处添加:应在文件开头,添加包含文件说明。这是因为此套接字类用到了对话框类的变量。#include “TalkcDlg.h”在构造函数中,添加对于对话框指针成员变量的初始化代码:CMySocket:CMySocket()m_pDlg=NULL;在析构
16、函数中,添加对于对话框指针成员变量的终止处理代码:CMySocket:CMySocket()m_pDlg=NULL;为成员函数setParent和事件处理函数OnConnect,OnClose和OnReceive添加代码。详见后面的程序清单。第27页/共50页5为对话框类添加控件对象事件的响应函数为对话框类添加控件对象事件的响应函数按照表,用类向导(Class Wizard)为对话框中的控件对象添加事件响应函数。主要是对于三个按钮的单击事件的处理函数,如图所示。其他函数是原有的。表 为对话框中的控件对象添加事件响应函数 控 件 类型对象标识 Object IDs消息 Messages函数Mem
17、ber functions命 令 按钮IDC_BUTTON_CLOSEBN_CLICKEDOnButtonClose命 令 按钮IDC_BUTTON_CONNECTBN_CLICKEDOnButtonConnect命 令 按钮IDOKBN_CLICKEDOnSendMsg第28页/共50页图 为对话框类添加控件事件的处理函数这一步会在talkcDlg.h中自动添加这三个事件处理函数的声明,在talkcDlg.cpp中生成消息映射的代码,和这三个函数的框架代码。第29页/共50页6为为CTalkcDlg对话框类添加其它的成员函数和成员变量对话框类添加其它的成员函数和成员变量成员变量:CMySoc
18、ket m_sConnectSocket;/用来与服务器端连接的套接字。成员函数:void OnClose();/用来处理与服务器端的通信。void OnConnect();void OnReceive();第30页/共50页7手工添加的代码手工添加的代码 在CTalkcDlg对话框类的talkcDlg.h中添加对于MySocket.h的包含命令,来获得对于套接字支持:#include “MySocket.h”在CTalkcDlg对话框类的talkcDlg.cpp中添加对于控件变量的初始化代码:/TODO:Add extra initialization here/用户添加的控件变量的初始化代
19、码BOOL CTalkcDlg:OnInitDialog()m_strServName=“m_nServPort=1000;/服务端口=1000UpdateData(FALSE);/更新用户界面/设置套接字类的对话框指针成员变量m_sConnectSocket.SetParent(this);第31页/共50页8添加事件函数和成员函数的代码添加事件函数和成员函数的代码主要在CTalkcDlg对话框类的talkcDlg.cpp中和CMySocket类的Mysocket.cpp中,添加用户自己的事件函数和成员函数的代码,要注意,这些函数的框架已经在前面的步骤中,由VC+的向导生成,只要将用户自己的
20、代码填入其中即可。9进行测试。进行测试。测试应分步进行,在上面的步骤中,每作一步,都可以试着编译执行。第32页/共50页3 客户端程序的类与消息驱动客户端程序的类与消息驱动图 Talkc客户端程序的类与消息驱动的关系 第33页/共50页客户机端的类与消息驱动客户机端的类与消息驱动n n程序运行后,经过初始化处理,向用户展示对话框,程序运行后,经过初始化处理,向用户展示对话框,程序运行后,经过初始化处理,向用户展示对话框,程序运行后,经过初始化处理,向用户展示对话框,然后进入消息循环,通过消息引发相应类的事件处然后进入消息循环,通过消息引发相应类的事件处然后进入消息循环,通过消息引发相应类的事件
21、处然后进入消息循环,通过消息引发相应类的事件处理函数的执行,从而完成程序的功能。理函数的执行,从而完成程序的功能。理函数的执行,从而完成程序的功能。理函数的执行,从而完成程序的功能。n n主要有两类消息:套接字类接收来自网络的消息;主要有两类消息:套接字类接收来自网络的消息;主要有两类消息:套接字类接收来自网络的消息;主要有两类消息:套接字类接收来自网络的消息;对话框类来自用户操作对话框的消息。对话框类来自用户操作对话框的消息。对话框类来自用户操作对话框的消息。对话框类来自用户操作对话框的消息。n nm_sConnectSocketm_sConnectSocket变量所代表的变量所代表的变量所
22、代表的变量所代表的CMySocketCMySocket套接字套接字套接字套接字对象,接收来自网络的套接字事件消息,执行相应对象,接收来自网络的套接字事件消息,执行相应对象,接收来自网络的套接字事件消息,执行相应对象,接收来自网络的套接字事件消息,执行相应的对象处理函数,这些函数并不真正做什么事,而的对象处理函数,这些函数并不真正做什么事,而的对象处理函数,这些函数并不真正做什么事,而的对象处理函数,这些函数并不真正做什么事,而是转而调用对话框类的相应成员函数,由这些函数是转而调用对话框类的相应成员函数,由这些函数是转而调用对话框类的相应成员函数,由这些函数是转而调用对话框类的相应成员函数,由这
23、些函数完成发送链接请求、接收数据和关闭连接的任务。完成发送链接请求、接收数据和关闭连接的任务。完成发送链接请求、接收数据和关闭连接的任务。完成发送链接请求、接收数据和关闭连接的任务。第34页/共50页n n套接字类的相应成员函数就像传令兵,有了情况套接字类的相应成员函数就像传令兵,有了情况套接字类的相应成员函数就像传令兵,有了情况套接字类的相应成员函数就像传令兵,有了情况就向对话框类报告。就向对话框类报告。就向对话框类报告。就向对话框类报告。n n在对话框类中做处理的原因:操作涉及对话框中在对话框类中做处理的原因:操作涉及对话框中在对话框类中做处理的原因:操作涉及对话框中在对话框类中做处理的原
24、因:操作涉及对话框中的许多变量和控件变量,由对话框类的成员函数的许多变量和控件变量,由对话框类的成员函数的许多变量和控件变量,由对话框类的成员函数的许多变量和控件变量,由对话框类的成员函数来处理比较方便和直接。来处理比较方便和直接。来处理比较方便和直接。来处理比较方便和直接。n n套接字类的成员变量套接字类的成员变量套接字类的成员变量套接字类的成员变量m_pDlgm_pDlg是指向对话框类的指是指向对话框类的指是指向对话框类的指是指向对话框类的指针,在消息转接中起到了关键作用。针,在消息转接中起到了关键作用。针,在消息转接中起到了关键作用。针,在消息转接中起到了关键作用。n n用户直接面对对话
25、框,可以直接操作对话框中的用户直接面对对话框,可以直接操作对话框中的用户直接面对对话框,可以直接操作对话框中的用户直接面对对话框,可以直接操作对话框中的控件,如输入服务器的名字、输入端口号等,当控件,如输入服务器的名字、输入端口号等,当控件,如输入服务器的名字、输入端口号等,当控件,如输入服务器的名字、输入端口号等,当用户单击按钮时,会产生事件消息,引发相应处用户单击按钮时,会产生事件消息,引发相应处用户单击按钮时,会产生事件消息,引发相应处用户单击按钮时,会产生事件消息,引发相应处理函数的执行。理函数的执行。理函数的执行。理函数的执行。第35页/共50页4 客户端程序的主要功能的代码和分析客
26、户端程序的主要功能的代码和分析1应用程序类应用程序类CTalkcApp对应的文件对应的文件应用程序类CTalkcApp,对应的文件是talkc.h和talkc.cpp;talkc.h定义了CTalkcApp类,talkc.cpp是该类的实现代码,完全由VC+自动创建,用户不必作任何改动。2派生的套接字类派生的套接字类CMySocket对应的文件对应的文件CMySocket类 对 应 MySocket.h头 文 件 和MySocket.CPP文件,第36页/共50页3对话框类对话框类CTalkcDlg对应的文件对应的文件对话框类CTalkcDlg,对应的文件是talkcDlg.h和talkcDl
27、g.cpp。4其他文件其他文件对于VC+为talkc工程创建的其他文件,如stdafx.h和stdafx.cpp,以及Resource.h和talkc.rc都不需要作任何处理。第37页/共50页5 创建服务器端程序创建服务器端程序同样利用可视化语言的集成开发环境(IDE)来创建服务器端应用程序框架。步骤是:1使用使用MFC AppWizard创建服务器端应用程序框架。创建服务器端应用程序框架。2为对话框界面添加控件对象为对话框界面添加控件对象3为对话框中的控件对象定义相应的成员变量为对话框中的控件对象定义相应的成员变量4创建从创建从CAsyncSocket类继承的派生类类继承的派生类5为对话框
28、类添加控件对象事件的响应函数为对话框类添加控件对象事件的响应函数6为为CTalksDlg对话框类添加其它的成员函数和成员变量对话框类添加其它的成员函数和成员变量7手工添加的代码手工添加的代码8添加事件函数和成员函数的代码添加事件函数和成员函数的代码9进行测试。进行测试。第38页/共50页第39页/共50页第40页/共50页第41页/共50页控件类型控件IDCaption静态文本 static textIDC_STATIC_SERVNAME服务器名称静态文本 static textIDC_STATIC_SERVPORT服务器端口静态文本 static textIDC_STATIC_MSG消 息静
29、态文本 static textIDC_STATIC_SENT发送的消息静态文本 static textIDC_STATIC_RECEIVED接收的消息编辑框 edit boxIDC_EDIT_SERVNAME编辑框 edit boxIDC_EDIT_SERVPORT编辑框 edit boxIDC_EDIT_MSG命令按钮 buttonIDC_BUTTON_LISTEN监听命令按钮 buttonIDC_BUTTON_CLOSE断开命令按钮 buttonIDOK发送列表框 listboxIDC_LIST_SENT列表框 listboxIDC_LIST_RECEIVED表表 Talks程序主对话框中
30、的控件属性程序主对话框中的控件属性 第42页/共50页表 talks程序对话框中的控件对象对应的成员变量 控件IDControl IDs变量名称Member Variable Name变量类别Category变量类型Variable TypeIDC_BUTTON_LISTENm_btnListenControlCButtonIDC_EDIT_SERVNAMEm_strServNameValueCStringIDC_EDIT_SERVPORTm_nServPortValueintIDC_EDIT_MSGm_strMsgValueCStringIDC_LIST_SENTm_listSentCont
31、rolCListBoxIDC_LIST_RECEIVEDm_listRecetvedControlCListBox第43页/共50页创建类创建类创建类创建类CMySocketCMySocket增加增加增加增加3 3个事件处理函数个事件处理函数个事件处理函数个事件处理函数第44页/共50页5为对话框类添加控件对象事件的响应函数为对话框类添加控件对象事件的响应函数用类向导(Class Wizard)为对话框中的控件对象添加事件响应函数。主要是对于三个按钮的单击事件的处理函数。控 件 类型对象标识 Object IDs消息 Messages函数Member functions命 令 按钮IDC_BU
32、TTON_CLOSEBN_CLICKEDOnButtonClose命 令 按钮IDC_BUTTON_LISTENBN_CLICKEDOnButtonListen命 令 按钮IDOKBN_CLICKEDOnSendMsg第45页/共50页为为为为TalksDlgTalksDlg类增加成员变量和成员函数类增加成员变量和成员函数类增加成员变量和成员函数类增加成员变量和成员函数第46页/共50页6 服务器端程序的流程和消息驱动 图 Talks服务器端程序的类与消息驱动的关系 第47页/共50页7 点对点交谈的服务器端程序的主要功能的代码和分析点对点交谈的服务器端程序的主要功能的代码和分析1CTalksApp类对应的文件类对应的文件 talks.h和talks.cpp不需要做任何改动2CMySocket类对应的文件类对应的文件(1)MYSOCKET.H文件文件(2)MySocket.cpp文件文件3CTalksDlg类对应的文件类对应的文件(1)talksDlg.h(2)talksDlg.cpp 文件文件4其它的文件不必改动其它的文件不必改动 第48页/共50页程序运行结果程序运行结果第49页/共50页