资源描述
摘要
随着21世纪的来临,计算机和数字化网络技术的发展,对传统的沟通方式带来了新的挑战,不再是以前那样面对面的聊天,而是要通过网络进行交流。通过学习熟悉VC++.NET的工具应用,熟悉和理解语音传输的基本原理。研究语音传输过程中的基本过程:采集,语音压缩,传输,解压缩,回放等等。实现局域网之间传递语音和文字,还有可以广播,即一个用户向多的用户同时传递语音和文字。可以添加,删除用户,音量调节,保存和清除记录,还可以对其进行参数设置。
关键词:VC++.NET,语音,采集,压缩,传输,回放
ABSTRACT
Along with 21st century approaching, the computer and the digitized network technology development has brought the new challenge to the traditional communication way, it no longer was old face-to-face chat, but must carry on the exchange through the network. Through the study of vc++. net tool application, I am familiar with and understand the basic principle of voice transmission, and research the basic process of voice transmission: Gathering, voice compressing, transmitting, decompressing, playback and so on. This system may realize the transmission of voice and text between the local area network, also it can broadcast, in another word, one user can transmit the voice and text to many users simultaneously. It can increase and delete the user, control the volume, preserve and eliminate the record, it may also set the parameter.
Keywords: VC++.NET,Voice,Gather,Compress,Transmit,Playback
目录
摘要 I
ABSTRACT II
第1章 开发背景及目标任务 1
1.1 课题的背景、意义和内容 1
1.2 主要任务与目标 1
第2章 系统开发环境 2
2.1 VC++.NET介绍 2
2.2 系统的开发环境 3
第3章 语音对讲的原理 4
3.1 基本原理 4
3.2 VoIP的基本传输过程 4
3.2.1 语音-数据转换 4
3.2.2 原数据到IP转换 4
3.2.3 传送 5
3.2.4 IP包-数据的转换 5
第4章 语音技术 6
4.1 语音采集 6
4.2 数据压缩 6
4.3 数据包传输 7
第5章 系统功能设计实现 8
5.1 添加用户模块 8
5.1.1用户A和用户B都是直接拨号上网 8
5.1.2用户A和用户B都使用路由拨号上网 10
5.1.3 用户A通过路由拨号上网及用户B直接拨号上网 12
5.2 音量控制模块 13
5.3 语音和文字聊天模块 13
5.4 参数设置模块 15
第6章 结论 17
致谢 18
参考文献 19
附录1 程序代码及讲解 20
- 26 -
第1章 开发背景及目标任务
1.1 课题的背景、意义和内容
随着21世纪的来临,计算机和数字化网络技术的发展,对传统的沟通方式带来了新的挑战,不再是以前那样面对面的聊天,而是要通过网络进行交流。计算机网络的飞速发展,使得人们可以享受到很多网络带来的便利。网上聊天也是网络给人们带来的众多便利之一。随着网络的普及化,网络做为人们互相沟通与交流联系的的现在化工具日益重要,可以说现在人们的生活已经离不开网络了。在现实生活中人们可以通过多种手段与家人亲戚朋友交流通讯,想电话和电子邮件等等。但是这些手段要么费用太高,要么实时性不强,要么一次只能和一位好友进行交流。于是就需要一种便宜,快速,能同时和多个好友进行的网络工具的出现,而网络聊天工具就是满足了这些需求,填补了这个空白。本课题的研究对传统的沟通方式进行挑战,能够使人们对语音对讲的方便性有更好的认识,不需要见面就可以交流了。
实现局域网之间传递语音和文字,还有可以广播,即一个用户向多的用户同时传递语音和文字。可以添加,删除用户,音量调节,保存和清除记录,还可以对其进行参数设置。
1.2 主要任务与目标
首先熟悉VC++.NET工具的基本应用,其次就是使用VC++.NET工具做出一个可以通过互联网实现电脑之间传递语音及文字的软件, 真正解决了局域网与局域网之间用户通话的难题,而且局域网内部也可以传递语音及文字。
通过软件可以通过互联网实现电脑之间传递语音及文字。也可在局域网内传递语音及文字。
第2章 系统开发环境
2.1 VC++.NET介绍
Visual C++是Microsoft公司推出的目前使用极为广泛的基于Windows平台的可视化编程环境。最新版本Visual C++7.0(Visual C++.NET)与以往版本相比,增加许多新的特性,这其中包括:Web应用程序、新颖的C#编程语言以及ATL、DCOM、MFC、数据库等方面的增强,尤其是在开发环境界面上变化更大,它采用平面化的操作界面,这一点有点类似Visual Basic,它的亲和性使得更多的程序开发人员乐意接受。
Visual C++ 7.0开发环境是平面化的界面,它除了具有和Windows窗口一样的标题栏、菜单栏、工具栏和状态栏外,最主要的是还有不一样的窗口区。窗口区是由Web浏览区、方案导航区、输出窗口区、属性窗口区以及其他窗口等组成。
Web浏览窗口是一个多功能的文档窗口,各种程序代码的源文件、资源内容、文档、Web页面等都可以通过该窗口显示出来。默认时,该浏览窗口显示的是Start页面。
方案导航区是由Solution Explorer(方案浏览)窗口、Class View(类查看)窗口及Resource View(资源查看)窗口等组成的,用来显示方案中的一些信息,包括类、工程文件、方案项目以及资源等。
输出窗口区是由Task List(任务列表)窗口、Command(命令)窗口、Output(输出)窗口及Find(查找)窗口等组成的,用来显示任务、编连信息、查找内容等。
属性窗口区是由Properties(属性)窗口、Dynamic help(动态帮助)窗口及Favorites(收藏)窗口等组成的,用来显示各种对象的属性、动态的帮助项目以及用户收藏的页面地址。
实际上,组成上述区域的窗口只分为两种类型,一是工具窗口,另一是文档窗口。文档窗口是动态产生的,当打开一个C++文件时或在方案导航区查看类、资源等具体内容时,就会在Web浏览区打开一个文档窗口用来显示相应的内容。
在Visual Studio.NET中,工具窗口往往可以进行如下操作:
Visual Studio.NET第一次运行时,窗口区中的各种窗口均处于停靠状态,任何时候用鼠标左键双击窗口标题栏,都会在浮动和停靠进行切换。用鼠标单击某个窗口不放,可将其拖放到整个窗口区的任何位置。这个位置可以任何一个窗口区(如属性窗口区等)的四边或是窗口区的其他窗口构成一组 。
需要说明的是,若单击某个工具窗口后,选择Window菜单中Dockable项,可将工具窗口显示在Web浏览区,同样的操作可将该工具窗口恢复到原来的位置。
自动隐藏是Visual Studio.Net新增的界面特性,它和任务栏的自动隐藏相类似。自动隐藏的功能够使文档窗口显示的内容更多,凡是自动隐藏的窗口区,都会在屏幕靠近的那一侧最小化,只显示出各窗口的名称标签。当用户将鼠标移动到某个窗口的标签时,该窗口就是自动滑出,当该窗口具有输入焦点时,它不会自动隐藏,一旦失去焦点,它又滑向屏幕的侧边,呈最小化状态。
需要说明的是,当用鼠标右击窗口的标题栏时,会弹出一快捷菜单,如图5所示,其菜单命令依次为Dockable(与Window菜单中Dockable项功能相同)、Hide(关闭)、Floating(浮动)、Auto Hide(自动隐藏)。
Visual Studio.NET支持多实例窗口,在同一时候可以为同一个窗口开辟多个实例。例如,用鼠标左击Web浏览窗口,使其处于活动状态,然后选择Window菜单的New Window项,就后同一个区域打开另一个相同的窗口。
除了上述窗口操作外,Visual Studio.NET还支持多个显示器的窗口以及TAB键链接等操作。
2.2 系统的开发环境
Visual Studio.NET的安装对计算机配置要求比较高,具体的配置说明如表2-1所示。
表2-1 Visual Studio.NET安装配置
配 置 项 目
配 置 要 求
处理器
PII 450 MHz (建议:PIII 733 MHz)
内存
128 MB (建议:256 MB)
硬盘空间
大约3GB(C:盘500MB)
配 置 项 目
配 置 要 求
显示卡
支持800×600显示模式(建议:1024×768显示模式)
光驱
必备
操作系统
Windows XP,Windows 2000,Windows NT 4
第3章 语音对讲的原理
3.1 基本原理
通过因特网进行语音通信是一个非常复杂的系统工程,其应用面很广,因此涉及的技术也特别多,其中最根本的技术是VoIP (Voice over IP)技术,可以说,因特网语音通信是VoIP技术的一个最典型的、也是最有前景的应用领域。因此在讨论用因特网进行语音通信之前,有必要首先分析VoIP的基本原理,以及VoIP中的相关技术问题。
所谓的VoIP是以IP分组交换网络为传输平台,对模拟的语音信号进行压缩、打包等一系列的特殊处理,使之可以采用无连接的UDP协议进行传输。
3.2 VoIP的基本传输过程
3.2.1 语音-数据转换
语音信号是模拟波形,通过IP方式来传输语音,不管是实时应用业务还是非实时应用业务,道貌岸首先要对语音信号进行模拟数据转换,也就是对模拟语音信号进行8位或6位的量化,然后送入到缓冲存储区中,缓冲器的大小可以根据延迟和编码的要求选择。许多低比特率的编码器是采取以帧为单位进行编码。典型帧长为10~30ms。考虑传输过程中的代价,语间包通常由60、120或240ms的语音数据组成。数字化可以使用各种语音编码方案来实现,目前采用的语音编码标准主要有ITU-T G.711。源和目的地的语音编码器必须实现相同的算法,这样目的地的语音设备帮可以还原模拟语音信号。
3.2.2 原数据到IP转换
一旦语音信号进行数字编码,下一步就是对语音包以特定的帧长进行压缩编码。大部份的编码器都有特定的帧长,若一个编码器使用15ms的帧,则把从第一来的60ms的包分成4帧,并按顺序进行编码。每个帧合120个语音样点(抽样率为8kHz)。编码后,将4个压缩的帧合成一个压缩的语音包送入网络处理器。网络处理器为语音添加包头、时标和其它信息后通过网络传送到另一端点。语音网络简单地建立通信端点之间的物理连接(一条线路),并在端点之间传输编码的信号。IP网络不像电路交换网络,它不形成连接,它要求把数据放在可变长的数据报或分组中,然后给每个数据报附带寻址和控制信息,并通过网络发送,一站一站地转发到目的地。
3.2.3 传送
在这个通道中,全部网络被看成一个从输入端接收语音包,然后在一定时间(t)内将其传送到网络输出端。t可以在某全范围内变化,反映了网络传输中的抖动。网络中的同间节点检查每个IP数据附带的寻址信息,并使用这个信息把该数据报转发到目的地路径上的下一站。网络链路可以是支持IP数据流的任何拓结构或访问方法。
3.2.4 IP包-数据的转换
目的地VoIP设备接收这个IP数据并开始处理。网络级提供一个可变长度的缓冲器,用来调节网络产生的抖动。该缓冲器可容纳许多语音包,用户可以选择缓冲器的大小。小的缓冲器产生延迟较小,但不能调节大的抖动。其次,解码器将经编码的语音包解压缩后产生新的语音包,这个模块也可以按帧进行操作,完全和解码器的长度相同。若帧长度为15ms,是60ms的语音包被分成4帧,然后它们被解码还原成60ms的语音数据流送入解码缓冲器。在数据报的处理过程中,去掉寻址和控制信息,保留原始的原数据,然后把这个原数据提供给解码器。
第4章 语音技术
4.1 语音采集
语音采集的原理是通过在离散的时间间隔采样原始声音并记录每次采样的数字来表示和重建声音波形。人耳能听到的声音是一种频率范围为20 Hz~20 000 Hz ,而一般语音频率最高为3 400 Hz。语音的采集是指语音声波信号经麦克风和高频放大器转换成有一定幅度的模拟量电信号,然后再转换成数字量的全过程。根据“奈奎斯特采样定理”, 采样频率必须大于模拟信号最高频率的两倍 ,由于语音信号频率为300~3 400 Hz ,所以把语音采集的采样频率定为8 kHz。语音的采集采样率的大小直接决定语音的清晰度和采集的原始数字数据量的大小。采集的声音数据的格式有很多标准,软件的设计中一般采用波形数据的格式。Windows系统中可以采用WAVE_FORMAT_PCM即PCM(脉冲编码调制)格式。
4.2 数据压缩
采样率可以为数据流采样后需要对音频数据进行压缩。采用什么样的压缩算法决定了压缩率的大小,这也是整个网络语音通信技术的核心和最关键的技术之一。IP语音通信主要使用的几个语音编码标准:G723.1,G728和G729。他们采用的都是混合编码的方法,如G.729语音压缩采用的算法是共轭结构的代数码激励线形预测(CSACELP),是基于CELP编码模型的算法。CODEC是一小段用于压缩(Compress)及解压缩(DECompress)数据流的代码。CODECs可以是由操作系统本身附带的几种标准的CODECs,如:DSPGroup TrueSpeech CODEC和MSG723.1 CODEC等,也可由系统中所安装的应用程序安装其他的CODECs。微软的Windows操作系统中,所有安装的CODECs由音频压缩管理器(ACM)管理。
4.3 数据包传输
压缩后打包的音频数据需要通过IP协议在网络中传输,但首先必须在传输层协议TCP或UDP中选择其一。UDP包不具备TCP包复杂的可靠性与控制机制,当强调传输性能(例如延时特性)而不是传输的完整性时,如:音频和多媒体应用,UDP是较好的选择。Winsock控件封装了许多网络传输所用到的API函数。通过Winsock控件,使网络编程变得轻松。 传输电信网大多采用时分多路复用方式,因特网须采用的是统计复用变长分组交换方式,二者相比,后者对网络资源利用率高,互连互通简便有效、对数据业务十分适用,这是因特网得以飞速发展的重要原因之一。
第5章 系统功能设计实现
本系统包括添加用户模块,音量控制模块,语音和文字聊天模块,参数设置模块,广播模块,登陆服务器模块,退出系统模块。
5.1 添加用户模块
5.1.1用户A和用户B都是直接拨号上网
用户A的网络环境:
公网地址:218.11.17.156
对讲程序安装的主机地址: 218.11.17.156
配置文件的信息为:
图5-1 AB直接拨号时A的网络环境
用户B的网络环境:
公网地址:234.98.209.6
对讲程序安装的主机地址: 234.98.209.6
配置文件的信息为:
图5-2 AB直接拨号时B的网络环境
现在用户A添加好友的时候,界面如下:
图5-3 用户A添加好友
现在用户B添加好友的时候,界面如下:
图5-4 用户B添加好友
批量添加用户的时候,界面如下:
图5-5 批量添加好友
这样在界面的地方就会显示不出名字,主要原因是大批量添加,取名字有一定的困难。就会显示如下图所示:
图5-6 批量添加好友时存在的问题
5.1.2用户A和用户B都使用路由拨号上网
用户A的网络环境:
公网地址:218.11.17.156
对讲程序安装的主机地址: 192.168.0.2
配置文件的信息为:
图5-7 AB同时用路由拨号时A的网络环境
其中 serverport 和 server_dataport 以路由器上的设置为准。
用户B的网络环境:
公网地址:234.98.209.6
对讲程序安装的主机地址: 192.168.0.12
配置文件的信息为:
图5-8 AB同时用路由拨号时B的网络环境
其中 serverport 和 server_dataport 以路由器上的设置为准。
现在用户A添加好友的时候,界面如下:
图5-9 A用户添加新用户
命令端口号和数据端口号 以路由器上的设置为准。
现在用户B添加好友的时候,界面如下:
图5-10 B用户添加新用户
命令端口号和数据端口号 以路由器上的设置为准。
5.1.3 用户A通过路由拨号上网及用户B直接拨号上网
用户A的网络环境:
公网地址:218.11.17.156
对讲程序安装的主机地址: 192.168.0.2
配置文件的信息为:
图5-11 A路由拨号,B直接拨号时A的网络环境
其中 serverport 和 server_dataport 以路由器上的设置为准。
用户B的网络环境:
公网地址:234.98.209.6
对讲程序安装的主机地址: 234.98.209.6
配置文件的信息为:
图5-12 A路由拨号,B直接拨号时B的网络环境
现在用户A添加好友的时候,界面如下:
图5-13 A用户添加好友
现在用户B添加好友的时候,界面如下:
图5-14 B用户添加好友
命令端口号和数据端口号 以路由器上的设置为准。
5.2 音量控制模块
点击图标就会弹出“弹出式菜单”音量控制了,这个比较简单,点击“音量增加(Ctrl+up)”语音对讲的时候音量就会变大了。点击“音量减少(Ctrl+down)“这样语音对讲的音量也会减少了。
5.3 语音和文字聊天模块
整个的模块界面如下图:
图5-15 模块界面
当你选择如上图中的“发消息给“后面的用户也可以进行聊天。在编辑框中输入你需要的信息再按”Ctrl+Enter“就可以发送消息了。你也同时可以保存你们的聊天信息,如保存私人消息,也可以保存广播消息,同样也可以清空所有的消息,对话框中还有个打开声音提示和关闭窗口按钮。
当点击保存消息的时候会弹出(图5-16)窗口:
只要你输入文件名即可。文件是以文本格式TXT存储的。还有点击清空消息的时候,刚才输入的消息也会全部被清空了。
其中语音聊天要在(图5-17)中点击右键你要聊天的人物这一行就行了,选择“开始语音对讲”即可。
图5-16 保存界面
图5-17 语音聊天界面
5.4 参数设置模块
当点击“参数设置“就会出现如下界面:
图5-18 窗口设置界面
你可以根据你的需要进行选择,你可以选择“是否需要确认才接收对方语音对讲的请求“,同样你也可以选择”收到文字后是否需要语音提示“,还有一些其他的选择,如可以设置音频属性,还有其他等等。
其他的模块:广播模块,登陆服务器模块,退出系统模块。这些功能是比较简单的,按照字面理解就行了,这里就不做介绍了。
第6章 结论
通过本次毕业设计,还有校外实习公司的指导老师的耐心指导和自身的学习及努力,使我对C ++知识有了进一步的提高,同时对本次毕业设计所涉及的语音方面的知识也有了一定的认识。在整个设计过程中我也深深地体会到要把所学的知识理论变成可实际应用的系统时所面临的种种困难,认识到提高运用知识、解决实际问题的能力是十分重要的。
在设计与实现的过程中,也遇到了不少问题,但是,在老师的帮助指导和本人的努力下,本课题所涉及的难题、重点都已基本解决,满足本次毕业设计的系统要求。但是由于设计经验的不足和所掌握知识的限制,本系统的有些功能还不是很完善。通过本次设计的学习和实践,使我的理论知识有了进一步的加强,实践能力和独立思考的能力都得到了提高,这是我在书本上所学不到的。
致谢
在这整一学年的学习实践中,我要感谢我的老师,同学,校外指导老师,是他们无私的帮助才能使我顺利完成毕业设计;是他们无私的帮助才使我有信心去战胜困难,是他们无私的帮助才使我有了更高的起点。
在论文即将完成之际,我首先向我的指导老师致以深切的谢意。感谢老师在整个设计过程中给我无私的指导和帮助,感谢他日常的教诲。在此,再一次向老师致以最真挚的谢意!
参考文献
[1] 胡涛.Visual C++.NET 编程技术体验[M].电子工业出版社, 2003.7:25-40.
[2] (美)Harvey M.Deitel,Paul J.Deitel . Visual C++.NET高级编程[M]. 清华大学出版社,2004.7:134-145.
[3] (美)Chris H.Pappas,William H.Murray .Visual C++.NET完全手册[M].电子工业出版社,2002.10:57-68.
[4] 刘廷,白晓春.Visual C++.NET开发实例完全剖析[M].中国电力出版社, 2006.1:29-36.
[5] 马展,李守勇等.Visual C++.NET网络与通信高级编程范例[M].清华大学出版社,2005.1:36-57.
[6] 萧蔚等.Visual C++.NET编程方法与技巧[M].电子工业出版社,2002.8:234-245.
[7] 唐大仕,刘光.Visual C++.NET应用教程[M].清华大学出版社/北京交通大学出版社,2006.5:64-75.
[8] 杨富国,王浩,唐巧琪.Visual C++ 程序开发案例解析[M].清华大学出版社,2006.4:35-47.
[9] 位元文化.精通Visual C++.NET 2003窗口程序设计[M].清华大学出版社,2006.11:47-59.
[10] 陈坚 等.Visual C++.NET编程基础专家教程[M].西安电子科技大学出版社,2002.3:152-163.
[11] 陈红 等.C++网络高级编程[M]..北京人民邮电出版社 ,年卷期: 2002
附录1 程序代码及讲解
其中OnInitDialog()函数是用来初始化,OnBnClickedButton2()来退出程序,OnBnClickedCheck2()来显示用户设置情况。
// AddFriendDlg.cpp : 实现文件
void CAddFriendDlg::OnBnClickedButton2()
{ // TODO: 在此添加控件通知处理程序代码
::AFX_MANAGE_STATE( ::AfxGetStaticModuleState() ) ;
CDialog::OnCancel() ;
}
BOOL CAddFriendDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: 在此添加额外的初始化
((CButton*)GetDlgItem( IDC_CHECK1 ) )->SetCheck( 1 ) ;
((CEdit*)GetDlgItem( IDC_SERVADDR ) )->EnableWindow( FALSE ) ;
((CEdit*)GetDlgItem( IDC_SERVPORT ) )->EnableWindow( FALSE ) ;
((CEdit*)GetDlgItem( IDC_SERVER_DATAPORT ) )->EnableWindow( FALSE ) ;
return TRUE; // return TRUE unless you set the focus to a control
// 异常:OCX 属性页应返回 FALSE
}
void CAddFriendDlg::OnBnClickedCheck2()
{ // TODO: 在此添加控件通知处理程序代码
bool check = ((CButton*)GetDlgItem( IDC_CHECK2 ))->GetCheck();
if ( check )
{
((CEdit*)GetDlgItem( IDC_SERVPORT ) )->EnableWindow( TRUE ) ;
((CEdit*)GetDlgItem( IDC_SERVER_DATAPORT ) )->EnableWindow( TRUE ) ;
}
else
{
((CEdit*)GetDlgItem( IDC_SERVPORT ) )->EnableWindow( FALSE ) ; ((CEdit*)GetDlgItem( IDC_SERVER_DATAPORT ) )->EnableWindow( FALSE ) ;
}
}
其中volumcontrol()构造函数来初始化。~volumcontrol()析够函数。Close()函数是用来关闭的。GetValue(DWORD *vl,DWORD *vr)函数来得到当前的声音。
SetValue(DWORD vl,DWORD vr)函数来设置声音大小。
// volumcontrol.cpp: 实现声音控制类
volumcontrol::volumcontrol()
{
m_max=0;
m_min=0;
}
volumcontrol::~volumcontrol()
{
}
void volumcontrol::Close()
{
if (m_hMixer != NULL)
{
::mixerClose(m_hMixer);
m_hMixer = NULL;
}
}
DWORD volumcontrol::GetMax()
{
return m_max;
}
DWORD volumcontrol::GetMin()
{
return m_min;
}
DWORD volumcontrol::GetValue(DWORD *vl,DWORD *vr)
{
if (m_hMixer == NULL) return -1;
MIXERCONTROLDETAILS_SIGNED mxcdVolume[2];
MIXERCONTROLDETAILS mxcd;
*vl=-1;
*vr=-1;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = m_controlid;
mxcd.cChannels = m_controlnum;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_SIGNED);
mxcd.paDetails = mxcdVolume;
if (::mixerGetControlDetails((HMIXEROBJ)m_hMixer,
&mxcd,
MIXER_OBJECTF_HMIXER |
MIXER_GETCONTROLDETAILSF_VALUE)
!= MMSYSERR_NOERROR)
return -1;
*vl=mxcdVolume[0].lValue;
if(m_controlnum==2) *vr=mxcdVolume[1].lValue;
return 1;
}
void volumcontrol::SetValue(DWORD vl,DWORD vr)
{
MIXERCONTROLDETAILS_SIGNED mxcdVolume[2] = {vl,vr};
MIXERCONTROLDETAILS mxcd;
mxcd.cbStruct = sizeof(MIXERCONTROLDETAILS);
mxcd.dwControlID = m_controlid;
mxcd.cChannels = m_controlnum;
mxcd.cMultipleItems = 0;
mxcd.cbDetails = sizeof(MIXERCONTROLDETAILS_SIGNED);
mxcd.paDetails = &mxcdVolume;
if (::mixerSetControlDetails((HMIXEROBJ)m_hMixer,
&mxcd,
MIXER_OBJECTF_HMIXER |
MIXER_SETCONTROLDETAILSF_VALUE)
!= MMSYSERR_NOERROR) return ;
}
AddStringToPrivateEdit( const char *str )函数用来把收到的字符串加到私有edit里面,AddStringToPublicEdit( const char *str )函数用来把收到的字符串加到公有edit里面。ClearPrivateEditContent()函数用来清空私有edit里面的所有消息,ClearPublicEditContent()清空公有edit里面的所有消息。
// CharChatDlg.cpp : 实现文件
//把收到的字符串加到私有edit里面
void CCharChatDlg::AddStringToPrivateEdit( const char *str )
{
::AFX_MANAGE_STATE( ::AfxGetStaticModuleState() ) ;
CString tmpStr ;
((CEdit*)GetDlgItem( IDC_PRI_MSG ) )->GetWindowText( tmpStr ) ;
if ( tmpStr != "" )
{
tmpStr += "\r\n" ;
}
tmpStr += str ;
((CEdit*)GetDlgItem( IDC_PRI_MSG ) )->SetWindowText( tmpStr ) ;
}
//把收到的字符串加到公有edit里面
void CCharChatDlg::AddStringToPublicEdit( const char *str )
{
::AFX_MANAGE_STATE( ::AfxGetStaticModuleState() ) ;
CString tmpStr ;
((CEdit*)GetDlgItem( IDC_PUB_MSG ) )->GetWindowText( tmpStr ) ;
if ( tmpStr != "" )
{
tmpStr += "\r\n" ;
}
tmpStr += str ;
((CEdit*)GetDlgItem( IDC_PUB_MSG ) )->SetWindowText( tmpStr ) ;
}
//清空私有edit里面的所有消息
void CCharChatDlg::ClearPrivateEditContent()
{
::AFX_MANAGE_STATE( ::AfxGetStaticModuleState() ) ;
((CEdit*)GetDlgItem( IDC_PRI_MSG ) )->SetWindowText( "" ) ;
}
//清空公有edit里面的所有消息
void CCharChatDlg::ClearPublicEditContent()
{
::AFX_MANAGE_STATE( ::AfxGetStaticModuleState() ) ;
((CEdit*)GetDlgItem( IDC_PUB_MSG ) )->SetWindowText( "" ) ;
}
m_pCharSocket = NULL ;
}
SetDirPath( const char *path )函数是用来设置路径的,EnableDefaultHost( BOOL bEnable)函数是用来显示默认主机,后来的函数是用来显示设置的。
// SetDlg.cpp : 实现文件
// CSetDlg 消息处理程序
void CSetDlg::SetDirPath( const char *path )
{
strcpy( m_strDirPath , path ) ;
}
void CSetDlg::EnableDefaultHost( BOOL bEnable )
{
((CListBox*)GetDlgItem( IDC_ALL_USERS ) )->EnableWindow( bEnable ) ;
((CListBox*)GetDlgItem( IDC_DEFAULT_USER ) )->EnableWindow( bEnable ) ;
((CButton*)GetDlgItem( IDC_UP ) )->EnableWindow( bEnable ) ;
((CButton*)GetDlgItem( IDC_DOWN ) )->EnableWindow( bEnable ) ;
((CButton*)GetDlgItem( IDC_ADD_USER ) )->EnableWindow( bEnable ) ;
((CButton*)GetDlgItem( IDC_REMOVE_U
展开阅读全文