VC+MFC网络聊天工具详细设计Word文档下载推荐.docx
- 文档编号:3555638
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:52
- 大小:551.97KB
VC+MFC网络聊天工具详细设计Word文档下载推荐.docx
《VC+MFC网络聊天工具详细设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《VC+MFC网络聊天工具详细设计Word文档下载推荐.docx(52页珍藏版)》请在冰点文库上搜索。
包括客户端刚刚启动时的初始化信息和在使用过程中的确认在线信息。
(4)其它程序内部可能需要设计的数据结构体。
2.1.3节 性能需求分析
(1)可靠性高,能在由于系统问题或其它原因产生错误后,作出相对应处理,比如网络初始化失败、服务器不在线等,可以提示用户安全退出本程序,在出现不可知的错误以后,可以尽量安全的退出程序。
在程序的设计过程中,要求能尽可能多的设想到用户使用过程中可能发生的事件,并能在判断事件后做出相应的处理,使程序具有较高的容错性能。
(2)宜操作性,程序简单易懂,容易上手使用。
设计界面是,简化界面的复杂性,模拟QQ等现有即时通讯工具的界面,使用户能很容易看懂并使用。
(3)开发文档易理解,保证以后自己二次开发或他人接手开发时,能够清晰的理解整个系统的设计思路和实现细节。
(4)模块化设计此软件的功能,不同的模块实现不同的功能,使得软件易于以后的维护与扩展,在以后可以更好的完善本软件的功能,更方便于在工作中的应用。
2.1.4节 运行需求分析
(1)用户界面
程序较小,启动速度快,无启动界面。
在本地局域网中使用,所以无需进行用户登录,无需认证界面,启动后的应用界面要清爽,设计要简单明了,要具有较高的易用性。
(2)故障处理
在遇到可预知的故障与情况时,能提示用户并自动退出;
在遇到不可预知的故障时能安全退出。
2.4节 Winsock网络编程
WindowsSockets是从BerkeleySockets扩展而来的,其在继承BerkeleySockets的基础上,又进行了新的扩充。
这些扩充主要是提供了一些异步函数,并增加了符合WINDOWS消息驱动特性的网络事件异步选择机制[5]。
WindowsSockets由两部分组成:
开发组件和运行组件。
开发组件:
WindowsSockets实现文档、应用程序接口(API)引入库和一些头文件。
运行组件:
WindowsSockets应用程序接口的动态链接库(WINSOCK.DLL)。
2.4.1节 Socket
套接字(Socket)最初是由加利福尼亚大学Berkeley分校为UNIX操作系统开发的网络通信接口,随着UNIX操作系统的广泛使用,套接字成为当前最流行的网络通信应用程序接口之一[7]。
90年代初,由SunMicrosystems,JSBCorporation,FTPsoftware,Microdyne和Microsoft等几家公司共同制定了一套标准,即WindowsSockets规范。
WindowsSocketsAPI是MicrosoftWindows的网络程序设计接口,它在继承了BerkeleySockets主要特征的基础上,又对它进行了重要扩充。
这些扩充主要是提供了一些异步函数,并增加了符合Windows消息驱动特性的网络事件异步选择机制。
这些扩充有利于应用程序开发者编制符合Windows编程模式的软件,它使在Windows下开发高性能的网络通信程序成为可能。
Socket实际上是指一个通信端点,借助于它,用户所开发的Socket应用程序,可以通过网络与其它Socket应用程序进行通信。
近年来,随着计算机网络与Windows95的流行,许多用户所开发的应用程序需要实现网络间的数据通信。
2.4.2节 开发WindowsSockets网络通信程序的软、硬件环境
所采用的操作系统软件可以是Windows95,2000,XP,也可以是WindowsNT,因为它们都支持WindowsSocketsAPI,在以下的介绍中,我们将以在WindowsXP环境下的开发为例。
所采用的编程语言一般可选目前较流行使用的可视化和采用面向对象技术的MicrosoftVisualC++6.0。
VisualC++6.0可在WindowsXP或WindowsNT环境下运行,其开发系统增加了全面集成的基于Windows的开发工具以及一个基于传统C/C++开发过程的“可视化”用户界面驱动模型。
VisualC++6.0中的Microsoft基类(MFC,即MicrosoftFoundationClass)库是一系列C++类,其中封装着为MicrosoftWindows操作系统系列编写应用程序的各种功能。
在有关套接字方面,VisualC++6.0对原来的WindowsSockets库函数进行了一系列封装,继而产生了CSocket、CSocketFile等类,它们封装着有关Socket的各种功能[8]。
所采用的网络通信协议一般是TCP/IP。
WindowsXP和WindowsNT都带有该协议。
但是,所开发的网络通信应用程序并不能直接与TCP/IP核心打交道,而是与网络应用编程界面WindowsSocketsAPI打交道。
WindowsSocketsAPI则可直接与TCP/IP核心进行沟通。
TCP/IP核心协议连同网络物理介质(如网卡)一起,都是提供网络应用程序间相互通信的设施。
2.4.3节 CSocket类编程模型
使用CSocket对象涉及CArchive和CSocketFile类对象。
以下介绍的针对字节流型套接字的操作步骤中,只有第三步对于客户方和服务方操作是不同的,其他步骤都相同[13]。
(1)构造一个CSocket对象。
(2)使用这个对象的Create()成员函数产生一个socket对象。
在客户方程序中,除非需要数据报套接字,Create()函数一般情况下应该使用默认参数。
而对于服务方程序,必须在调用Create时指定一个端口。
需要注意的是,Carchive类对象不能与数据报(UDP)套接字一起工作,因此对于数据报套接字,CAsyncSocket和CSocket的使用方法是一样的。
(3)如果是客户方套接字,则调用CAsyncSocket∷Connect()函数与服务方套接字连接;
如果是服务方套接字,则调用CAsyncSocket∷Listen()开始监听来自客户方的连接请求,收到连接请求后,调用CAsyncSocket∷Accept()函数接受请求,建立连接。
请注意Accept()成员函数需要一个新的并且为空的CSocket对象作为它的参数,解释同上。
(4)产生一个CSocketFile对象,并把它与CSocket对象关联起来。
(5)为接收和发送数据各产生一个CArchive对象,把它们与CSocketFile对象关联起来。
切记CArchive是不能和数据报套接字一起工作的。
(6)使用CArchive对象的Read()、Write()等函数在客户与服务方传送数据。
(7)通讯完毕后,销毁CArchive、CSocketFile和CSocket对象。
2.4.4节 用VC6.0进行WindowsSockets程序开发的技术要点
(1)同常规编程一样,无论服务器方还是客户方应用程序都要进行所谓的初始化处理,这部分工作仍可采用消息驱动机制来先期完成。
(2)一般情况下,网络通信程序是某应用程序中的一模块。
在单独调试网络通信程序时,要尽量与采用该通信模块的其它应用程序开发者约定好,统一采用一种界面形式,即单文档界面SDI、多文档界面MDI和基于对话框界面中的一种(这在使用AppWizard形成项目[Project]文件时有提示),尽管这并非必须,但可使通信模块在移植到所需的应用程序时省时省力,因为VisualC++6.0这种可视化语言在给我们提供方便的同时,也给我们带来某些不便,譬如所形成的项目文件中的许多相关文件与所采用的界面形式密切联系,许多消息驱动功能,随所采用的界面形式不同而各异。
当然,也可将通信模块函数化,并形成一个动态连接库文件(DLL文件),供主程序调用。
(3)以通信程序作为其中一个模块的应用程序往往不是在等待数据发送或接收完之后再做其它工作,因而在主程序中要采用多线程(Multithreaded)技术。
即将数据的发或收,放在一个具有一定优先级(一般宜取较高优先级)的辅助线程中,在数据发或收期间,主程序仍可进行其它工作,譬如利用上一个周期收到的数据绘制曲线。
VisualC++6.0中的MFC提供了许多有关启动线程、管理线程、同步化线程、终止线程等功能函数[14]。
(4)在许多情况下,要求通信模块应实时地收、发数据。
譬如调用之的主程序以0.5秒为一周期,在这段时间内,要进行如下工作:
接收数据,利用收到的数据进行运算,将运算结果发送到其它计算机节点,周而复始。
我们在充分利用WindowsSockets的基于消息的网络事件异步选择机制,用消息来驱动数据的发送和接收的基础上,结合使用其他措施,如将数据的收和发放在高优先级线程,在软件设计上,安排好时序,尽量避免在同一时间内,双方都在向对方发送大量数据的情况发生,保证网络要有足够的带宽等,成功地实现了数据传输的实时性[2]。
第3章 详细设计
本章将从各个方面介绍本系统的设计。
先从基本框架的设计出发,然后逐步介绍好友管理、聊天模块、聊天室模块、传送文件模块、共享屏幕模块、白板模块、音、视频模块和调试模块,所以本章是本论文的重点。
3.1节 基本框架设计
本节内容将介绍除各个功能模块外的设计,包括界面上的处理、保持好友在线列表等的处理。
有些内容可能并不属性框架设计,但这些内容也不具有单独使用一节来介绍的必要,所以把这些内容也一并放到这些节来介绍。
这也是为了区分设计周围的处理与各个功能模块的处理。
3.1.1节 宏和数据结构的定义
程序中用到了很多宏和数据结构,这些宏和数据结构在多个模块中都有用到,因此程序中专门新建一个头文件Global.h,此头文件里是程序中很到的宏和数据结构的定义[1]。
在StdAfx.h文件包含Global.h,在程序其他地方都可以使用Global.h中的宏和定义的数据结构。
这样处理还有一个好处,如果需要修改某些宏的值,可以直接在Global.h中修改,而不用到处去找宏的定义,方便和快捷。
3.1.2节 程序配置文件
程序中很多信息需要保存,比如用户名和热键,因些程序用到了配置文件,默认的配置文件名为conf.ini。
程序用读取和写入配置文件系列函数来管理此配置文件。
3.1.3节 主界面初始化
用过QQ的人都知道,QQ主面板总是处于其他程序的上面,而且QQ在任务栏没有图标,而是把图标放到了托盘区,另外,我们还可以按Ctrl+Alt+Z默认的快捷键隐藏和显示QQ主面板。
不但QQ是这样处理的,很多聊天软件都采用此种处理方式。
本设计也不例外,同样也要达到这样的目的。
下面从各个方面来说明本设计的处理方式:
(1)不在任务栏显示图标
CDialogdlgParent;
dlgParent.Create(IDD_DIALOG_BG);
dlgParent.ShowWindow(SW_HIDE);
CInstantMessagingDlgdlg(&
dlgParent);
m_pMainWnd=&
dlg;
ModifyStyleEx(WS_EX_APPWINDOW,0);
上面代码就达到了程序主界面不在任务显示的目的。
首先,我们创建一个对话框,并隐藏此对放框,然后把这个对话框作为主界面对话框的父窗口,然后在主界面对话框的初始化函数中修改其风格,去掉WS_EX_APPWINDOW风格。
这样,主界面就不会出现在任务了[3]。
(2)将主界面放在最上层
将程序放到顶层,很多程序都有这功能,比如金山词霸等,实现起来其实很简单,只用一条语句就可以达到目的:
SetWindowPos(&
wndTopMost,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE);
第一个参数就是将程序放到所有非顶层窗口的顶层,如果有多个程序都是顶层窗口,那么他们谁在上面,就要看当前谁是激活的窗口。
最后一个参数,是用位或|组后起来的,从字面意思上我们就能理解到这是不移动不改变大小的意思,忽略了当中的4个参数[6]。
(3)热键的处理
设计中默认的热键是Ctrl+Alt+Z,当然程序允许用户自己定义热键,自定义的热键将保存在conf.ini文件中。
热键的功能可以隐藏、显示主界面,有消息到达时,按热键也可以打开聊天对话框。
:
RegisterHotKey(m_hWnd,IDHOTKEY,m_wModifiers,m_wVirtualKeyCode);
使用全局函数RegisterHotKey可以注册热键,如果注册的热键没有被其他程序占用,那么注册成功。
注册成功后,如果按热键,那么程序就会接受到WM_HOTKEY消息,因此我们还需要自己处理WM_HOTKEY消息[12]:
voidOnHotkey(WPARAMwParam,LPARAMlParam);
BEGIN_MESSAGE_MAP(CInstantMessagingDlg,CDialog)
…
ON_MESSAGE(WM_HOTKEY,OnHotkey)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
在消息映射中,我们用OnHotkey()函数来处理WM_HOTKEY消息。
voidCInstantMessagingDlg:
OnHotkey(WPARAMwParam,LPARAMlParam)
{
if(this->
IsWindowVisible())
{
ShowWindow(SW_HIDE);
}
else
ShowWindow(SW_SHOW);
:
SetForegroundWindow(m_hWnd);
}
在OnHotkey()函数中判断主界面是否是可见的,如果是可见的那么隐藏起来,否则显示,并且把主界面设为前景窗口。
(4)最小化和关闭按钮的处理
我们希望单击程序右上角的最小化按钮时,程序隐藏起来,而单击关闭按钮时,程序会提示是否退出,而不会悄无声息的退出。
OnSysCommand(UINTnID,LPARAMlParam)
if(nID==SC_MINIMIZE)
this->
ShowWindow(SW_HIDE);
CDialog:
OnSysCommand(nID,lParam);
OnCancel()
if(IDOK==MessageBox("
要退出吗?
"
"
退出"
MB_OKCANCEL|MB_ICONINFORMATION|MB_DEFBUTTON2))
…
DestroyWindow();
在程序中处理OnSysCommand()函数和OnCancel()函数就实现了我们要的功能。
(5)托盘图标的显示
至此,程序已不在任务栏显示图标,已是最顶层窗口,而且也已有热键功能,但是还没有实现托盘图标的显示。
实现托盘图标的代码如下:
NOTIFYICONDATAm_nid;
HICONhIcon=AfxGetApp()->
LoadIcon(STATE_ONLINE);
m_nid.hIcon=hIcon;
m_nid.hWnd=m_hWnd;
m_nid.cbSize=sizeof(NOTIFYICONDATA);
m_nid.uCallbackMessage=WM_SHELLNOTIFY;
m_nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP;
m_nid.uID=IDR_MENU1;
sprintf(m_nid.szTip,"
即时聊天软件"
);
Shell_NotifyIcon(NIM_ADD,&
m_nid);
这样我们就在托盘区显示了STATE_ONLINE的图标,把鼠标移动到图标上一会,还会出现“即时聊天软件”的提示框。
如果你们对图标有单击和双击等操作,程序会收到WM_SHELLNOTIFY消息,因此,我们还必须处理WM_SHELLNOTIFY消息。
voidOnShellNotifyProc(WPARAMwParam,LPARAMlParam);
//{{AFX_MSG_MAP(CInstantMessagingDlg)
ON_MESSAGE(WM_SHELLNOTIFY,OnShellNotifyProc)
OnShellNotifyProc(WPARAMwParam,LPARAMlParam)
if(lParam==WM_LBUTTONDBLCLK)
elseif(lParam==WM_RBUTTONUP)
与热键处理一样,OnShellNotifyProc()函数响应我们对图标的操作,其中lParam参数表示消息号,在本设计中只处理左键双击(显示主界面)和右键单击(弹出菜单)。
在托盘添加图标,退出程序前,如果没有从托盘删除图标,那么托盘区的图标会一直保留下来,直到鼠标移过托盘区引起托盘区的重绘,这当然不是我们所希望的结果。
OnDestroy()
///删除在托盘建立的图标
:
Shell_NotifyIcon(NIM_DELETE,&
CDialog:
OnDestroy();
以上代码在程序退出时调用,从托盘从删除图标。
(6)只允许运行唯一实例
这点与QQ不同,在一台机子上可以运行多个QQ,但本程序只允许运行一个实例。
只允许运行一个实例,有多种方法,本设计采用的是创建命名事件的方法:
HANDLEhEvent=:
CreateEvent(NULL,FALSE,FALSE,"
InstantMessaging"
if(hEvent)
if(ERROR_ALREADY_EXISTS==GetLastError())
returnFALSE;
事件与普通变量不一样,普通变量只在运行的当前程序中有效,而事件在整个系统中都有效。
当首次运行程序时,会创建一个名为“InstantMessaging”的事件,这个事件在系统范围内有效,当再次运行程序时,程序会尝试着创建同名的事件,因为之前已经创建了这个事件,因此系统会返回之前创建事件的句柄,但GetLastError()会返回ERROR_ALREADY_EXISTS,表明需创建的事件之前已经创建,为了保证只允许一个实例,这个实例就不再允许运行,直接返回,退出程序。
3.1.3节 主界面布局
程序主界面如下:
图3.1 主界面
左上角显示的是自己的头像、状态和昵称;
右上角的列表框是查找IP输入框,下面是添加按钮;
在下面一点的列表框是自己的址列表框,显示了自己的所有IP;
主界面中央是用户列表框;
最下面是4个功能按钮。
用户列表框是一列一列的显示添加的好友,最左边是好友的头像;
中部上边是好友的昵称,下面是好友的IP;
右下角是删除好友按钮和摄像头按钮,当然好友必须有摄像头才会显示摄像头按钮。
有两种方式添加联系人:
(1)在右上解的查找IP输入框里输入IP,然后单击下面的添加按钮。
也可以从IP输入框里选择以前加过的好友IP。
程序允许保存10个最近联系人的IP,当新添加联系人时,如果已保存了10个联系人的IP,程序会按照时间的先后顺序覆盖之前的IP。
在列表框展开下拉列表后,可以按DELETE键删除选定的IP。
(2)选定一个自己的IP,然后单击“网段”按钮。
此功能可以向选定IP的IP段发送添加请求的消息,这相当于批量添加好友的功能。
在主界面任何地点单击左键不放开,可以拖动程序;
单击右键,会弹出菜单,用户选中相应的菜单项,可以执行相应的功能;
在任何地点双击左键,可以打开“个人设置”对话框,如下:
图3.2 设置对话框
最后一项“允许别人直接将我加为联系”的意思是别人添加我为好友时,不会弹出请求对话框而直接加为好友。
单击保存后,此对话框里的内容会保存到config.ini配置文件中。
运行程序后,会从config.ini读取用户信息,并在主界面中作相应的设置。
在主界面,添加、聊天室、传送文件、共享屏幕和白板按钮都是自绘按钮,可以显示图片,有提示能力,当鼠标移动到其上一会儿后,会弹出提示框,而且这些按钮都具有XP风格,既鼠标滑过时会显示不同的状态。
用户列表框也是自绘的,普通的列表控件无法显示我们所需的信息。
自绘按钮和自绘列表框会作为一个单独的模块来介绍,这儿就不作过多的介绍。
3.1.4节 自绘按钮
VC++6.0自带的按钮控件不具有XP风格,而且也不能显示图像,作为一款好的软件,应该有个好的界面。
在程序的主界面上,主要的按钮都采用了自绘按钮,而不使用自带的按钮控件。
AdvButton.h和AdvButton.cpp是自绘按钮类的头文件和实现文件。
在自绘按钮类中定义了如下成员变量:
intm_nState;
///按钮的状态
CBitmapm_bmpNormal;
///正常图标
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC MFC 网络 聊天工具 详细 设计