详细设计方案 .docx

上传人:Che****ry 文档编号:17165084 上传时间:2022-05-21 格式:DOCX 页数:48 大小:543.41KB
返回 下载 相关 举报
详细设计方案 .docx_第1页
第1页 / 共48页
详细设计方案 .docx_第2页
第2页 / 共48页
点击查看更多>>
资源描述

《详细设计方案 .docx》由会员分享,可在线阅读,更多相关《详细设计方案 .docx(48页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、精品名师归纳总结第 2 章系统分析及开发技术说明2.1 节 需求分析2.1.1 节 功能需求分析可编辑资料 - - - 欢迎下载精品名师归纳总结图 2.1功功能能需需求求说明图可编辑资料 - - - 欢迎下载精品名师归纳总结( 1)用户端的基本谈天信息发送,这些基本谈天信息包括文本和图片。文本和图片谈天是谈天软件最基础的功能。用户通过输入IP 来查找用户,并申请加为好友,在对发方送同基意本加为好友传后输,音在视线用户列传表输就文会更新用白户板,把加入共的享用屏户添加到用保持连户列表中聊。天这信样息,两个用频户数之据前就可以实现件通信了。在信息传输中,幕估计利用接TCP/IP 协议中的 UDP

2、协议,这是面对无连接的协议,但发送速度快,用于谈天信息传输用适合。发送文本发送图片( 2)用户端的音视频数据传输,这是本设计的扩展功能。用户可以正常通信信息信息后,就可以挑选是否进行语音或视频谈天。本功能也将采纳UDP 协议, UDP 协议可能会丢失数据,但对于音视频谈天需要传输大量数据但又答应丢失少量数据的情形下, UDP 的快速发送信息的特点就得到很好的表达。( 3)用户端文件传输的功能,用户之间可以断点续传文件。在传文件之前,第一创建一信息文件,记录文件传送的一些信息,并依据传输的数据量实时修改。假如没有传完,下次就可以连续打开这个信息文件,接着上次的进度传输。由于文件传输入要求数据不能

3、出错,因此此模块采纳TCP 协议。( 4)用户端之间白板和共享屏幕的功能,这个功能有些类似视频的传输,因些并不是很难,可以在视频传输的功能上加以修改。( 5)用户之间后台的连接,每个用户隔指定时间会向用户列表中的每一用户发送消息,查看用户是否在线,假如不在线,就更新用户列表,删除用户。2.1.2 节 数据需求分析( 1)客户端之间谈天信息。在控件上显示时格式化,更易于用户的查看自己发送或接收到的信息。( 2)在线用户列表信息。服务器端存放在适当的空间中,在发送给客户端时,可编辑资料 - - - 欢迎下载精品名师归纳总结对信息列表进行格式化,便于客户端提取信息。( 3)客户端向服务器端发送的确认

4、在线信息。包括客户端刚刚启动时的初始化信息和在使用过程中的确认在线信息。( 4)其它程序内部可能需要设计的数据结构体。2.1.3 节 性能需求分析( 1)牢靠性高,能在由于系统问题或其它缘由产生错误后,作出相对应处理, 比如网络初始化失败、服务器不在线等,可以提示用户安全退出本程序,在显现不行知的错误以后,可以尽量安全的退出程序。在程序的设计过程中,要求能尽可能多的设想到用户使用过程中可能发生的大事,并能在判定大事后做出相应的处理, 使程序具有较高的容错性能。( 2)宜操作性,程序简洁易懂,简洁上手使用。设计界面是,简化界面的复杂性,模拟 QQ 等现有即时通讯工具的界面,使用户能很简洁看懂并使

5、用。( 3)开发文档易懂得,保证以后自己二次开发或他人接手开发时,能够清楚的懂得整个系统的设计思路和实现细节。( 4)模块化设计此软件的功能,不同的模块实现不同的功能,使得软件易于以后的保护与扩展,在以后可以更好的完善本软件的功能,更便利于在工作中的应 用。2.1.4 节 运行需求分析(1) )用户界面程序较小,启动速度快,无启动界面。在本的局域网中使用,所以无需进行用户登录,无需认证界面,启动后的应用界面要清新,设计要简洁明白,要具有较高的易用性。(2) )故障处理在遇到可预知的故障与情形时,能提示用户并自动退出。在遇到不行预知的故障时能安全退出。2.4 节 Winsock 网络编程Wind

6、ows Sockets是从 Berkeley Sockets扩展而来的,其在继承 Berkeley Sockets的基础上,又进行了新的扩充。这些扩充主要是供应了一些异步函数,并增加了符可编辑资料 - - - 欢迎下载精品名师归纳总结合 WINDOWS 消息驱动特性的网络大事异步挑选机制 5 。Windows Sockets由两部分组成:开发组件和运行组件。开发组件: Windows Sockets 实现文档、应用程序接口 API 引入库和一些头文件。运行组件: Windows Sockets 应用程序接口的动态链接库 WINSOCK.DLL 。2.4.1 节 Socket套接字( Socke

7、t)最初是由加利福尼亚高校 Berkeley 分校为 UNIX 操作系统开发的网络通信接口,随着UNIX操作系统的广泛使用,套接字成为当前最流行的网络通信应用程序接口之一 7。90 岁月初,由 Sun Microsystems, JSB Corporation,FTP software, Microdyne 和 Microsoft 等几家公司共同制定了一套标准,即 Windows Sockets规范。Windows Sockets API 是 Microsoft Windows 的网络程序设计接口,它在继承了Berkeley Sockets 主要特点的基础上,又对它进行了重要扩充。这些扩充主要

8、是供应了一些异步函数,并增加了符合Windows 消息驱动特性的网络大事异步挑选机制。这些扩充有利于应用程序开发者编制符合Windows 编程模式的软件,它使在Windows 下开发高性能的网络通信程序成为可能。Socket 实际上是指一个通信端点,借助于它,用户所开发的Socket 应用程序, 可以通过网络与其它 Socket应用程序进行通信。近年来,随着运算机网络与Windows 95 的流行,很多用户所开发的应用程序需要实现网络间的数据通信。2.4.2 节 开发 Windows Sockets 网络通信程序的软、硬件环境所采纳的操作系统软件可以是 Windows 95,2000,XP,也

9、可以是 Windows NT ,由于它们都支持 Windows Sockets API,在以下的介绍中,我们将以在 Windows XP 环境下的开发为例。所采纳的编程语言一般可选目前较流行使用的可视化和采纳面对对象技术的Microsoft Visual C+ 6.0 。Visual C+ 6.0 可在 Windows XP 或 Windows NT 环境下运行,其开发系统增加了全面集成的基于Windows 的开发工具以及一个基于传统C/C+开发过程的“可视化”用户界面驱动模型。Visual C+ 6.0 中的 Microsoft 基类(MFC ,即 Microsoft Foundation

10、Class库是一系列 C+类,其中封装着为Microsoft可编辑资料 - - - 欢迎下载精品名师归纳总结Windows 操作系统系列编写应用程序的各种功能。在有关套接字方面, Visual C+6.0 对原先的 Windows Sockets 库函数进行了一系列封装,继而产生了CSocket 、CSocketFile 等类,它们封装着有关Socket的各种功能 8。所采纳的网络通信协议一般是TCP / IP。Windows XP 和 Windows NT 都带有该协议。但是,所开发的网络通信应用程序并不能直接与TCP / IP 核心打交道,而是与网络应用编程界面 Windows Socke

11、ts API 打交道。 Windows Sockets API 就可直接与TCP/IP 核心进行沟通。 TCP / IP 核心协议连同网络物理介质(如网卡)一起,都是供应网络应用程序间相互通信的设施。2.4.3 节 CSocket 类编程模型使用 CSocket对象涉及 CArchive 和 CSocketFile 类对象。以下介绍的针对字节流型套接字的操作步骤中,只有第三步对于客户方和服务方操作是不同的,其他步骤都相同13 。( 1)构造一个 CSocket 对象。( 2)使用这个对象的Create成员函数产生一个socket 对象。在客户方程序中,除非需要数据报套接字, Create函数一

12、般情形下应当使用默认参数。而对于服务方程序,必需在调用Create 时指定一个端口。需要留意的是,Carchive 类对象不能与数据报( UDP )套接字一起工作,因此对于数据报套接字,CAsyncSocket 和CSocket 的使用方法是一样的。( 3)假如是客户方套接字,就调用CAsyncSocket Connect函数与服务方套接字连接。假如是服务方套接字,就调用 CAsyncSocket Listen 开头监听来自客户方的连接恳求,收到连接恳求后,调用 CAsyncSocket Accept函数接受恳求,建立连接。请留意 Accept成员函数需要一个新的并且为空的 CSocket 对

13、象作为它的参数,说明同上。(4) )产生一个 CSocketFile 对象,并把它与 CSocket对象关联起来。(5) )为接收和发送数据各产生一个CArchive 对象,把它们与 CSocketFile 对象关联起来。切记 CArchive 是不能和数据报套接字一起工作的。(6) )使用 CArchive 对象的 Read、Write 等函数在客户与服务方传送数据。(7) )通讯完毕后,销毁CArchive 、CSocketFile 和 CSocket 对象。可编辑资料 - - - 欢迎下载精品名师归纳总结2.4.4 节 用 VC6.0 进行 Windows Sockets 程序开发的技术

14、要点( 1)同常规编程一样,无论服务器方仍是客户方应用程序都要进行所谓的初始化处理,这部分工作仍可采纳消息驱动机制来先期完成。( 2)一般情形下,网络通信程序是某应用程序中的一模块。在单独调试网络通信程序时,要尽量与采纳该通信模块的其它应用程序开发者商定好,统一采纳一种界面形式,即单文档界面SDI、多文档界面 MDI 和基于对话框界面中的一种(这在使用 AppWizard 形成工程 Project文件时有提示),尽管这并非必需,但可使通信模块在移植到所需的应用程序时省时省力,由于Visual C+ 6.0 这种可视化语言在给我们供应便利的同时,也给我们带来某些不便,譬如所形成的工程文件中的很多

15、相关文件与所采纳的界面形式亲密联系,很多消息驱动功能,随所采纳的界面形式不同而各异。 当然,也可将通信模块函数化,并形成一个动态连接库文件DLL 文件), 供主程序调用。( 3)以通信程序作为其中一个模块的应用程序往往不是在等待数据发送或接收完之后再做其它工作,因而在主程序中要采纳多线程(Multithreaded)技术。即将数据的发或收,放在一个具有肯定优先级(一般宜取较高优先级)的帮助线程中,在数据发或收期间,主程序仍可进行其它工作,譬如利用上一个周期收到的数据绘制 曲线 。Visual C+ 6.0 中的 MFC 供应了很多有关启动线程、治理线程、同步化线程、终止线程等功能函数 14 。

16、( 4)在很多情形下,要求通信模块应实时的收、发数据。譬如调用之的主程序以 0.5 秒为一周期,在这段时间内,要进行如下工作:接收数据,利用收到的数据进行运算,将运算结果发送到 其它运算 机节点,周 而复始 。我们在充 分利用Windows Sockets 的基于消息的网络大事异步挑选机制,用消息来驱动数据的发送和接收的基础上,结合使用其他措施,如将数据的收和发放在高优先级线程,在软件设计上,支配好时序,尽量防止在同一时间内,双方都在向对方发送大量数据的情形发生,保证网络要有足够的带宽等,胜利的实现了数据传输的实时性2 。第 3 章具体设计本章将从各个方面介绍本系统的设计。先从基本框架的设计动

17、身,然后逐步介绍好友治理、谈天模块、谈天室模块、传送文件模块、共享屏幕模块、白板模块、音、视频模块和调试模块,所以本章是本论文的重点。可编辑资料 - - - 欢迎下载精品名师归纳总结3.1 节 基本框架设计本节内容将介绍除各个功能模块外的设计,包括界面上的处理、保持好友在线列表等的处理。有些内容可能并不属性框架设计,但这些内容也不具有单独使用一节来介绍的必要,所以把这些内容也一并放到这些节来介绍。这也是为了区分设计四周的处理与各个功能模块的处理。3.1.1 节 宏和数据结构的定义程序中用到了很多宏和数据结构,这些宏和数据结构在多个模块中都有用到,因此程序中特的新建一个头文件Global.h,此

18、头文件里是程序中很到的宏和数据结构 的定义1 。在 StdAfx.h 文件包含 Global.h,在程序其他的方都可以使用Global.h 中的宏和定义的数据结构。这样处理仍有一个好处,假如需要修改某些宏的值,可以直接在 Global.h 中修改,而不用处处去找宏的定义,便利和快捷。3.1.2 节 程序配置文件程序中很多信息需要储存,比如用户名和热键,因些程序用到了配置文件,默认的配置文件名为conf.ini 。程序用读取和写入配置文件系列函数来治理此配置文件。3.1.3 节 主界面初始化用过 QQ 的人都知道, QQ 主面板总是处于其他程序的上面,而且QQ 在任务栏没有图标,而是把图标放到了

19、托盘区,另外,我们仍可以按Ctrl+Alt+Z默认的快捷键隐匿和显示 QQ 主面板。不但 QQ 是这样处理的,很多谈天软件都采纳此种处理方式。本设计也不例外,同样也要达到这样的目的。下面从各个方面来说明本设计的处理方式:(1) )不在任务栏显示图标CDialog dlgParent。dlgParent.Create IDD_DIALOG_BG 。dlgParent.ShowWindow SW_HIDE 。CInstantMessagingDlg dlg &dlgParent 。m_pMainWnd = &dlg 。ModifyStyleEx WS_EX_APPWINDOW, 0 。可编辑资料

20、- - - 欢迎下载精品名师归纳总结上面代码就达到了程序主界面不在任务显示的目的。第一,我们创建一个对话框,并隐匿此对放框,然后把这个对话框作为主界面对话框的父窗口,然后在主界面对话框的初始化函数中修改其风格,去掉WS_EX_APPWINDOW风格。这样,主界面就不会显现在任务了 3 。(2) )将主界面放在最上层将程序放到顶层,很多程序都有这功能,比如金山词霸等,实现起来其实很简洁,只用一条语句就可以达到目的:SetWindowPos &wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE 。第一个参数就是将程序放到全部非顶层窗口的顶层,假如有多个程

21、序都是顶层窗口,那么他们谁在上面,就要看当前谁是激活的窗口。最终一个参数,是用位 或组后起来的,从字面意思上我们就能懂得到这是不移动不转变大小的意思,忽视了当中的 4 个参数6 。(3) )热键的处理设计中默认的热键是Ctrl+Alt+Z ,当然程序答应用户自己定义热键,自定义的热键将储存在 conf.ini 文件中。热键的功能可以隐匿、显示主界面,有消息到达时,按热键也可以打开谈天对话框。:RegisterHotKey m_hWnd, IDHOTKEY , m_wModifiers, m_wVirtualKeyCode 。使用全局函数 RegisterHotKey 可以注册热键,假如注册的热

22、键没有被其他程序占 用 , 那 么 注 册 胜利 。 注 册 成 功 后 , 如 果 按 热键 , 那 么程 序就 会 接 受 到WM_HOTKEY消息,因此我们仍需要自己处理 WM_HOTKEY消息12: void OnHotkey WPARAM wParam, LPARAM lParam 。BEGIN_MESSAGE_MAPCInstantMessagingDlg, CDialogON_MESSAGE WM_HOTKEY , OnHotkey /AFX_MSG_MAP END_MESSAGE_MAP在消息映射中,我们用 OnHotkey函数来处理 WM_HOTKEY消息。void CIns

23、tantMessagingDlg:OnHotkey WPARAM wParam, LPARAM lParam 可编辑资料 - - - 欢迎下载精品名师归纳总结if this-IsWindowVisible 可编辑资料 - - - 欢迎下载精品名师归纳总结elseShowWindow SW_HIDE 。ShowWindow SW_SHOW 。:SetForegroundWindow m_hWnd 。可编辑资料 - - - 欢迎下载精品名师归纳总结在 OnHotkey 函数中判定主界面是否是可见的,假如是可见的那么隐匿起来, 否就显示,并且把主界面设为前景窗口。(4) )最小化和关闭按钮的处理我们

24、期望单击程序右上角的最小化按钮时,程序隐匿起来,而单击关闭按钮时,程序会提示是否退出,而不会悄无声息的退出。void CInstantMessagingDlg:OnSysCommandUINT nID, LPARAM lParamif nID = SC_MINIMIZE 可编辑资料 - - - 欢迎下载精品名师归纳总结elsethis-ShowWindow SW_HIDE 。CDialog:OnSysCommandnID, lParam。可编辑资料 - - - 欢迎下载精品名师归纳总结void CInstantMessagingDlg:OnCancelifIDOK=MessageBox 要 退

25、 出 吗 ? , 退 出 ,MB_OKCANCEL|可编辑资料 - - - 欢迎下载精品名师归纳总结MB_ICONINFORMATION | MB_DEFBUTTON2 DestroyWindow 。在程序中处理OnSysCommand函数和 OnCancel 函数就实现了我们要的功能。(5) )托盘图标的显示至此,程序已不在任务栏显示图标,已是最顶层窗口,而且也已有热键功能,但是仍没有实现托盘图标的显示。实现托盘图标的代码如下:NOTIFYICONDATAm_nid。HICON hIcon=AfxGetApp-LoadIconSTATE_ONLINE 。m_nid.hIcon= hIcon。

26、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 的图标,把鼠标移动到图标上一会,仍会显现“即时谈天软件”的提示框。假如你们对图标有单击和双击

27、等操作,程 序 会 收 到 WM_SHELLNOTIFY消 息 , 因 此 , 我 们 仍 必 须 处 理WM_SHELLNOTIFY消息。void OnShellNotifyProc WPARAM wParam, LPARAM lParam 。BEGIN_MESSAGE_MAPCInstantMessagingDlg, CDialog/AFX_MSG_MAPCInstantMessagingDlg可编辑资料 - - - 欢迎下载精品名师归纳总结ON_MESSAGE WM_SHELLNOTIFY , OnShellNotifyProc /AFX_MSG_MAPEND_MESSAGE_MAPvo

28、idCInstantMessagingDlg:OnShellNotifyProcWPARAMwParam,LPARAM lParam if lParam = WM_LBUTTONDBLCLK else if lParam = WM_RBUTTONUP 与热键处理一样, OnShellNotifyProc 函数响应我们对图标的操作,其中lParam参数表示消息号,在本设计中只处理左键双击(显示主界面)和右键单击(弹出菜单)。在托盘添加图标,退出程序前,假如没有从托盘删除图标,那么托盘区的图标会始终保留下来,直到鼠标移过托盘区引起托盘区的重绘,这当然不是我们所期望的结果。void CInstant

29、MessagingDlg:OnDestroy/ 删除在托盘建立的图标:Shell_NotifyIcon NIM_DELETE, &m_nid 。CDialog:OnDestroy 。以上代码在程序退出时调用,从托盘从删除图标。(6) )只答应运行唯独实例可编辑资料 - - - 欢迎下载精品名师归纳总结这点与 QQ 不同,在一台机子上可以运行多个QQ,但本程序只答应运行一个实例。只答应运行一个实例,有多种方法,本设计采纳的是创建命名大事的方法:HANDLE hEvent = :CreateEvent NULL, FALSE, FALSE, InstantMessaging 。if hEvent

30、if ERROR_ALREADY_EXISTS = GetLastError return FALSE。大事与一般变量不一样,一般变量只在运行的当前程序中有效,而大事在整个系统中都有效。当首次运行程序时,会创建一个名为“InstantMessaging”的大事, 这个大事在系统范畴内有效,当再次运行程序时,程序会尝试着创建同名的大事,由于 之前 已经创建 了这个事 件 , 因此系 统会 返回 之前 创建 大事 的句 柄, 但GetLastError会返回 ERROR_ALREADY_EXISTS ,说明需创建的大事之前已经创建,为了保证只答应一个实例,这个实例就不再答应运行,直接返回,退出程序

31、。3.1.3 节 主界面布局程序主界面如下:可编辑资料 - - - 欢迎下载精品名师归纳总结图 3.1 主界面左上角显示的是自己的头像、状态和昵称。右上角的列表框是查找 IP 输入框, 下面是添加按钮。在下面一点的列表框是自己的址列表框,显示了自己的全部 IP。 主界面中心是用户列表框。最下面是 4 个功能按钮。用户列表框是一列一列的显示添加的好友,最左边是好友的头像。中部上边是 好友的昵称,下面是好友的IP。右下角是删除好友按钮和摄像头按钮,当然好友必需有摄像头才会显示摄像头按钮。有两种方式添加联系人:( 1)在右上解的查找 IP 输入框里输入IP,然后单击下面的添加按钮。也可以 从 IP

32、输入框里挑选以前加过的好友IP。程序答应储存 10 个最近联系人的 IP,当新添加联系人时,假如已储存了10 个联系人的 IP,程序会依据时间的先后次序掩盖之前的 IP。在列表框绽开下拉列表后,可以按DELETE 键删除选定的 IP。( 2)选定一个自己的 IP,然后单击“网段”按钮。此功能可以向选定IP 的 IP段发送添加恳求的消息,这相当于批量添加好友的功能。可编辑资料 - - - 欢迎下载精品名师归纳总结在主界面任何的点单击左键不放开,可以拖动程序。单击右键,会弹出菜单, 用户选中相应的菜单项,可以执行相应的功能。在任何的点双击左键,可以打开 “个人设置”对话框,如下:图 3.2设置对话

33、框最终一项“答应别人直接将我加为联系”的意思是别人添加我为好友时,不会弹出恳求对话框而直接加为好友。单击储存后,此对话框里的内容会储存到config.ini 配置文件中。运行程序后,会从 config.ini 读取用户信息,并在主界面中作相应的设置。在主界面,添加、谈天室、传送文件、共享屏幕和白板按钮都是自绘按钮,可 以显示图片,有提示才能,当鼠标移动到其上一会儿后,会弹出提示框,而且这些 按钮都具有 XP 风格,既鼠标滑过时会显示不同的状态。用户列表框也是自绘的,一般的列表控件无法显示我们所需的信息。自绘按钮和自绘列表框会作为一个单独的 模块来介绍,这儿就不作过多的介绍。3.1.4 节 自绘

34、按钮VC+6.0 自带的按钮控件不具有 XP 风格,而且也不能显示图像,作为一款好的软件,应当有个好的界面。在程序的主界面上,主要的按钮都采纳了自绘按钮,而不使用自带的按钮控件。AdvButton.h 和 AdvButton.cpp 是自绘按钮类的头文件和实现文件。在自绘按钮类中定义了如下成员变量:intm_nState。/ 按钮的状态CBitmapm_bmpNormal。/ 正常图标可编辑资料 - - - 欢迎下载精品名师归纳总结CBitmapm_bmpHover。/焦点图标CBitmapm_bmpDown。/按下图标CBitmapm_bmpDisable。/无效图标CToolTipCtrl

35、m_pToolTipCtrl 。/提示类m_nState 表示当前按钮的状态,可以为宏: NORMAL , HOVER , DOWN , DISABLE ,分别表示按钮正常状态、处于焦点状态、按下状态、无效状态,这 4 个宏的定义 在实 现文 件。 4 个 CBitmap 的变量分 别存 储 4 种 状态 下的图像。m_pToolTipCtrl 是提示工具控件类,既是鼠标在其上时,会弹出提示窗口。要实现按钮自绘,必需更新按钮的风格为自绘,可以在按钮的属性中更换,也可以使用代码更换。重载PreSubclassWindow,在这个函数中更换按钮风格并初始化 m_pToolTipCtrl 。void

36、 CAdvButton:PreSubclassWindowModifyStyle 0, BS_OWNERDRAW 。CButton:PreSubclassWindow。m_pToolTipCtrl.Create this, TTS_ALWAYSTIP 。m_pToolTipCtrl.SetDelayTime 100 。CString strText。GetWindowText strText 。m_pToolTipCtrl.AddTool this, strText 。VC+6.0 中的 ClassWizard 不能为我们添加鼠标离开的消息,只能为我们添加鼠标移动、单击等消息,我们得自己为自绘

37、按钮添加上鼠标离开的消息。TRACKMOUSEEVENT tme 。tme.cbSize = sizeof TRACKMOUSEEVENT 。tme.hwndTrack = m_hWnd。tme.dwFlags = TME_LEAVE。:_TrackMouseEvent &tme 。以上代 码告 诉系 统, 当鼠 标离开 m_hWnd 窗口 时,向 这个窗口发送一条WM_MOUSELEA VE 消息。下面的处理方式与热键和托盘通知消息的处理方式一可编辑资料 - - - 欢迎下载精品名师归纳总结样,自定义这个消息处理函数就行了。自绘按钮必需重载 DrawItem 函数,在 DrawItem 函数

38、中依据 m_nState 的值可以贴上不同的图,表示按钮的一不同状态。void CAdvButton:DrawItemLPDRAWITEMSTRUCT lpDrawItemStructif lpDrawItemStruct-itemState & ODS_DISABLED m_nState = DISABLE。switch m_nState case NORMAL:DrawNORMAL 。break。case HOVER:DrawHOVER 。break。case DOWN:DrawDOWN 。break。case DISABLE:DrawDISABLE 。break。default:brea

39、k。DrawNORMAL 、DrawHOVER 、DrawDOWN 、DrawDISABLE 分别画按钮的 4 种状 态。 当鼠标滑过或单击按钮 时, 更换 m_nState 的值, 然 后调 用Invalidate,强制按钮重绘。要使按钮无效,必需调用EnableWindow FALSE 函数可编辑资料 - - - 欢迎下载精品名师归纳总结来更换按钮的状态,我们也就无法更换m_nState 的值。 lpDrawItemStruct-itemState 的值表示了当前按钮的状态,可以检测lpDrawItemStruct-itemState,假如按钮是无效状态,就设置 m_nState为 DIS

40、ABLE ,否就不作转变。在画按钮的状态时,使用到了TransparentBlt函数,这个函数可以贴透亮位图。在 TransparentBlt最终一个参数中指定掩码色,贴图时掩码色就不会贴出来。要使用此函数,必需导入 msimg32.dll,在程序使用如下语句导入:#pragma comment lib, C:Program FilesMicrosoftVisual MSIMG32.LIB 3.1.5 节 自绘好友列表框一般的列表控件无法满意程序的要求,程序要求好友列表框可以显示好友的头像、好友昵称、好友 IP 和删除、摄像头按钮。FriendsListCtrl.h 和 FriendsList

41、Ctrl.cpp 是自绘列表框的头文件和实现文件。定义的成员变量如下:CInstantMessagingDlg*m_pMainDlg 。/ 主对话框CImageListm_imageList。/ 头像 图像列表intm_nCamera。/摄 像头激活的序号intm_nDelIcon。/ 删除 按钮激活的序号intm_nCurSel。/当 前选中用户序号可编辑资料 - - - 欢迎下载精品名师归纳总结与自绘按钮类似,在PreSubclassWindow函 void CFriendsListCtrl:PreSubclassWindow数中更换列表框的风格为自绘:可编辑资料 - - - 欢迎下载精品

42、名师归纳总结ModifyStyle 0, LVS_OWNERDRAWFIXED 。CListCtrl:PreSubclassWindow。重载 MeasureItem函数更换列表框每一项的高度:可编辑资料 - - - 欢迎下载精品名师归纳总结void CFriendsListCtrl:MeasureItem LPMEASUREITEMSTRUCT lpMeasureItemSt ruct lpMeasureItemStruct-itemHeight = DEFAULT_FRIENDSLIST_HEIGHT 。宏 DEFAULT_FRIENDSLIST_HEIGHT在 Global.h 文件定义

43、,表示好友列表框每项的高度。列表框中的鼠标离开消息与自绘按钮的实现是同一个原理,这儿就不再赘述。在向好友列表框中添加好友时,主对话框调用好友列表框的AddUser函数,参数为 USER 结构体,这个参数作为列表项的额外数据,这样重绘的时候再读取出这个额外数据就可以得到这一项的用户信息。鼠标在好友列表框上移动时,判定鼠标是否在删除或摄像头(假如有摄像头)按钮范畴内,假如在,就设置m_nDelIcon 或 m_nCamera为当前项的序号,否就就设置 m_nCurSel 为当前项的序号。用户双击鼠标时,调用主对框的相应函数,并把项的序号传给此函数。假如是单击,先判定m_nDelIcon、m_nCa

44、mera 值,假如不为 -1,就选中了删除或摄像头按钮,调主对框相应函数执行相应操作。在 DrawItem 函数中,先得到额外的附加数据,既是添加项时作为参数传递的USER 类型的变量,然后再依据m_nCurSel、m_nDelIcon 和 m_nCamera 的值自绘。在自绘时,为了防止闪耀,程序用到了双缓冲技术。双缓冲技术,就是先创建一个与目标设备兼容的内存设备上下文,在内存设置上下文中画图或进行其他处理,操作完成了,再一并把内存设备上下文的内容贴到目标设备上,这样就可以有效的防止闪耀。3.2 节 好友治理好友治理包括添加好友、删除好友以及与好友保持连接。3.2.1 节 添加好友添加好友的两种方式4.1 节已经介绍过了,这一节介绍的是具体的实现。第一然主对话框定义监听 Socket并初始化:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com