• 263.50 KB
  • 2022-04-22 11:47:03 发布

网络可视电话的软件设计计划书.doc

  • 75页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'网络可视电话的软件设计计划书目录摘要2ABSTRACT3第一章引言51.1课题背景51.1.1背景知识51.1.2可视电话的基本结构和核心技术51.1.3开发系统的几点建议61.2相关技术介绍61.2.1结构化生命周期法简介61.2.2开发技术——快速原型法简介71.2.3本系统开发方法的选择8第二章系统目标8第三章系统需求分析93.1系统使用协议93.2性能参数93.3功能需求103.3系统运行环境103.4MFC简述113.5服务器与客户端SOCKET设计11第四章系统设计114.1概要设计114.2流程图124.3详细设计134.3.1模块的使用134.4程序设计144.4.1程序窗口的设计14第五章结论255.1关键技术255.2总结25第六章设计总结27第七章谢辞28参考文献29附录3075 第一章引言1.1课题背景1.1.1背景知识 电话作为人们日常生活、工作中不可缺少的通信工具,以其方便、快捷等特点被广泛应用,但普通电话机只能提供语音通信服务。可视电话使人们在通话时不仅能够听到对方的声音,而且还能够看到对方的图像。它不仅适用于家庭生活,而且还可以广泛应用于各项商务活动、远程教学、保密监控、医院护理、医疗诊断、科学考察等不同行业的多种领域,因而有着广阔的市场前景。  1964年,美国贝尔实验室提出了第一个可视电话解决方案。但是由于受各种技术条件的限制,可视电话一直没有取得实质性进展。八十年代末,随着通信、计算机、语音和视频编解码技术的不断发展,可视电话在世界各国得到了迅速发展。为了实现互联互通,以推动可视电话和视频会议系统的发展,国际电信联盟(ITU-T)于九十年代推出了包括H.310、H.320、H.321、H.322、H.323和H.324的系列多媒体通信标准。  在上述标准中,以H.320、H.324和H.323应用最为广泛。近年来,由于IP网的迅猛发展,基于H.323的可视电话终端和会议电视系统逐渐占据了主导地位,各大厂商纷纷推出基于H.323的应用。值得注意的是,基于会话发起协议(SIP)的可视电话也开始出现。1.1.2可视电话的基本结构和核心技术1.可视电话的基本结构75   ITU-T推出的H.32X系列标准是框架性协议,服从不同标准的可视电话终端,具有类似的结构。可视电话的基本结构包括视频输入/输出单元、视频编解码器、语音输入/输出单元、语音编解码器、延时单元、数据处理单元(可选)、系统控制单元、多媒体数据复用/解复用单元和网络接口单元。不同的标准适用的网络不同,因此有不同的通信控制协议、多媒体数据打包协议和不同的网络接口单元,但是视频和语音输入/输出单元、视频编解码器、语音编解码器相似。  语音和视频压缩技术是可视电话的核心技术。可视电话作为一种消费产品,要想走入寻常百姓家,必须能够提供足够好的语音和视频质量,同时占用的信道带宽要尽量小。语音编码技术和视频编码技术的发展就是围绕着上述两点展开的:在保证压缩后语音和图象质量的同时,尽量提高压缩效率。我们在具体选用语音和视频压缩标准的时候,也要结合这两点来选择。2.语音编码技术  语音通信是可视电话最基本的功能。受网络条件的限制,可视电话通常工作在较低码率下。为了适应这种低码率语音应用,ITU-T推出了G.72X系列语音压缩标准。其中G.723.1、G.728、G.729和G.729A,在可视电话中得到了广泛应用。表1列出了各个语音标准所采用的技术、码率、时延和语音质量等。本文所论述的网络可视电话的软件就是依照这种方式进行的。1.1.3开发系统的几点建议(1)、开发系统不必贪大求全,力争简单实用。应从大处着眼,小处着手,循序渐进,逐步完善。(2)、对开发过程中的各种文档应当注意保存。这是系统开发所要求的必要条件。(3)、尽可能取得对程序设计重视,使用简化的程序代码保证整个系统开发的清晰。1.2相关技术介绍1.2.1结构化生命周期法简介结构化生命周期法是一种传统的系统开发方法,其基本思想是把整个系统开发过程分成若干个阶段,每个阶段进行若干活动,每项活动应用一系列标准、规范、方法和技术,完成一个或多个任务,形成符合给定规范的产品。采用结构化生命周期法来开发系统时,应遵循的主要原则:(1)、用户参与的原则75 (2)、“先逻辑后物理”的原则(3)、“自顶向下”的原则(4)、工作成果描述(主要指文档)标准化的原则其具体开发步骤可分为以下四步:a系统规划b系统开发c系统的运行及维护d系统评价其中系统开发又分为以下四个步骤:(a)系统分析.系统初步调查.系统可行性研究.现行系统的详细调查.新系统逻辑方案的提出(b)系统设计.系统总体结构设计系统总体功能设计.系统总体物理结构设计系统详细设计.代码设计.输入输出设计(c)系统实施.程序设计系统测试1.2.2开发技术——快速原型法简介快速原型法是8075 年代发展起来的,旨在缩短开发周期,提高开发效率和用户对系统的满意程度。其基本思想是在系统开发的初期,尽快构造出系统的原型,使用户能及早地运行这个系统原型,通过使用它、熟悉它,受到启发并取得经验,然后对系统的目标和功能提出更精确、具体的要求,研制人员据此逐渐修改和完善原型,使它满足用户的需求,最后完成系统的开发。该方法大大提高了系统开发效率,弥补了结构化生命周期法来开发的时间长的缺陷。通常采用原型法需要以下四个阶段:(1)、明确用户的基本要求(2)、研制系统的原型(3)、使用、评价系统原型(4)、修改和完善原型1.2.3本系统开发方法的选择基于以上开发方法的优劣和本系统的实际情况,本系统总体上采用结构化生命周期法进行系统规则、系统分析和系统设计,但在系统实施阶段采用原型法。在开发程序的方法上,本系统将采用VISUALC++开发工具编制一个网络可视电话的软件,用以实现客户端与服务端管理。第二章系统目标开发一个网络可视电话的软件,将能够体现windows平台下使用网络通话的功能。具体目标是,分网络传输部分、音频输入、音频输出、视频输入、视频输出、音频视频压缩、音频波形显示、界面。共创建个线程,音频输入线程、音频输出线程(这两个有WINAPI隐式创建)、音频视频压缩传送线程和主线程。因为音频的采样率比视频采样率高得多,这里的音频的采样率为8000Hz而视频仅为20左右,所以从宏观来看,音频是连续的,而视频是非连续的,这也就是无须为视频输入输出创建独立线程的原因。l网络传输:基于UDP协议,有两组SOCKET,一组用于指令发送和接受(要求可靠),另一组负责音频视频数据的传送和接受(不保证可靠性)。l音频输入:通过waveIn函数族完成连续的录音l音频输出:通过waveOut函数族完成连续的放音75 l视频输入:通过cap函数族对视频进行捕获l视频输出:通过cap函数族实现视频输出l音频视频压缩:音频压缩采用G.729标准(8:1,1kbps),视频压缩采用H.263+标准l音频波形显示:将PCM音频数据以波形动态地显示出来l界面:与用户交互第三章系统需求分析3.1系统使用协议网络传输采用UDP协议,音频压缩采用G.729标准,视频压缩采用H.263标准3.2性能参数l以音频帧为基准,每帧音频数据有240个采样点,时间为240*1000/8000=30ms,8000为音频的采样率。l数据接收端队列缓冲延迟:30*3=90msl数据发送端录音延迟:30msl数据压缩解压耗时:<40msl网络延迟:<100ms>l总延迟:<260msl根据VOIP标准,总延迟<300ms是人可以接受的,以上计算是保守的,实际情况可能会好得多。l视频格式:176*144,24bitl带宽需求  数据类型带宽需求(byte/sec)带宽总需求(Kbyte/sec)音频1000~9.2*2(视频质量一般的情况下)视频~8000(会随图象质量的变化而有较大变化)75 帧头~2003.3功能需求基于系统需求分析,该系统需要实现以下基本功能:l软件一般自动运行(当操作系统启动时运行),与服务器通讯,向服务器传送登录信息.注:目前并没有服务器介入,而直接是客户与客户的通讯l进入监听状态,等候呼叫l呼叫,可以从地址簿呼叫,也可直接打入IP呼叫l与被叫方取得联系后,等待发送方回应,当超过一定时间或由用户终止时,取消呼叫l被叫方接受呼叫请求时,开始实时视频通讯,直到任意一方中断对话或非人为中断(图1,数据发送示意)3.3系统运行环境系统运行环境:Windows2000及其以上75 3.4MFC简述MFC(MicrosoftFoundationClass)指的是Microsoft基础类,是用来为Windows开发C++GUI应用程序。MFC是一种十分优秀的工具,使得面向对象的软件函数包装技术演变成为一种可以进行代码复用、简化了程序的复杂性并使程序更加有效的软件开发环境..对于使用WindowsAPI进行应用程序开发的人员来说,MFC使程序员大大提高了程序开发效率.你不必创建GDU对象,不必编写许多代码行对这些对象进行初始化,并且小心地跟踪其生命周期的运行情况,你只需建立一个MFC类的实例,使用其默认值,然后让撤消程序来清除系统资源即可.3.5服务器与客户端SOCKET设计本程序都采用sock的DLL模型,该模型允许应用程序以Windows消息的形式接收网络事件通知。这个模型是为了适应Windows的消息驱动环境而设置的,用于对性能要求不高的网络应用程序,最大可连接64个客户端。使用该模型基本满足本程序要求。第四章系统设计4.1概要设计本次毕业设计的内容就是设计出网络可视电话系统,在此基础上实现系统模型各个子系统的基本功能。此系统用建立一个sock的DLL文件来进行网络可视电话的网络数据。在系统功能需求分析的基础上,结合VisualC++程序编制的特点,得到下图所示的系统功能模块图。75 服务器端监听连接发送连接命令接受数据消息截取新的图象、声音实时显示图象或声音图4-1服务端模块客户端连接远程服务器发送连接消息接受数据消息截取新的图象、声音实时显示图象或声音实时更新棋盘图4-2客户端主模块4.2流程图下面用我们用数据流图(DFD,DataFlowDiagram),也就是从数据传递和加工的角度,以图形的方式刻画数据流从输入到输出的移动变换过程。如下图所示:75 本图只是画出了系统得一部分的功能流程图,因为本程序是一个windows程序,由较多的功能,主要是基于消息驱动的,所以有一些功能不能有流程图表达出来,如,消息的传递,当系统接到客户端传递来的信息后,就调用一个函数,将随机的产生出一些信息。让图象能在第一时间显示出来。4.3详细设计4.3.1模块的使用1、AVIOMgr是一个可视通信的通用模块,在NetTalk中是一个独立的模块,对它进行一些简单的处理,可以做成静态库、动态库或ActiveX控件,以用于其他软件。AVIOMgr封装了包括:视频采集、视频压缩、音频采集、音频压缩、音频播放、数据传输、命令控制等一系列与可视通讯有关的功能。一切对AVIOMgr的控制和AVIOMgr的信息反馈仅通过几个简单的消息和几个简单的函数调用就能完成。VFW函数族中某些函数的疑惑:capDriverConnect75 capDriverDisconnect这两个函数的调用必须在同一个线程内,而且似乎还必须同在主线程内,否则就会造成capDriverDisconnect的调用失败,具体是何原因还不太清楚。2、对Socket(UDP)编程的一些看法:sendtorcevfrom是阻塞型的函数,通过WSASelect等函数的调用,可以把这两个函数变成非阻塞的(异步),这需要创建用来接收消息的窗口,在调用WSASelect的时候,隐含地创建了一个线程。而我却习惯于用阻塞型的,创建一个线程,其中有一个循环,不断调用rcevfrom。有些书上说异步的效率要高一些,当我觉得我这种方法的效率不会低。以前做过的第三只眼远程控制软件和NetTalk均采用这种结构,并未发现任何性能上的不足。4.4程序设计4.4.1程序窗口的设计由于此应用程序采用的是基于对话框的开发,系统应用程序的各个不同功能是通过选择主对话框窗口中的不同按钮来完成的,每个功能模块由一个或多个对话框实现。该应用程序的主对话框(即运行应用程序后出现的对话框)如图所示:本文系统整个系统的调用主要是通过系统的模块进行组成和完善的,系统的呼叫,可以直接对已经设置好的IP或用户名,进行呼叫。通讯录可以对自己经常用到的用户进行保存IP,以便下一次的联系。设置是快捷方式或者本系统的一般配置。建立好后,就可以输入代码(以下是部分程序代码)://NetTalk75 //主窗口消息LRESULTCMainWnd::WndProc(UINTuMsg,WPARAMwParam,LPARAMlParam){switch(uMsg){caseWM_HOTKEY://热键弹出if(wParam==1){ShowWindow(m_hWnd,SW_SHOWNORMAL);SetForegroundWindow(m_hWnd);SetActiveWindow(m_hWnd);}break;caseWM_USER_SETUP:OnSetup((SETUP*)lParam);break;caseWM_TRAYNOTIFY:OnTrayNotify(wParam,lParam);break;caseIOM_AUDIO:OnAudioData((BOOL)wParam,(CAVIOMgr*)lParam);break;caseWM_INITDIALOG:returnOnInitDialog();caseWM_DESTROY:OnDestroy();break;caseWM_CLOSE:OnClose();break;caseWM_LBUTTONDOWN:{POINTpoint;point.x=GET_X_LPARAM(lParam);point.y=GET_Y_LPARAM(lParam);OnLButtonDown(wParam,point);}break;caseWM_LBUTTONUP:{POINTpoint;point.x=GET_X_LPARAM(lParam);point.y=GET_Y_LPARAM(lParam);75 OnLButtonUp(wParam,point);}break;caseWM_MOUSEMOVE:{POINTpoint;point.x=GET_X_LPARAM(lParam);point.y=GET_Y_LPARAM(lParam);OnMouseMove(wParam,point);}break;caseWM_COMMAND:returnOnCommand(wParam,lParam);break;caseWM_ERASEBKGND:OnEraseBkgnd((HDC)wParam);returnTRUE;caseWM_TIMER:OnTimer(wParam);break;caseWM_SETCURSOR:returnOnSetCursor((HWND)wParam,LOWORD(lParam),HIWORD(lParam));break;caseWM_CTLCOLOREDIT:return(LRESULT)OnCtrlColorEdit((HDC)wParam,(HWND)lParam);break;caseWM_CTLCOLORSTATIC:return(LRESULT)OnCtrlColorStatic((HDC)wParam,(HWND)lParam);break;caseIOM_NOTIFY:OnIOMNotify(wParam,lParam);break;caseWM_SLD:{if(((HWND)lParam)==((HWND)m_sldAudioOut)){//设置输出音量m_VoOutCtrl.SetCurrentVolume((m_VoOutCtrl.GetMaximalVolume()-m_VoOutCtrl.GetMinimalVolume())*m_sldAudioOut.GetPos()/100);}elseif(((HWND)lParam)==((HWND)m_sldAudioIn)){//设置输入音量75 m_VoInCtrl.SetCurrentVolume((m_VoInCtrl.GetMaximalVolume()-m_VoInCtrl.GetMinimalVolume())*m_sldAudioIn.GetPos()/100);}elseif(((HWND)lParam)==((HWND)m_sldVideoQ)){//设置视频质量m_VQ=m_sldVideoQ.GetPos();AVIO.SetVideoQuality(m_VQ);}}break;default:returnCDialogX::WndProc(uMsg,wParam,lParam);}returnTRUE;}SetWindowPos(m_hwndTT,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);/*INITIALIZEMEMBERSOFTHETOOLINFOSTRUCTURE*/ti.cbSize=sizeof(TOOLINFO);ti.uFlags=TTF_SUBCLASS;ti.hinst=hInstX;ti.uId=0;ti.lpszText=szTip;//ti.hwnd=m_btnClose;GetClientRect(m_btnClose,&ti.rect);strcpy(szTip,"关闭NetTalk");SendMessage(m_hwndTT,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);ti.hwnd=m_btnMin;GetClientRect(m_btnMin,&ti.rect);strcpy(szTip,"最小化");SendMessage(m_hwndTT,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);ti.hwnd=m_btnHelp;GetClientRect(m_btnHelp,&ti.rect);strcpy(szTip,"帮助");SendMessage(m_hwndTT,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);ti.hwnd=m_btnAbout;GetClientRect(m_btnAbout,&ti.rect);strcpy(szTip,"关于...");75 SendMessage(m_hwndTT,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);ti.hwnd=m_btnLocal;GetClientRect(m_btnLocal,&ti.rect);strcpy(szTip,"本地视频");SendMessage(m_hwndTT,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);ti.hwnd=m_btnOutview;GetClientRect(m_btnOutview,&ti.rect);strcpy(szTip,"对方视频");SendMessage(m_hwndTT,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);ti.hwnd=m_btnOnoff;GetClientRect(m_btnOnoff,&ti.rect);strcpy(szTip,"传送/不传送本地视频");SendMessage(m_hwndTT,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);ti.hwnd=m_btnMsg;GetClientRect(m_btnMsg,&ti.rect);strcpy(szTip,"文本对话");SendMessage(m_hwndTT,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);ti.hwnd=m_sldAudioIn;GetClientRect(m_sldAudioIn,&ti.rect);strcpy(szTip,"调节麦克风音量");SendMessage(m_hwndTT,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);ti.hwnd=m_sldAudioOut;GetClientRect(m_sldAudioOut,&ti.rect);strcpy(szTip,"调节输出音量");SendMessage(m_hwndTT,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);ti.hwnd=m_sldVideoQ;GetClientRect(m_sldVideoQ,&ti.rect);strcpy(szTip,"调节视频质量");SendMessage(m_hwndTT,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);/*------------------------------------------------------------------------------*///画主窗口界面voidCMainWnd::OnEraseBkgnd(HDChdc){RECTrc;GetClientRect(m_hWnd,&rc);HDChMemDC=CreateCompatibleDC(hdc);HBITMAPhFace=LoadBitmap(hInstX,LPCTSTR(IDB_FACE));HBITMAPhob=(HBITMAP)SelectObject(hMemDC,hFace);//画标题条(如果被Hilight的话)if(m_bHilightTitleBar){75 RECTrc;SetRect(&rc,5,5,168,22);m_bHilightTitleBar=TRUE;HBITMAPhb=LoadBitmap(hInstX,LPCTSTR(IDB_TITLE2));DrawTransBmpX(hMemDC,rc,hb,0,0,0);DeleteObject(hb);}BitBlt(hdc,0,0,rc.right-rc.left,rc.bottom-rc.top,hMemDC,0,0,SRCCOPY);SelectObject(hMemDC,hob);DeleteObject(hFace);DeleteDC(hMemDC);}/*------------------------------------------------------------------------------*/voidCMainWnd::OnTimer(UINTnIDEvent){switch(nIDEvent){case1:POINTpt;GetCursorPos(&pt);ScreenToClient(m_hWnd,&pt);if(m_bHilightTitleBar&&!PtInRegion(m_hrgnTitle,pt.x,pt.y)){m_bHilightTitleBar=FALSE;RECTrc;SetRect(&rc,5,5,168,22);HDChdc=GetDC(m_hWnd);HBITMAPhb=LoadBitmap(hInstX,LPCTSTR(IDB_TITLE1));DrawTransBmpX(hdc,rc,hb,0,0,0);DeleteObject(hb);ReleaseDC(m_hWnd,hdc);KillTimer(m_hWnd,nIDEvent);}break;case2://drawfpsanddatarate{75 //得到发送的数据和接收的数据量DWORDds=AVIO.GetDataSend();DWORDdr=AVIO.GetDataRcv();DWORDt=GetTickCount();//画帧频率charsz[60];sprintf(sz,"%dfps",AVIO.GetFps());DrawFps(sz);//累计通话时间m_uTalkTime++;sprintf(sz,"%.1fkbps%d%d:%d%d:%d%d",((float)ds-m_nDataSend+(float)dr-m_nDataRcv)*8000.0/((float)t-m_nTimePass)/1024.0,m_uTalkTime/36000,(m_uTalkTime/3600)%10,((m_uTalkTime/60)%60)/10,((m_uTalkTime/60)%60)%10,(m_uTalkTime%60)/10,(m_uTalkTime%60)%10);//画比特率和通话时间DrawDataRate(sz);//如果连续5次接收到的数据为0的话,结束通话if(dr-m_nDataRcv==0)m_iZeroCount++;elsem_iZeroCount=0;if(m_iZeroCount>5){AVIO.EndTalk();KillTimer(m_hWnd,2);ShowWindow(m_vs,SW_HIDE);ShowWindow(m_LocalVideoWnd.m_vs,SW_HIDE);ShowWindow(m_RemoteVideoWnd.m_vs,SW_HIDE);KillTimer(m_hWnd,2);DrawFps("");DrawDataRate("");CMsgBox::MessageBox(m_hWnd,IDS_ERR_NET_BLOCK,IDS_ERR,MB_OK,IDI_CUT);}m_nDataSend=ds;75 m_nDataRcv=dr;m_nTimePass=t;}break;}}/*------------------------------------------------------------------------------*/BOOLCSetupDlg::OnInitDialog(){CGraphDlg::OnInitDialog();SetWindowText(m_hWnd,"NetTalk设置");if(Setup.bAutoRun)SendMessage(GetDlgItem(m_hWnd,IDC_AUTORUN),BM_SETCHECK,BST_CHECKED,0);if(Setup.bInitShow)SendMessage(GetDlgItem(m_hWnd,IDC_INITSHOW),BM_SETCHECK,BST_CHECKED,0);if(Setup.bMiniHide)SendMessage(GetDlgItem(m_hWnd,IDC_MINIHIDE),BM_SETCHECK,BST_CHECKED,0);if(Setup.bRing)SendMessage(GetDlgItem(m_hWnd,IDC_PLAYRING),BM_SETCHECK,BST_CHECKED,0);if(Setup.bRingUser)SendMessage(GetDlgItem(m_hWnd,IDC_USERRING),BM_SETCHECK,BST_CHECKED,0);if(Setup.bAutoMsg)SendMessage(GetDlgItem(m_hWnd,IDC_AUTOMSG),BM_SETCHECK,BST_CHECKED,0);if(Setup.bRefuseCall)SendMessage(GetDlgItem(m_hWnd,IDC_REFUSECALL),BM_SETCHECK,BST_CHECKED,0);if(Setup.bBandAdjust)SendMessage(GetDlgItem(m_hWnd,IDC_BANDADJUST),BM_SETCHECK,BST_CHECKED,0);EnableWindow(GetDlgItem(m_hWnd,IDC_PLAY),Setup.bRingUser);EnableWindow(GetDlgItem(m_hWnd,IDC_BROWSE),Setup.bRingUser);SendDlgItemMessage(m_hWnd,IDC_HOTKEY,HKM_SETHOTKEY,Setup.wHotKey,0);returnFALSE;}/*------------------------------------------------------------------------------*/LRESULTCRingDlg::WndProc(UINTuMsg,WPARAMwParam,LPARAMlParam){switch(uMsg){caseWM_INITDIALOG:returnOnInitDialog();break;caseWM_DESTROY:75 CGraphDlg::OnDestroy();KillTimer(m_hWnd,1);PlaySound(0,0,0);break;caseWM_COMMAND:returnOnCommand(wParam,lParam);caseWM_ERASEBKGND:OnEraseBkgnd((HDC)wParam);returnTRUE;caseWM_TIMER:CGraphDlg::OnTimer(wParam);if(wParam==1&&CSetupDlg::Setup.bRing){if(CSetupDlg::Setup.bRingUser)PlaySound(CSetupDlg::Setup.szRingPath,0,SND_FILENAME|SND_ASYNC);elsePlaySound(LPCTSTR(IDR_CALL),hInstX,SND_RESOURCE|SND_ASYNC);}break;default:returnCGraphDlg::WndProc(uMsg,wParam,lParam);}returnTRUE;}/*------------------------------------------------------------------------------*/BOOLCRingDlg::OnInitDialog(){CGraphDlg::OnInitDialog();SetWindowText(m_hWnd,m_szCaller);charszTxt[256];sprintf(szTxt,"%s发来呼叫请求rrn要接受请求吗?",m_szCaller);SetDlgItemText(m_hWnd,IDC_TXT,szTxt);SetDlgItemText(m_hWnd,IDC_OK,"是(&Y)");SetDlgItemText(m_hWnd,IDC_CANCEL,"否(&N)");SetTimer(m_hWnd,1,3000,0);if(CSetupDlg::Setup.bRing){if(CSetupDlg::Setup.bRingUser)PlaySound(CSetupDlg::Setup.szRingPath,0,SND_FILENAME|SND_ASYNC);elsePlaySound(LPCTSTR(IDR_CALL),hInstX,SND_RESOURCE|SND_ASYNC);}SetWindowPos(m_hWnd,HWND_TOPMOST,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);returnFALSE;}75 /*------------------------------------------------------------------------------*/BOOLCCallDlg::OnInitDialog(){CGraphDlg::OnInitDialog();ShowWindow(m_btnClose,SW_HIDE);SetWindowText(m_hWnd,"请稍候");charszTxt[128];sprintf(szTxt,"正在连接计算机%s...",m_szDst);SetDlgItemText(m_hWnd,IDC_TXT,szTxt);ShowWindow(GetDlgItem(m_hWnd,IDC_OK),SW_HIDE);ShowWindow(GetDlgItem(m_hWnd,IDC_CANCEL),SW_HIDE);SetDlgItemText(m_hWnd,IDC_CANCEL,"取消");SetDlgItemText(m_hWnd,IDC_OK,"确定");returnTRUE;}//whenconnected,voidCCallDlg::Connected(){if(IsWindow(m_hWnd)){charszTxt[]="已经连接到目标计算机rrn请等待对方回应...";SetDlgItemText(m_hWnd,IDC_TXT,szTxt);ShowWindow(GetDlgItem(m_hWnd,IDC_CANCEL),SW_SHOW);EnableWindow(GetDlgItem(m_hWnd,IDC_OK),FALSE);}}/*------------------------------------------------------------------------------*///failtoconnectvoidCCallDlg::FailConnect(){if(IsWindow(m_hWnd)){charszTxt[]="无法连接到目标计算机";SetDlgItemText(m_hWnd,IDC_TXT,szTxt);ShowWindow(GetDlgItem(m_hWnd,IDC_OK),SW_SHOW);}}/*------------------------------------------------------------------------------*///therequestisrefusedbyuservoidCCallDlg::Refuse()75 {if(IsWindow(m_hWnd)){charszTxt[]="对方拒绝了您的通话请求";SetDlgItemText(m_hWnd,IDC_TXT,szTxt);ShowWindow(GetDlgItem(m_hWnd,IDC_OK),SW_SHOW);ShowWindow(GetDlgItem(m_hWnd,IDC_CANCEL),SW_HIDE);}}/*------------------------------------------------------------------------------*///therequestisrefuseforNetTalkisbusyvoidCCallDlg::Busy(){if(IsWindow(m_hWnd)){charszTxt[]="对方NetTalk繁忙,您的通话被拒绝";SetDlgItemText(m_hWnd,IDC_TXT,szTxt);ShowWindow(GetDlgItem(m_hWnd,IDC_OK),SW_SHOW);}}/*------------------------------------------------------------------------------*///theimplementationofcreditdlgLRESULTCCreditDlg::WndProc(UINTuMsg,WPARAMwParam,LPARAMlParam){switch(uMsg){caseWM_CTLCOLORDLG:return(LRESULT)GetStockObject(BLACK_BRUSH);break;//setthecolorthestaticctrlcaseWM_CTLCOLORSTATIC:SetTextColor((HDC)wParam,0x00ffb093);SetBkMode((HDC)wParam,TRANSPARENT);return(LRESULT)GetStockObject(BLACK_BRUSH);break;default:returnCDialogX::WndProc(uMsg,wParam,lParam);}returnTRUE;}75 第五章结论5.1关键技术本系统开发过程中用到的关键技术主要有:l网络传输的使用l音频输入的使用l音频输出的使用l视频输入的使用l视频输出的使用l音频视频压缩的使用l音频波形显示的使用l界面的使用5.2总结在设计过程中,出现过不同的问题,开始的时候解决起来有一些困难,经过两个月的不断学习和实践,基本上都已经解决,而且通过解决问题的过程,总结出一些需要注意的事项:1、waveIn函数族中某些函数的疑惑:如果用回调机制,那么很可能在结束录音时(调用waveInReset的时候)出现死锁,导致程序无法正常退出,MSDN中在对waveInProc的说明中提到这一点,并列出了一系列不能调用的函数,可我并没有调用它列举的函数,却依然在某些机子上出现死锁现象,不解(后改用线程通知机制)2、new的失败当一个线程经常反复调用new/delete或者用new分配大块内存时,需要特别注意new的运行结果,不要总以为NEW是成功的,有时候也会失败,在NetTalk中就发现了这种情况。(已解决)3、VCM函数族中某些函数的疑惑:75 ICDecompress函数在某些情况下(具体很难描述)会失败,在MSDEV中出现0xc0000005accessviolation的debug错误,不解。后来仅调整了几个函数的调用顺序就解决了。75 第六章设计总结由于以前对VisualC++6.0的接触并不是很多,对它的开发环境不是非常了解,所以在程序的开发过程中遇到了很多的困难,但经过同学和指导老师的帮助,一一化解了困难,并从中学到了很多编程方面的知识。但是由于经验方面的原因,以及对库存方面的操作流程了解不足,该系统还有许多不尽如人意的地方和功能上的缺陷,这些都有待于进一步改善。75 第七章谢辞此毕业设计为时两个月,由于时间和能力的限制,难免出现许多不足之处,敬请各位老师批评指正。但是这一段的实践和学习,大大提高了我解决实际问题的能力,确实使我收获很多,提高很大,想信对我以后的学习生活都会大有裨益。在此,首先要感谢我的指导老师***老师不辞劳苦的知道,使我们得以顺利完成毕业设计;其次,系里的其他的一些老师和机房的老师在毕业设计的过程中给予我们的大力支持,我从这些老师那里获益很多,在此一并表示感谢。最后,要感谢和我同组做毕业设计的同学,这份毕业设计的成果是大家共同努力的结果。谢谢大家。75 参考文献[1]伍俊良.《VisualC++课程设计与系统开发案例》.清华大学出版社[2]杨小平.《VisualC++项目案例导航》.科学出版社[3]邓宗明,张晓竞.《VisualC++编程实用技术与案例》.清华大学出版社[4]郑阿奇.《VisualC++实用教程》.电子工业出版社[5]王艳平,张越《WINDOWS网络与通信程序设计》。人民邮电出版社[6]郑人杰,殷人昆,陶永雷.实用软件工程.清华大学出版社.1997.4.75 附录/*------------------------------------------------------------------------------*=============================模块名称:Main.h=============================*------------------------------------------------------------------------------*/#ifndef_MAIN_H_#define_MAIN_H_////////////////#defineWM_USER_TIPWM_USER+101#defineWM_TRAYNOTIFYWM_USER+102#defineWM_USER_SETUPWM_USER+103///////////////////////////////////////////////////IP输入对话框classCIPInput:publicCGraphDlg{public:unsignedshortm_uPort;charm_szIP[30];virtual~CIPInput();CIPInput();protected:virtualLRESULTWndProc(UINTuMsg,WPARAMwParam,LPARAMlParam);};////////////////////classCCreditDlg:publicCDialogX{protected:virtualLRESULTWndProc(UINTuMsg,WPARAMwParam,LPARAMlParam);public:BOOLCreate(HWNDhParent);};////////////////////////////////////////////关于对话框classCAboutDlg:publicCGraphDlg{public:virtual~CAboutDlg();CAboutDlg();75 protected:CCreditDlgm_cd2;CCreditDlgm_cd1;CRippleWndm_rw;virtualLRESULTWndProc(UINTuMsg,WPARAMwParam,LPARAMlParam);};//////////structSETUP{BOOLbAutoRun;BOOLbInitShow;BOOLbMiniHide;BOOLbRing;BOOLbRingUser;charszRingPath[256];BOOLbAutoMsg;BOOLbRefuseCall;BOOLbBandAdjust;WORDwHotKey;};classCSetupDlg:publicCGraphDlg{public:staticSETUPSetup;staticvoidLoadSetup();staticvoidSaveSetup();virtual~CSetupDlg();CSetupDlg();protected:virtualBOOLOnCommand(WPARAMwParam,LPARAMlParam);virtualBOOLOnInitDialog();virtualLRESULTWndProc(UINTuMsg,WPARAMwParam,LPARAMlParam);};//////////classCRingDlg:publicCGraphDlg{public:BOOLDoModal(HWNDhParent,char*szCaller);virtual~CRingDlg();75 CRingDlg();protected:virtualvoidOnEraseBkgnd(HDChdc);char*m_szCaller;virtualBOOLOnCommand(WPARAMwParam,LPARAMlParam);virtualBOOLOnInitDialog();virtualLRESULTWndProc(UINTuMsg,WPARAMwParam,LPARAMlParam);};/////////////classCCallDlg:publicCGraphDlg{public:voidBusy();voidRefuse();voidFailConnect();voidConnected();BOOLDoModal(HWNDhParent,char*szDst);virtual~CCallDlg();CCallDlg();protected:char*m_szDst;virtualBOOLOnInitDialog();virtualvoidOnEraseBkgnd(HDChdc);virtualBOOLOnCommand(WPARAMwParam,LPARAMlParam);virtualLRESULTWndProc(UINTuMsg,WPARAMwParam,LPARAMlParam);};//////////////////////////////////////////////////主窗口classCMainWnd:publicCDialogX{public:BOOLm_bHilightTitleBar;CMainWnd();virtual~CMainWnd();protected:CRingDlgm_RingDlg;voidOnSetup(SETUP*Setup);DWORDm_uTalkTime;75 CMsgTalkDlgm_MsgTalk;CCallDlgm_CallDlg;CVideoShowm_vs;HWNDm_hwndTT;CSlideBarm_sldAudioOut;CSlideBarm_sldAudioIn;CSlideBarm_sldVideoQ;HRGNm_hrgnTitle;CCoolBtnm_btnHang;CCoolBtnm_btnCall;CCoolBtnm_btnAddr;CCoolBtnm_btnSetup;CCoolBtnm_btnClose;CCoolBtnm_btnMin;CCoolBtnm_btnHelp;CCoolBtnm_btnAbout;CCoolBtnm_btnLocal;CCoolBtnm_btnOnoff;CCoolBtnm_btnOutview;CCoolBtnm_btnMsg;voidDrawFps(char*pszFps);voidDrawDataRate(char*pszDataRate);///消息响应函数//////////////////virtualHBRUSHOnCtrlColorStatic(HDChdc,HWNDhwnd);virtualHBRUSHOnCtrlColorEdit(HDChdc,HWNDhwnd);virtualvoidOnEraseBkgnd(HDChdc);virtualBOOLOnCommand(WPARAMwParam,LPARAMlParam);virtualvoidOnMouseMove(UINTnFlags,POINTpoint);virtualvoidOnLButtonUp(UINTnFlags,POINT&point);virtualvoidOnLButtonDown(UINTnFlags,POINT&point);virtualvoidOnClose();virtualvoidOnTimer(UINTnIDEvent);virtualBOOLOnSetCursor(HWNDhWnd,UINTnHitTest,UINTmessage);virtualvoidOnDestroy();virtualBOOLOnInitDialog();virtualLRESULTWndProc(UINTuMsg,WPARAMwParam,LPARAMlParam);voidOnTrayNotify(WPARAMwParam,LPARAMlParam);voidOnIOMNotify(WPARAMwParam,LPARAMlParam);voidOnAudioData(BOOLflag,CAVIOMgr*pMgr);staticvoidCALLBACKOutVolumeChanged(DWORDdwCurrentVolume,DWORDdwUserValue);75 staticvoidCALLBACKInVolumeChanged(DWORDdwCurrentVolume,DWORDdwUserValue);///////////////////////////////intm_iZeroCount;UINTm_nDataSend;UINTm_nDataRcv;BOOLm_bSendVideo;CTrayNotifym_TrayNotify;CVideoWndm_RemoteVideoWnd;CVideoWndm_LocalVideoWnd;HBITMAPm_bmpVideo;CVolumeInXXXm_VoInCtrl;CVolumeOutWavem_VoOutCtrl;UINTm_VQ;CWaveShowm_WaveShowOut;CWaveShowm_WaveShowIn;DWORDm_nTimePass;UINTm_nFrameCount;HBRUSHm_hbCtrlBg;HBRUSHm_hbFpsBg;CRectXm_rcFps;CRectXm_rcDataRate;CRectXm_rcVideo;private:75 };#endifMain.cpp//NetTalk/*------------------------------------------------------------------------------*=============================模块名称:Main.cpp=============================*------------------------------------------------------------------------------*/#include"wndx.h"#include#include#include#include"waveshow.h"#include"resource.h"#include"Splash.h"#include"AVIOMgr.h"#include"VolumeOutWave.h"#include"VolumeInXXX.h"#include"VideoWnd.h"#include"TrayNotify.h"#include"SlideBar.h"#include"AddrBook.h"#include"GraphDlg.h"#include"RippleWnd.h"#include"NewMsgBox.h"#include"MsgTalk.h"#include"Main.h"/*------------------------------------------------------------------------------*/#definePORT1159//thedefaultportis1159CMainWndMainWnd;CAVIOMgrAVIO;SETUPCSetupDlg::Setup;/*------------------------------------------------------------------------------*///75 intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow){//初始化WndX系统InitXSystem(hInstance);/*INITIALIZECOMMONCONTROLS*/INITCOMMONCONTROLSEXiccex;iccex.dwICC=ICC_WIN95_CLASSES;iccex.dwSize=sizeof(INITCOMMONCONTROLSEX);InitCommonControlsEx(&iccex);//确保只有一个实例HANDLEhMutex=CreateMutex(0,FALSE,"NETTALK_MUTEX_ONCE");if(hMutex){if(GetLastError()==ERROR_ALREADY_EXISTS)return0;}//显示软件封面CSplash*Splash=newCSplash(3000);Splash->CreateSplash(IDD_SPLASH);//初始化SocketInitializeSocket();//初始化AVIO(将Socket绑定到某个Port)if(!AVIO.Init(PORT)){//如果失败,退出CMsgBox::MessageBox(0,IDS_ERR_INIT,IDS_ERR,0,IDI_ERR);return0;}//创建主窗口MainWnd.Create(LPCTSTR(IDD_MAIN_DLG),0);//AVIO.SetMainWnd(MainWnd);MSGmsg;while(GetMessage(&msg,0,0,0)){PreTranslateMessageX(&msg);TranslateMessage(&msg);DispatchMessage(&msg);}AVIO.Destroy();75 CleanUpSocket();returnmsg.wParam;}/*------------------------------------------------------------------------------*/CMainWnd::CMainWnd(){m_bHilightTitleBar=0;SetRect(&m_rcDataRate,20,218,140,231);SetRect(&m_rcFps,10,175,45,189);SetRect(&m_rcVideo,6,28,182,172);m_bmpVideo=0;m_bSendVideo=TRUE;}/*------------------------------------------------------------------------------*/CMainWnd::~CMainWnd(){}/*------------------------------------------------------------------------------*///主窗口消息LRESULTCMainWnd::WndProc(UINTuMsg,WPARAMwParam,LPARAMlParam){switch(uMsg){caseWM_HOTKEY://热键弹出if(wParam==1){ShowWindow(m_hWnd,SW_SHOWNORMAL);SetForegroundWindow(m_hWnd);SetActiveWindow(m_hWnd);}break;caseWM_USER_SETUP:OnSetup((SETUP*)lParam);break;75 caseWM_TRAYNOTIFY:OnTrayNotify(wParam,lParam);break;caseIOM_AUDIO:OnAudioData((BOOL)wParam,(CAVIOMgr*)lParam);break;caseWM_INITDIALOG:returnOnInitDialog();caseWM_DESTROY:OnDestroy();break;caseWM_CLOSE:OnClose();break;caseWM_LBUTTONDOWN:{POINTpoint;point.x=GET_X_LPARAM(lParam);point.y=GET_Y_LPARAM(lParam);OnLButtonDown(wParam,point);}break;caseWM_LBUTTONUP:{POINTpoint;point.x=GET_X_LPARAM(lParam);point.y=GET_Y_LPARAM(lParam);OnLButtonUp(wParam,point);}break;caseWM_MOUSEMOVE:{POINTpoint;point.x=GET_X_LPARAM(lParam);point.y=GET_Y_LPARAM(lParam);OnMouseMove(wParam,point);}break;caseWM_COMMAND:returnOnCommand(wParam,lParam);break;caseWM_ERASEBKGND:OnEraseBkgnd((HDC)wParam);returnTRUE;caseWM_TIMER:75 OnTimer(wParam);break;caseWM_SETCURSOR:returnOnSetCursor((HWND)wParam,LOWORD(lParam),HIWORD(lParam));break;caseWM_CTLCOLOREDIT:return(LRESULT)OnCtrlColorEdit((HDC)wParam,(HWND)lParam);break;caseWM_CTLCOLORSTATIC:return(LRESULT)OnCtrlColorStatic((HDC)wParam,(HWND)lParam);break;caseIOM_NOTIFY:OnIOMNotify(wParam,lParam);break;caseWM_SLD:{if(((HWND)lParam)==((HWND)m_sldAudioOut)){//设置输出音量m_VoOutCtrl.SetCurrentVolume((m_VoOutCtrl.GetMaximalVolume()-m_VoOutCtrl.GetMinimalVolume())*m_sldAudioOut.GetPos()/100);}elseif(((HWND)lParam)==((HWND)m_sldAudioIn)){//设置输入音量m_VoInCtrl.SetCurrentVolume((m_VoInCtrl.GetMaximalVolume()-m_VoInCtrl.GetMinimalVolume())*m_sldAudioIn.GetPos()/100);}elseif(((HWND)lParam)==((HWND)m_sldVideoQ)){//设置视频质量m_VQ=m_sldVideoQ.GetPos();AVIO.SetVideoQuality(m_VQ);}}break;default:returnCDialogX::WndProc(uMsg,wParam,lParam);}returnTRUE;75 }/*------------------------------------------------------------------------------*/BOOLCMainWnd::OnInitDialog(){HDChdc=GetDC(m_hWnd);m_bmpVideo=CreateCompatibleBitmap(hdc,176,144);ReleaseDC(m_hWnd,hdc);//setwindowregionPOINTpt[13]={{0,10},{10,0},{262,0},{262,32},{269,39},{269,160},{265,164},{265,228},{256,237},{20,237},{11,228},{11,221},{0,210}};HRGNhRgn=CreatePolygonRgn(pt,13,ALTERNATE);SetWindowRgn(m_hWnd,hRgn,FALSE);//setwindowstyleDWORDdwStyle=GetWindowLong(m_hWnd,GWL_STYLE);SetWindowLong(m_hWnd,GWL_STYLE,dwStyle|WS_SYSMENU|WS_MINIMIZEBOX);//setwindowcaptionandiconSetWindowText(m_hWnd,"NetTalk");SendMessage(m_hWnd,WM_SETICON,ICON_BIG,(LPARAM)LoadIcon(hInstX,LPCTSTR(IDI_MAIN)));//titlebarregionPOINTpt2[5]={{11,4},{170,4},{151,23},{4,23},{4,11}};m_hrgnTitle=CreatePolygonRgn(pt2,5,ALTERNATE);m_TrayNotify.SetHwnd(m_hWnd);m_TrayNotify.SetIcon(LoadIcon(hInstX,LPCTSTR(IDI_MAIN)));m_TrayNotify.SetTip("NetTalk-115软件工厂");m_TrayNotify.SetMsg(WM_TRAYNOTIFY);m_TrayNotify.SetID(1);m_TrayNotify.ShowIcon(TRUE);//m_hbCtrlBg=CreateSolidBrush(0);m_hbFpsBg=CreateSolidBrush(0x00b9b4b3);//initializebuttons(loadthebitmaps,settheposition)m_btnCall.LoadBitmaps(IDB_CALL1,IDB_CALL2,IDB_CALL3);m_btnCall.Associate(m_hWnd,IDC_CALL);SetWindowPos(m_btnCall,0,0,0,64,24,SWP_NOMOVE);m_btnHang.LoadBitmaps(IDB_HANG1,IDB_HANG2,IDB_HANG3);m_btnHang.Associate(m_hWnd,IDC_HANG);SetWindowPos(m_btnHang,0,0,0,64,24,SWP_NOMOVE);75 m_btnAddr.LoadBitmaps(IDB_ADDR1,IDB_ADDR2,IDB_ADDR3);m_btnAddr.Associate(m_hWnd,IDC_ADDR);SetWindowPos(m_btnAddr,0,0,0,64,24,SWP_NOMOVE);m_btnSetup.LoadBitmaps(IDB_SETUP1,IDB_SETUP2,IDB_SETUP3);m_btnSetup.Associate(m_hWnd,IDC_SETUP);SetWindowPos(m_btnSetup,0,0,0,64,24,SWP_NOMOVE);m_btnClose.LoadBitmaps(IDB_CLOSE1,IDB_CLOSE2,IDB_CLOSE3);m_btnClose.Associate(m_hWnd,IDC_CLOSE);SetWindowPos(m_btnClose,0,0,0,11,11,SWP_NOMOVE);m_btnMin.LoadBitmaps(IDB_MIN1,IDB_MIN2,IDB_MIN3);m_btnMin.Associate(m_hWnd,IDC_MIN);SetWindowPos(m_btnMin,0,0,0,11,11,SWP_NOMOVE);m_btnHelp.LoadBitmaps(IDB_HELP1,IDB_HELP2,IDB_HELP3);m_btnHelp.Associate(m_hWnd,IDC_HP);SetWindowPos(m_btnHelp,0,0,0,11,11,SWP_NOMOVE);m_btnAbout.LoadBitmaps(IDB_ABOUT1,IDB_ABOUT2,IDB_ABOUT3);m_btnAbout.Associate(m_hWnd,IDC_ABOUT);SetWindowPos(m_btnAbout,0,0,0,11,11,SWP_NOMOVE);m_btnLocal.LoadBitmaps(IDB_VIDEO_LOCAL1,IDB_VIDEO_LOCAL2,IDB_VIDEO_LOCAL3);m_btnLocal.Associate(m_hWnd,IDC_VIDEO_LOCAL);SetWindowPos(m_btnLocal,0,0,0,15,15,SWP_NOMOVE);m_btnOnoff.LoadBitmaps(IDB_VIDEO_ONOFF4,IDB_VIDEO_ONOFF5,IDB_VIDEO_ONOFF6);m_btnOnoff.Associate(m_hWnd,IDC_VIDEO_ONOFF);SetWindowPos(m_btnOnoff,0,0,0,15,15,SWP_NOMOVE);m_btnOutview.LoadBitmaps(IDB_VIDEO_OUTVIEW1,IDB_VIDEO_OUTVIEW2,IDB_VIDEO_OUTVIEW3);m_btnOutview.Associate(m_hWnd,IDC_VIDEO_OUTVIEW);SetWindowPos(m_btnOutview,0,0,0,15,15,SWP_NOMOVE);m_btnMsg.LoadBitmaps(IDB_MSG1,IDB_MSG2,IDB_MSG3);m_btnMsg.Associate(m_hWnd,IDC_MSG);SetWindowPos(m_btnMsg,0,0,0,15,15,SWP_NOMOVE);//initializetheslidebarRECTrc;SetRect(&rc,174,180,250,188);m_sldAudioOut.Create(rc,m_hWnd,0);75 SetRect(&rc,174,195,250,203);m_sldAudioIn.Create(rc,m_hWnd,0);SetRect(&rc,51,194,141,203);m_sldVideoQ.Create(rc,m_hWnd,0);//initializethewaveshowSetRect(&rc,164,211,202,229);m_WaveShowOut.Create(rc,m_hWnd);SetRect(&rc,218,211,256,229);m_WaveShowIn.Create(rc,m_hWnd);//Createthevideowndm_LocalVideoWnd.Create(IDD_VIDEO,m_hWnd,TRUE);m_RemoteVideoWnd.Create(IDD_VIDEO,m_hWnd,FALSE);GetWindowRect(m_hWnd,&rc);SetWindowPos(m_LocalVideoWnd,0,rc.right+20,rc.top-100,0,0,SWP_NOSIZE);SetWindowPos(m_RemoteVideoWnd,0,rc.left-200,rc.top,0,0,SWP_NOSIZE);//Createthetxtchatwndm_MsgTalk.Create(m_hWnd);SetWindowPos(m_MsgTalk,0,rc.right+20,rc.top+100,0,0,SWP_NOSIZE);//addthetooltipsforctrlscharszTip[30];TOOLINFOti;/*CREATEATOOLTIPWINDOW*/m_hwndTT=CreateWindowEx(WS_EX_TOPMOST,TOOLTIPS_CLASS,NULL,WS_POPUP|TTS_NOPREFIX|TTS_ALWAYSTIP,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,m_hWnd,NULL,hInstX,NULL);SetWindowPos(m_hwndTT,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE);/*INITIALIZEMEMBERSOFTHETOOLINFOSTRUCTURE*/75 ti.cbSize=sizeof(TOOLINFO);ti.uFlags=TTF_SUBCLASS;ti.hinst=hInstX;ti.uId=0;ti.lpszText=szTip;//ti.hwnd=m_btnClose;GetClientRect(m_btnClose,&ti.rect);strcpy(szTip,"关闭NetTalk");SendMessage(m_hwndTT,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);ti.hwnd=m_btnMin;GetClientRect(m_btnMin,&ti.rect);strcpy(szTip,"最小化");SendMessage(m_hwndTT,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);ti.hwnd=m_btnHelp;GetClientRect(m_btnHelp,&ti.rect);strcpy(szTip,"帮助");SendMessage(m_hwndTT,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);ti.hwnd=m_btnAbout;GetClientRect(m_btnAbout,&ti.rect);strcpy(szTip,"关于...");SendMessage(m_hwndTT,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);ti.hwnd=m_btnLocal;GetClientRect(m_btnLocal,&ti.rect);strcpy(szTip,"本地视频");SendMessage(m_hwndTT,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);ti.hwnd=m_btnOutview;GetClientRect(m_btnOutview,&ti.rect);strcpy(szTip,"对方视频");SendMessage(m_hwndTT,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);ti.hwnd=m_btnOnoff;GetClientRect(m_btnOnoff,&ti.rect);strcpy(szTip,"传送/不传送本地视频");SendMessage(m_hwndTT,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);ti.hwnd=m_btnMsg;GetClientRect(m_btnMsg,&ti.rect);strcpy(szTip,"文本对话");SendMessage(m_hwndTT,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);ti.hwnd=m_sldAudioIn;GetClientRect(m_sldAudioIn,&ti.rect);strcpy(szTip,"调节麦克风音量");SendMessage(m_hwndTT,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);ti.hwnd=m_sldAudioOut;GetClientRect(m_sldAudioOut,&ti.rect);75 strcpy(szTip,"调节输出音量");SendMessage(m_hwndTT,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);ti.hwnd=m_sldVideoQ;GetClientRect(m_sldVideoQ,&ti.rect);strcpy(szTip,"调节视频质量");SendMessage(m_hwndTT,TTM_ADDTOOL,0,(LPARAM)(LPTOOLINFO)&ti);//volumecontrol,m_VoOutCtrl.RegisterNotificationSink(OutVolumeChanged,(DWORD)this);m_VoInCtrl.RegisterNotificationSink(InVolumeChanged,(DWORD)this);if(m_VoOutCtrl.GetMaximalVolume()-m_VoOutCtrl.GetMinimalVolume())m_sldAudioOut.SetPos(100*m_VoOutCtrl.GetCurrentVolume()/(m_VoOutCtrl.GetMaximalVolume()-m_VoOutCtrl.GetMinimalVolume()));if(m_VoInCtrl.GetMaximalVolume()-m_VoInCtrl.GetMinimalVolume())m_sldAudioIn.SetPos(100*m_VoInCtrl.GetCurrentVolume()/(m_VoInCtrl.GetMaximalVolume()-m_VoInCtrl.GetMinimalVolume()));//getthevideoqualityfromtheinifilem_VQ=GetPrivateProfileInt("Video","Q",50,"NetTalk.ini");if(m_VQ>100||m_VQ<0)m_VQ=100;AVIO.SetVideoQuality(m_VQ);m_sldVideoQ.SetPos(m_VQ);//createthevideodisplaywndm_vs.Create(m_rcVideo,m_hWnd);//togetthedatafromAVIO,setsomewndsrelatedtoAVIOAVIO.SetRemoteVideoRcvWnd(m_vs);AVIO.SetLocalVideoRcvWnd(m_LocalVideoWnd.m_vs);AVIO.SetLocalAudioRcvWnd(m_hWnd);AVIO.SetRemoteAudioRcvWnd(m_hWnd);MoveWindow(GetDlgItem(m_hWnd,IDC_DATARATE),m_rcDataRate.left,m_rcDataRate.top,m_rcDataRate.Width(),m_rcDataRate.Height(),false);MoveWindow(GetDlgItem(m_hWnd,IDC_FPS),m_rcFps.left,m_rcFps.top,m_rcFps.Width(),m_rcFps.Height(),false);//loadthesetupCSetupDlg::LoadSetup();OnSetup(&CSetupDlg::Setup);if(CSetupDlg::Setup.bInitShow)ShowWindow(m_hWnd,SW_SHOW);returnFALSE;}75 /*------------------------------------------------------------------------------*///voidCMainWnd::OnDestroy(){if(m_hbCtrlBg)DeleteObject(m_hbCtrlBg);if(m_hbFpsBg)DeleteObject(m_hbFpsBg);if(m_bmpVideo)DeleteObject(m_bmpVideo);chars[5];sprintf(s,"%d",m_VQ);WritePrivateProfileString("Video","Q",s,"NetTalk.ini");}/*------------------------------------------------------------------------------*///whenclose,warningvoidCMainWnd::OnClose(){if(AVIO.GetStatus()==STA_BUSY){if(CMsgBox::MessageBox(m_hWnd,IDS_MSG_CLOSE_BUSY,IDS_WAR,MB_YESNO,IDI_INFO)==IDYES){DestroyWindow(m_hWnd);PostQuitMessage(0);}}elseif(CMsgBox::MessageBox(m_hWnd,IDS_MSG_CLOSE_FREE,IDS_WAR,MB_YESNO,IDI_INFO)==IDYES){DestroyWindow(m_hWnd);PostQuitMessage(0);}}/*------------------------------------------------------------------------------*/voidCMainWnd::OnLButtonDown(UINTnFlags,POINT&point){if(PtInRegion(m_hrgnTitle,point.x,point.y)){SetCapture(m_hWnd);75 RECTrc;GetWindowRect(m_hWnd,&rc);MSGmsg;while(GetMessage(&msg,NULL,0,0)){if(GetCapture()!=m_hWnd){DispatchMessage(&msg);break;}switch(msg.message){caseWM_MOUSEMOVE:{POINTpt;pt.x=GET_X_LPARAM(msg.lParam);pt.y=GET_Y_LPARAM(msg.lParam);rc.left+=pt.x-point.x;rc.top+=pt.y-point.y;SetWindowPos(m_hWnd,0,rc.left,rc.top,0,0,SWP_NOSIZE);}break;caseWM_LBUTTONUP:gotoEXITLOOP;default:DispatchMessage(&msg);break;}}EXITLOOP:ReleaseCapture();}}/*------------------------------------------------------------------------------*/voidCMainWnd::OnLButtonUp(UINTnFlags,POINT&point){}75 /*------------------------------------------------------------------------------*///hilightthetitlebarvoidCMainWnd::OnMouseMove(UINTnFlags,POINTpoint){if(PtInRegion(m_hrgnTitle,point.x,point.y)&&!m_bHilightTitleBar){RECTrc;SetRect(&rc,5,5,168,22);m_bHilightTitleBar=TRUE;HDChdc=GetDC(m_hWnd);HBITMAPhb=LoadBitmap(hInstX,LPCTSTR(IDB_TITLE2));DrawTransBmpX(hdc,rc,hb,0,0,0);DeleteObject(hb);ReleaseDC(m_hWnd,hdc);SetTimer(m_hWnd,1,50,0);}}/*------------------------------------------------------------------------------*/BOOLCMainWnd::OnCommand(WPARAMwParam,LPARAMlParam){switch(LOWORD(wParam)){caseIDC_CLOSE:OnClose();break;caseIDC_MIN:ShowWindow(m_hWnd,SW_MINIMIZE);if(CSetupDlg::Setup.bMiniHide)ShowWindow(m_hWnd,SW_HIDE);break;caseIDC_HP:{//打开帮助文件charszPath[256];GetModuleFileName(0,szPath,255);inti;for(i=strlen(szPath);i>0;i--){if(szPath[i]=="\"){szPath[i+1]=0;break;75 }}strcpy(szPath+strlen(szPath),"help\help.htm");ShellExecute(0,"open",szPath,0,0,SW_SHOWNORMAL);}break;caseIDC_ABOUT:{CAboutDlgabt;abt.DoModal(LPCTSTR(IDD_ABOUT_DLG),m_hWnd);}break;caseIDC_ADDR:{CAddrBookab;ab.DoModal(LPCTSTR(IDD_ADDR),m_hWnd);}break;case0:{//呼叫if(!AVIO.Call((char*)lParam,PORT))CMsgBox::MessageBox(m_hWnd,IDS_MSG_CALL_BUSY,IDS_ERR,MB_OK,IDI_INFO);else{if(!m_CallDlg.DoModal(m_hWnd,(char*)lParam)){if(AVIO.GetStatus()==STA_BUSY){ShowWindow(m_vs,SW_HIDE);ShowWindow(m_LocalVideoWnd.m_vs,SW_HIDE);ShowWindow(m_RemoteVideoWnd.m_vs,SW_HIDE);KillTimer(m_hWnd,2);DrawFps("");DrawDataRate("");}AVIO.EndTalk();}}}break;caseIDC_CALL:75 {CIPInputip;if(ip.DoModal(LPCTSTR(IDD_IPINPUT),m_hWnd)){SendMessage(m_hWnd,WM_COMMAND,0,(LPARAM)ip.m_szIP);}}break;caseIDC_HANG:{//挂断if(AVIO.GetStatus()==STA_BUSY){if(CMsgBox::MessageBox(m_hWnd,IDS_MSG_IFENDTALK,IDS_WAR,MB_YESNO,IDI_INFO)==IDYES){AVIO.EndTalk();KillTimer(m_hWnd,2);DrawFps("");DrawDataRate("");ShowWindow(m_vs,SW_HIDE);ShowWindow(m_LocalVideoWnd.m_vs,SW_HIDE);ShowWindow(m_RemoteVideoWnd.m_vs,SW_HIDE);}}elseAVIO.EndTalk();}break;caseIDC_SETUP:{CSetupDlgsd;sd.DoModal(LPCTSTR(IDD_SETUP),m_hWnd);}break;caseIDC_VIDEO_LOCAL:{if(IsWindowVisible(m_LocalVideoWnd)){AVIO.EnablePreview(FALSE);ShowWindow(m_LocalVideoWnd,SW_HIDE);}75 else{ShowWindow(m_LocalVideoWnd,SW_SHOW);AVIO.EnablePreview(TRUE);}}break;caseIDC_VIDEO_OUTVIEW:{if(IsWindowVisible(m_RemoteVideoWnd)){ShowWindow(m_RemoteVideoWnd,SW_HIDE);AVIO.SetRemoteVideoRcvWnd(m_vs);ShowWindow(m_RemoteVideoWnd.m_vs,SW_HIDE);m_btnOutview.LoadBitmaps(IDB_VIDEO_OUTVIEW1,IDB_VIDEO_OUTVIEW2,IDB_VIDEO_OUTVIEW3);}else{ShowWindow(m_RemoteVideoWnd,SW_SHOW);AVIO.SetRemoteVideoRcvWnd(m_RemoteVideoWnd.m_vs);ShowWindow(m_vs,SW_HIDE);m_btnOutview.LoadBitmaps(IDB_VIDEO_OUTVIEW4,IDB_VIDEO_OUTVIEW5,IDB_VIDEO_OUTVIEW6);}InvalidateRect(m_btnOutview,0,FALSE);}break;caseIDC_VIDEO_ONOFF:{//是否发送视频if(m_bSendVideo){m_bSendVideo=FALSE;AVIO.VideoSend(FALSE);m_btnOnoff.LoadBitmaps(IDB_VIDEO_ONOFF1,IDB_VIDEO_ONOFF2,IDB_VIDEO_ONOFF3);}else{m_bSendVideo=TRUE;AVIO.VideoSend(TRUE);m_btnOnoff.LoadBitmaps(IDB_VIDEO_ONOFF4,IDB_VIDEO_ONOFF5,IDB_VIDEO_ONOFF6);}75 }break;caseIDC_SEND:{//发送文字信息charip[50];GetDlgItemText(m_MsgTalk,IDC_OBJ,ip,50);AVIO.SendTxt(ip,PORT,(char*)lParam);}break;caseIDC_MSG:{if(IsWindowVisible(m_MsgTalk))ShowWindow(m_MsgTalk,SW_HIDE);elseShowWindow(m_MsgTalk,SW_SHOW);}break;}returnTRUE;}/*------------------------------------------------------------------------------*///画主窗口界面voidCMainWnd::OnEraseBkgnd(HDChdc){RECTrc;GetClientRect(m_hWnd,&rc);HDChMemDC=CreateCompatibleDC(hdc);HBITMAPhFace=LoadBitmap(hInstX,LPCTSTR(IDB_FACE));HBITMAPhob=(HBITMAP)SelectObject(hMemDC,hFace);//画标题条(如果被Hilight的话)if(m_bHilightTitleBar){RECTrc;SetRect(&rc,5,5,168,22);m_bHilightTitleBar=TRUE;HBITMAPhb=LoadBitmap(hInstX,LPCTSTR(IDB_TITLE2));DrawTransBmpX(hMemDC,rc,hb,0,0,0);DeleteObject(hb);}BitBlt(hdc,0,0,rc.right-rc.left,rc.bottom-rc.top,hMemDC,0,0,SRCCOPY);75 SelectObject(hMemDC,hob);DeleteObject(hFace);DeleteDC(hMemDC);}/*------------------------------------------------------------------------------*/voidCMainWnd::OnTimer(UINTnIDEvent){switch(nIDEvent){case1:POINTpt;GetCursorPos(&pt);ScreenToClient(m_hWnd,&pt);if(m_bHilightTitleBar&&!PtInRegion(m_hrgnTitle,pt.x,pt.y)){m_bHilightTitleBar=FALSE;RECTrc;SetRect(&rc,5,5,168,22);HDChdc=GetDC(m_hWnd);HBITMAPhb=LoadBitmap(hInstX,LPCTSTR(IDB_TITLE1));DrawTransBmpX(hdc,rc,hb,0,0,0);DeleteObject(hb);ReleaseDC(m_hWnd,hdc);KillTimer(m_hWnd,nIDEvent);}break;case2://drawfpsanddatarate{//得到发送的数据和接收的数据量DWORDds=AVIO.GetDataSend();DWORDdr=AVIO.GetDataRcv();DWORDt=GetTickCount();//画帧频率charsz[60];sprintf(sz,"%dfps",AVIO.GetFps());DrawFps(sz);//累计通话时间75 m_uTalkTime++;sprintf(sz,"%.1fkbps%d%d:%d%d:%d%d",((float)ds-m_nDataSend+(float)dr-m_nDataRcv)*8000.0/((float)t-m_nTimePass)/1024.0,m_uTalkTime/36000,(m_uTalkTime/3600)%10,((m_uTalkTime/60)%60)/10,((m_uTalkTime/60)%60)%10,(m_uTalkTime%60)/10,(m_uTalkTime%60)%10);//画比特率和通话时间DrawDataRate(sz);//如果连续5次接收到的数据为0的话,结束通话if(dr-m_nDataRcv==0)m_iZeroCount++;elsem_iZeroCount=0;if(m_iZeroCount>5){AVIO.EndTalk();KillTimer(m_hWnd,2);ShowWindow(m_vs,SW_HIDE);ShowWindow(m_LocalVideoWnd.m_vs,SW_HIDE);ShowWindow(m_RemoteVideoWnd.m_vs,SW_HIDE);KillTimer(m_hWnd,2);DrawFps("");DrawDataRate("");CMsgBox::MessageBox(m_hWnd,IDS_ERR_NET_BLOCK,IDS_ERR,MB_OK,IDI_CUT);}m_nDataSend=ds;m_nDataRcv=dr;m_nTimePass=t;}break;}}/*------------------------------------------------------------------------------*/75 BOOLCMainWnd::OnSetCursor(HWNDhWnd,UINTnHitTest,UINTmessage){returnFALSE;}/*------------------------------------------------------------------------------*/HBRUSHCMainWnd::OnCtrlColorEdit(HDChdc,HWNDhwnd){SetTextColor(hdc,0x00ffffff);SetBkColor(hdc,0);returnm_hbCtrlBg;}/*------------------------------------------------------------------------------*/voidCMainWnd::DrawFps(char*pszFps){SetDlgItemText(m_hWnd,IDC_FPS,pszFps);}/*------------------------------------------------------------------------------*///voidCMainWnd::OnAudioData(BOOLflag,CAVIOMgr*pMgr){if(!flag)//local{HDChdc=GetDC(m_WaveShowIn);UINTlen;char*p=pMgr->GetLocalAudio(len);m_WaveShowIn.Paint(hdc,p,len);ReleaseDC(m_WaveShowIn,hdc);}else{HDChdc=GetDC(m_WaveShowOut);UINTlen;char*p=pMgr->GetRemoteAudio(len);75 m_WaveShowOut.Paint(hdc,p,len);ReleaseDC(m_WaveShowOut,hdc);}}/*------------------------------------------------------------------------------*/voidCMainWnd::DrawDataRate(char*pszDataRate){SetDlgItemText(m_hWnd,IDC_DATARATE,pszDataRate);}/*------------------------------------------------------------------------------*/HBRUSHCMainWnd::OnCtrlColorStatic(HDChdc,HWNDhwnd){if(hwnd==GetDlgItem(m_hWnd,IDC_FPS)){SetBkColor(hdc,0x00b9b4b3);SetTextColor(hdc,0x00ffffff);returnm_hbFpsBg;}SetBkColor(hdc,0);SetTextColor(hdc,0x00aaeeff);returnm_hbCtrlBg;}/*------------------------------------------------------------------------------*///AVIOMgr的通知消息处理voidCMainWnd::OnIOMNotify(WPARAMwParam,LPARAMlParam){switch(LOWORD(wParam)){caseIOMN_CALL://呼叫到来{sockaddr_insc=AVIO.GetRemoteAddr();charsz[50];sprintf(sz,"%d.%d.%d.%d",sc.sin_addr.S_un.S_un_b.s_b1,sc.sin_addr.S_un.S_un_b.s_b2,sc.sin_addr.S_un.S_un_b.s_b3,sc.sin_addr.S_un.S_un_b.s_b4);75 SetActiveWindow(m_hWnd);if(m_RingDlg.DoModal(m_hWnd,sz)){ShowWindow(m_LocalVideoWnd,SW_SHOWNORMAL);ShowWindow(m_hWnd,SW_SHOWNORMAL);SetForegroundWindow(m_hWnd);SetActiveWindow(m_hWnd);m_uTalkTime=0;m_nTimePass=GetTickCount();m_nDataRcv=0;m_nDataSend=0;m_nFrameCount=0;m_iZeroCount=0;SetTimer(m_hWnd,2,1000,0);AVIO.Accept();//接受了呼叫,把该次事件记录到log文件中charszPath[256];GetModuleFileName(0,szPath,255);inti;for(i=strlen(szPath);i>0;i--){if(szPath[i]=="\"){szPath[i+1]=0;break;}}strcpy(szPath+strlen(szPath),"log.txt");SYSTEMTIMEst;GetLocalTime(&st);charszDate[20];charszTime[20];sprintf(szDate,"%d-%d-%d",st.wYear,st.wMonth,st.wDay);sprintf(szTime,"%d:%d:%d",st.wHour,st.wMinute,st.wSecond);charszLog[100];sprintf(szLog,"接受了%s的通话请求",sz);WritePrivateProfileString(szDate,szTime,szLog,szPath);}75 elseAVIO.Refuse();}break;//therequestisaccepted,sobegintotalkcaseIOMN_ACCEPT:{SendMessage(m_CallDlg,WM_COMMAND,IDC_OK,0);ShowWindow(m_LocalVideoWnd,SW_SHOWNORMAL);ShowWindow(m_hWnd,SW_SHOWNORMAL);AVIO.OnAccept();m_uTalkTime=0;m_nTimePass=GetTickCount();m_nDataRcv=0;m_nDataSend=0;m_nFrameCount=0;m_iZeroCount=0;SetTimer(m_hWnd,2,1000,0);//writethetalkingeventintologfilesockaddr_insc=AVIO.GetRemoteAddr();charsz[50];sprintf(sz,"%d.%d.%d.%d",sc.sin_addr.S_un.S_un_b.s_b1,sc.sin_addr.S_un.S_un_b.s_b2,sc.sin_addr.S_un.S_un_b.s_b3,sc.sin_addr.S_un.S_un_b.s_b4);charszPath[256];GetModuleFileName(0,szPath,255);inti;for(i=strlen(szPath);i>0;i--){if(szPath[i]=="\"){szPath[i+1]=0;break;}}strcpy(szPath+strlen(szPath),"log.txt");SYSTEMTIMEst;GetLocalTime(&st);charszDate[20];charszTime[20];sprintf(szDate,"%d-%d-%d",st.wYear,st.wMonth,st.wDay);sprintf(szTime,"%d:%d:%d",st.wHour,st.wMinute,st.wSecond);75 charszLog[100];sprintf(szLog,"%s你接受了你的通话请求",sz);WritePrivateProfileString(szDate,szTime,szLog,szPath);}break;caseIOMN_CONNECTED:{if(IsWindow(m_CallDlg)){m_CallDlg.Connected();}}break;caseIOMN_END:{AVIO.EndTalk();KillTimer(m_hWnd,2);DrawFps("");DrawDataRate("");ShowWindow(m_vs,SW_HIDE);ShowWindow(m_LocalVideoWnd.m_vs,SW_HIDE);ShowWindow(m_RemoteVideoWnd.m_vs,SW_HIDE);if(IsWindow(m_RingDlg))EndDialog(m_RingDlg,FALSE);else{if(HIWORD(wParam)==E_USER){CMsgBox::MessageBox(m_hWnd,IDS_MSG_ENDTALK,IDS_MSG,MB_OK,IDI_INFO);}}}break;caseIOMN_REFUSE:{switch(HIWORD(wParam)){caseR_TIMEOUT:{m_CallDlg.FailConnect();}break;75 caseR_USER:{m_CallDlg.Refuse();}break;caseR_BUSY:{m_CallDlg.Busy();}break;}}break;//theerrorofaviomgrcaseIOMN_ERR:{switch(HIWORD(wParam)){caseIOME_SOCKET:CMsgBox::MessageBox(m_hWnd,IDS_ERR_NET_SOCKET,IDS_ERR,MB_OK,IDI_ERR);break;caseIOME_AUDIO_IN:CMsgBox::MessageBox(m_hWnd,IDS_ERR_AUDIO_IN,IDS_ERR,MB_OK,IDI_ERR);break;caseIOME_AUDIO_OUT:CMsgBox::MessageBox(m_hWnd,IDS_ERR_AUDIO_OUT,IDS_ERR,MB_OK,IDI_ERR);break;caseIOME_VIDEO_IN:m_LocalVideoWnd.SetErrTxt("无法打开视频输入设备");break;caseIOME_VIDEO_OUT://alwaysgoodbreak;caseIOME_AUDIO_CODEC:CMsgBox::MessageBox(m_hWnd,IDS_ERR_AUDIO_CODEC,IDS_ERR,MB_OK,IDI_ERR);break;caseIOME_VIDEO_CODEC:CMsgBox::MessageBox(m_hWnd,IDS_ERR_VIDEO_CODEC,IDS_ERR,MB_OK,IDI_ERR);break;}}break;//Txtmsgcome,ornotifythatthetxtmsghasbeenconfermedreceivedcaseIOMN_TXT:{75 if(HIWORD(wParam)){charsz[500];sprintf(sz,"%s:%s","我",(char*)lParam);m_MsgTalk.AddMsg(sz);}else{sockaddr_insc=AVIO.GetCurrentAddr();charsz[500];sprintf(sz,"%d.%d.%d.%d:%s",sc.sin_addr.S_un.S_un_b.s_b1,sc.sin_addr.S_un.S_un_b.s_b2,sc.sin_addr.S_un.S_un_b.s_b3,sc.sin_addr.S_un.S_un_b.s_b4,(char*)lParam);m_MsgTalk.AddMsg(sz);if(CSetupDlg::Setup.bAutoMsg){ShowWindow(m_MsgTalk,SW_SHOW);SetForegroundWindow(m_MsgTalk);SetActiveWindow(m_MsgTalk);}}}break;//thevideoqualitywassetbyaviomgrautomaticallycaseIOMN_VQSET:{m_sldVideoQ.SetPos(HIWORD(wParam));}break;}}/*------------------------------------------------------------------------------*///whentheoutputvolumewaschanged,thiswouldbeinvokedvoidCALLBACKCMainWnd::OutVolumeChanged(DWORDdwCurrentVolume,DWORDdwUserValue){CMainWnd*p=(CMainWnd*)dwUserValue;p->m_sldAudioOut.SetPos(dwCurrentVolume*100/(p->m_VoOutCtrl.GetMaximalVolume()-p->m_VoOutCtrl.GetMinimalVolume()));}/*------------------------------------------------------------------------------*/voidCALLBACKCMainWnd::InVolumeChanged(DWORDdwCurrentVolume,DWORDdwUserValue){CMainWnd*p=(CMainWnd*)dwUserValue;75 p->m_sldAudioIn.SetPos(dwCurrentVolume*100/(p->m_VoInCtrl.GetMaximalVolume()-p->m_VoInCtrl.GetMinimalVolume()));}/*------------------------------------------------------------------------------*///whenthesetupwaschanged,thiswouldbecallvoidCMainWnd::OnSetup(SETUP*Setup){charsz[20];sz[1]=0;//autorunif(Setup->bAutoRun){sz[0]="1";HKEYhKey=NULL;DWORDdwValueType=REG_SZ;DWORDdwStrCb=128;DWORDdwDisposition;charszPath[256];GetModuleFileName(0,szPath,255);if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("SOFTWARE\Microsoft\Windows\CurrentVersion\Run"),0,KEY_QUERY_VALUE|KEY_SET_VALUE,&hKey)!=ERROR_SUCCESS){RegCreateKeyEx(HKEY_LOCAL_MACHINE,TEXT("SOFTWARE\Microsoft\Windows\CurrentVersion\Run"),0,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE,NULL,&hKey,&dwDisposition);}if(RegSetValueEx(hKey,"NetTalk",0,REG_SZ,(constBYTE*)szPath,dwStrCb)!=ERROR_SUCCESS){RegCloseKey(hKey);}}else{sz[0]="0";HKEYhKey=NULL;if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,TEXT("SOFTWARE\Microsoft\Windows\CurrentVersion\Run"),0,KEY_QUERY_VALUE|KEY_SET_VALUE,&hKey)==ERROR_SUCCESS){RegDeleteValue(hKey,"NetTalk");75 }}//AVIO.EnableBandAdjust(Setup->bBandAdjust);//AVIO.Enable(!Setup->bRefuseCall);//whenrefusecall,theaviowasdisable,changethenotify-tryiconif(Setup->bRefuseCall){m_TrayNotify.SetIcon(LoadIcon(hInstX,LPCTSTR(IDI_DISABLE)));m_TrayNotify.Refresh();}else{m_TrayNotify.SetIcon(LoadIcon(hInstX,LPCTSTR(IDI_MAIN)));m_TrayNotify.Refresh();}//unregistertheoldhotkey,andregisterthenewhotkeyUnregisterHotKey(m_hWnd,1);UINTMod=0;if(HOTKEYF_ALT&HIBYTE(Setup->wHotKey))Mod|=MOD_ALT;if(HOTKEYF_CONTROL&HIBYTE(Setup->wHotKey))Mod|=MOD_CONTROL;if(HOTKEYF_SHIFT&HIBYTE(Setup->wHotKey))Mod|=MOD_SHIFT;if(!RegisterHotKey(m_hWnd,1,Mod,LOBYTE(Setup->wHotKey)))CMsgBox::MessageBox(m_hWnd,IDS_ERR_HOTKEY,IDS_ERR,MB_OK,IDI_INFO);}/*------------------------------------------------------------------------------*///voidCMainWnd::OnTrayNotify(WPARAMwParam,LPARAMlParam){switch(lParam){caseWM_LBUTTONDBLCLK:{ShowWindow(m_hWnd,SW_SHOWNORMAL);SetForegroundWindow(m_hWnd);SetActiveWindow(m_hWnd);}break;caseWM_RBUTTONDOWN:{75 HMENUhMenu=LoadMenu(hInstX,LPCTSTR(IDR_POP));HMENUhSub=GetSubMenu(hMenu,0);SetForegroundWindow(m_hWnd);POINTpt;GetCursorPos(&pt);DWORDdwID=TrackPopupMenu(hSub,TPM_RIGHTALIGN|TPM_BOTTOMALIGN|TPM_RETURNCMD,pt.x,pt.y,0,m_hWnd,0);{switch(dwID){caseID_SHOWCHATER:SendMessage(m_hWnd,WM_COMMAND,IDC_MSG,0);break;caseID_SHOW:ShowWindow(m_hWnd,SW_SHOWNORMAL);SetForegroundWindow(m_hWnd);SetActiveWindow(m_hWnd);break;caseID_EXIT:SendMessage(m_hWnd,WM_CLOSE,0,0);break;caseID_ABOUT:if(IsWindowEnabled(m_hWnd))SendMessage(m_hWnd,WM_COMMAND,IDC_ABOUT,0);break;caseID_CALL:if(IsWindowEnabled(m_hWnd))SendMessage(m_hWnd,WM_COMMAND,IDC_CALL,0);break;caseID_H:SendMessage(m_hWnd,WM_COMMAND,IDC_HP,0);break;}}}}}/*------------------------------------------------------------------------------*///implementationofaboutdialog75 CAboutDlg::CAboutDlg(){}/*------------------------------------------------------------------------------*/CAboutDlg::~CAboutDlg(){}/*------------------------------------------------------------------------------*/LRESULTCAboutDlg::WndProc(UINTuMsg,WPARAMwParam,LPARAMlParam){switch(uMsg){caseWM_COMMAND:{CGraphDlg::OnCommand(wParam,lParam);switch(LOWORD(wParam)){caseIDC_LOGO:KillTimer(m_hWnd,1);ShowWindow(m_cd1,SW_HIDE);ShowWindow(m_cd2,SW_HIDE);ShowWindow(m_rw,SW_SHOW);break;caseIDC_CREDIT:if(!IsWindowVisible(m_cd1))SetTimer(m_hWnd,1,30,0);SetTimer(m_hWnd,1,30,0);ShowWindow(m_cd1,SW_SHOW);ShowWindow(m_cd2,SW_SHOW);ShowWindow(m_rw,SW_HIDE);break;}}break;caseWM_INITDIALOG:{CGraphDlg::OnInitDialog();SetWindowText(m_hWnd,"关于NetTalk");MoveWindow(GetDlgItem(m_hWnd,IDC_CONTAINER),7,50,286,182,FALSE);m_rw.Create((CRectX&)CRectX(0,0,286,182),GetDlgItem(m_hWnd,IDC_CONTAINER),IDB_LOGO1,286,182);75 m_cd1.Create(GetDlgItem(m_hWnd,IDC_CONTAINER));m_cd2.Create(GetDlgItem(m_hWnd,IDC_CONTAINER));SetWindowPos(m_cd1,0,0,0,0,0,SWP_NOSIZE);CRectXrc;GetWindowRect(m_cd1,&rc);SetWindowPos(m_cd2,0,0,rc.Height(),0,0,SWP_NOSIZE);SendDlgItemMessage(m_hWnd,IDC_LOGO,BM_SETCHECK,BST_CHECKED,0);returnFALSE;}break;caseWM_TIMER:{CGraphDlg::OnTimer(wParam);CRectXrc1,rc2,rc3;GetWindowRect(m_cd1,&rc1);GetWindowRect(m_cd2,&rc2);GetWindowRect(GetDlgItem(m_hWnd,IDC_CONTAINER),&rc3);OffsetRect(&rc1,-rc3.left,-rc3.top);OffsetRect(&rc2,-rc3.left,-rc3.top);SetWindowPos(m_cd1,0,0,rc1.top-1,0,0,SWP_NOSIZE);SetWindowPos(m_cd2,0,0,rc2.top-1,0,0,SWP_NOSIZE);if(rc1.bottom<0){SetWindowPos(m_cd1,0,0,rc2.bottom-1,0,0,SWP_NOSIZE);}if(rc2.bottom<0){SetWindowPos(m_cd2,0,0,rc1.bottom-1,0,0,SWP_NOSIZE);}}break;default:returnCGraphDlg::WndProc(uMsg,wParam,lParam);}returnTRUE;}/*------------------------------------------------------------------------------*///implementationofIPinputdialogCIPInput::CIPInput(){m_szIP[0]=0;m_uPort=0;75 }/*------------------------------------------------------------------------------*/CIPInput::~CIPInput(){}/*------------------------------------------------------------------------------*/LRESULTCIPInput::WndProc(UINTuMsg,WPARAMwParam,LPARAMlParam){switch(uMsg){caseWM_COMMAND:{switch(LOWORD(wParam)){caseIDC_OK:{GetDlgItemText(m_hWnd,IDC_IP,m_szIP,29);if(strlen(m_szIP)>0){//settheresulttovariablescharsz[20];GetDlgItemText(m_hWnd,IDC_PORT,sz,19);m_uPort=(unsignedshort)strtoul(sz,0,10);//updatetherecentcalladdressHWNDhcb=GetDlgItem(m_hWnd,IDC_IP);intiItem=SendMessage(hcb,CB_FINDSTRING,-1,(LPARAM)m_szIP);if(iItem<0)SendMessage(hcb,CB_INSERTSTRING,0,(LPARAM)m_szIP);else{SendMessage(hcb,CB_DELETESTRING,iItem,0);SendMessage(hcb,CB_INSERTSTRING,0,(LPARAM)m_szIP);}intiCount=SendMessage(hcb,CB_GETCOUNT,0,0);if(iCount>20)iCount=20;charszI[4];for(inti=0;i=20){c=20;}charszStr[256];for(inti=0;i