局域网聊天软件源代码包括语音聊天Word格式文档下载.docx
《局域网聊天软件源代码包括语音聊天Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《局域网聊天软件源代码包括语音聊天Word格式文档下载.docx(48页珍藏版)》请在冰豆网上搜索。
CWinApp:
:
OnHelp)
END_MESSAGE_MAP()
//CChatApp构造
CChatApp:
CChatApp()
//TODO:
在此处添加构造代码,
//将所有重要的初始化放置在InitInstance中
}
//唯一的一个CChatApp对象
CChatApptheApp;
//CChatApp初始化
BOOLCChatApp:
InitInstance()
//如果一个运行在WindowsXP上的应用程序清单指定要
//使用ComCtl32.dll版本6或更高版本来启用可视化方式,
//则需要InitCommonControlsEx()。
否则,将无法创建窗口。
INITCOMMONCONTROLSEXInitCtrls;
InitCtrls.dwSize=sizeof(InitCtrls);
//将它设置为包括所有要在应用程序中使用的
//公共控件类。
InitCtrls.dwICC=ICC_WIN95_CLASSES;
InitCommonControlsEx(&
InitCtrls);
CWinApp:
InitInstance();
AfxEnableControlContainer();
//标准初始化
//如果未使用这些功能并希望减小
//最终可执行文件的大小,则应移除下列
//不需要的特定初始化例程
//更改用于存储设置的注册表项
应适当修改该字符串,
//例如修改为公司或组织名
SetRegistryKey(_T("
应用程序向导生成的本地应用程序"
));
CChatDlgdlg;
m_pMainWnd=&
dlg;
INT_PTRnResponse=dlg.DoModal();
if(nResponse==IDOK)
{
在此放置处理何时用
//“确定”来关闭对话框的代码
}
elseif(nResponse==IDCANCEL)
//“取消”来关闭对话框的代码
//由于对话框已关闭,所以将返回FALSE以便退出应用程序,
//而不是启动应用程序的消息泵。
returnFALSE;
//#endif
//ChatDlg.h:
头文件
#include"
Public.h"
Server.h"
Client.h"
#ifndef_CChatDlg_h_//用于防止头文件嵌套多次1
#define_CChatDlg_h_//用于防止头文件嵌套多次2
Sound.h"
#defineWM_DATAREACHWM_APP+110
#defineCLIENT1
#defineSERVER2
//CChatDlg对话框
classCChatDlg:
publicCDialog
//构造
CChatDlg(CWnd*pParent=NULL);
//标准构造函数
//对话框数据
enum{IDD=IDD_CHAT_DIALOG};
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);
//DDX/DDV支持
protected:
HICONm_hIcon;
//生成的消息映射函数
virtualBOOLOnInitDialog();
afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);
afx_msgvoidOnPaint();
afx_msgHCURSOROnQueryDragIcon();
//afx_msgvoidOnBnClickedButton3();
////////////自定义数据/////////////////
boolServerFlag;
//用于表示是否已经建立了服务器,没有则为false,已经建立则为true
boolClientFlag;
//用于表示是否已经连接了服务器,没有则为false,已经建立则为true
CServerServer;
//用于服务器端的操作
CClientClient;
//用于服务端的操作
CSoundSound;
//用于音频操作
CStringInPutCString;
//用于保存输入窗口的文字数据
CStringAllCString;
//用于保存所有聊天记录的文字数据
intMark;
//用于标识是客户端还是服务器
boolSoundChat;
//用于标识是否已经开始语音聊天,false表示没有,true表示已经建立语音聊天了
WAVEHDR*p;
////////////////////自定义消息响应函数-开始/////////////////////
LRESULTOnDataReach(WPARAMwParam,LPARAMlParam);
//当有新数据到达时执行的代码
afx_msgLRESULTGetInBufferFull(WPARAMwp,LPARAMlp);
//一个buffer满后调用
afx_msgLRESULTWriteOutBufferEmpty(WPARAMwp,LPARAMlp);
//一个buffer播放完后调用
////////////////////自定义消息响应函数-结束/////////////////////
////////////////////////////////////////
afx_msgvoidOnBnClickedLinkserver();
afx_msgvoidOnBnClickedBuildserver();
afx_msgvoidOnIpnFieldchangedIpaddress(NMHDR*pNMHDR,LRESULT*pResult);
afx_msgvoidOnBnClickedSend();
afx_msgvoidOnEnChangeChat();
afx_msgvoidOnBnClickedClose();
afx_msgvoidOnBnClickedVoicechat();
#endif//用于防止头文件嵌套多次3
//ChatDlg.cpp:
实现文件
//#include"
Wmiutils.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
//用于应用程序“关于”菜单项的CAboutDlg对话框
classCAboutDlg:
CAboutDlg();
enum{IDD=IDD_ABOUTBOX};
CAboutDlg:
CAboutDlg():
CDialog(CAboutDlg:
IDD)
voidCAboutDlg:
DoDataExchange(CDataExchange*pDX)
CDialog:
DoDataExchange(pDX);
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
CChatDlg:
CChatDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CChatDlg:
IDD,pParent)
ServerFlag=false;
//初始化还没有建立服务器
ClientFlag=false;
Mark=0;
AllCString="
"
;
SoundChat=false;
p=(WAVEHDR*)malloc(sizeof(WAVEHDR)+MAX_BUFFER_SIZE);
m_hIcon=AfxGetApp()->
LoadIcon(IDR_MAINFRAME);
voidCChatDlg:
BEGIN_MESSAGE_MAP(CChatDlg,CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
//ON_BN_CLICKED(IDC_BUTTON3,&
OnBnClickedButton3)
ON_BN_CLICKED(IDB_LINKSERVER,&
OnBnClickedLinkserver)
ON_BN_CLICKED(IDB_BUILDSERVER,&
OnBnClickedBuildserver)
ON_NOTIFY(IPN_FIELDCHANGED,IDI_IPADDRESS,&
OnIpnFieldchangedIpaddress)
//ON_WM_CREATE()
ON_BN_CLICKED(IDB_SEND,&
OnBnClickedSend)
////////////////////用户自定义的消息-开始///////////////////////
ON_MESSAGE(WM_DATAREACH,OnDataReach)
ON_MESSAGE(MM_WIM_DATA,GetInBufferFull)//一个buffer满了后调用
ON_MESSAGE(MM_WOM_DONE,WriteOutBufferEmpty)//buffer的内容被播放完了后,产生的消息调用这个函数
////////////////////用户自定义的消息-结束///////////////////////
//ON_EN_CHANGE(IDE_EDITCHAT,&
OnEnChangeEditchat)
//ON_EN_MAXTEXT(IDE_EDITCHAT,&
OnEnMaxtextEditchat)
ON_EN_CHANGE(IDE_CHAT,&
OnEnChangeChat)
ON_BN_CLICKED(IDB_CLOSE,&
OnBnClickedClose)
ON_BN_CLICKED(IDB_VOICECHAT,&
OnBnClickedVoicechat)
//CChatDlg消息处理程序
BOOLCChatDlg:
OnInitDialog()
OnInitDialog();
//将“关于...”菜单项添加到系统菜单中。
//IDM_ABOUTBOX必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX&
0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<
0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
pSysMenu->
AppendMenu(MF_SEPARATOR);
AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
//设置此对话框的图标。
当应用程序主窗口不是对话框时,框架将自动
//执行此操作
SetIcon(m_hIcon,TRUE);
//设置大图标
SetIcon(m_hIcon,FALSE);
//设置小图标
在此添加额外的初始化代码
returnTRUE;
//除非将焦点设置到控件,否则返回TRUE
OnSysCommand(UINTnID,LPARAMlParam)
if((nID&
0xFFF0)==IDM_ABOUTBOX)
CAboutDlgdlgAbout;
dlgAbout.DoModal();
else
OnSysCommand(nID,lParam);
//如果向对话框添加最小化按钮,则需要下面的代码
//来绘制该图标。
对于使用文档/视图模型的MFC应用程序,
//这将由框架自动完成。
OnPaint()
if(IsIconic())
CPaintDCdc(this);
//用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND,reinterpret_cast<
WPARAM>
(dc.GetSafeHdc()),0);
//使图标在工作区矩形中居中
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&
rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//绘制图标
dc.DrawIcon(x,y,m_hIcon);
OnPaint();
///////////////////程序员添加代码-开始////////////////////////
((CIPAddressCtrl*)GetDlgItem(IDI_IPADDRESS))->
SetAddress(:
htonl(:
inet_addr("
192.168.177.29"
)));
((CEdit*)this->
GetDlgItem(IDE_PORT))->
SetWindowTextA("
7000"
);
((CButton*)this->
GetDlgItem(IDB_SEND))->
SetFocus();
//将焦点设置为发送按钮
///////////////////程序员添加代码-结束////////////////////////
//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSORCChatDlg:
OnQueryDragIcon()
returnstatic_cast<
HCURSOR>
(m_hIcon);
OnBnClickedLinkserver()
Client.InitM_dlg(this);
在此添加控件通知处理程序代码
if(ClientFlag==false)
Client.GetServerAddress();
if(Client.AddSocketLib()&
&
Client.CreateSocket()&
Client.ConnectSocket())
ClientFlag=true;
this->
GetDlgItem(IDE_LINKSTATE)->
SetWindowText("
服务器连接成功"
Mark=CLIENT;
WSAAsyncSelect(Client.ClientSocket,this->
m_hWnd,
WM_DATAREACH,FD_OOB|FD_READ|FD_WRITE|FD_ACCEPT|FD_CLOSE|FD_CONNECT);
WSAAsyncSelect(Client.ClientSocketSound,this->
return;
OnBnClickedBuildserver()
Server.InitM_dlg(this);
if(ServerFlag==false)
Server.GetServerAddress();
if(Server.AddSocketLib()&
Server.CreateSocket()&
Server.BindSocket()&
Server.ListeSocket()&
Server.AcceptClient())
ServerFlag=true;
GetDlgItem(IDE_BUILDSTATE)->
服务器设置成功"
Mark=SERVER;
WSAAsyncSelect(Server.ConnectSocket,this->
WSAAsyncSelect(Server.ConnectSocketSound,this->
OnIpnFieldchangedIpaddress(NMHDR*pNMHDR,LRESULT*pResult)
LPNMIPADDRESSpIPAddr=reinterpret_cast<
LPNMIPADDRESS>
(pNMHDR);
*pResult=0;
OnBnClickedSend()
(this->
GetDlgItem(IDE_EDITCHAT))->
GetWindowTextA(InPutCString);
//把聊天输入窗口里面的文字保存到InPutCString中
if(InPutCString.GetLength()!
=0)
{
if(Mark==SERVER)
AllCString=AllCString+"
服务器:
+InPutCString+"
\r\n"
GetDlgItem(IDE_CHAT)->
SetWindowText(AllCString);
Server.GetSendBuf(InPutCString);
Server.SendData(NULL);
elseif(Mark==CLIENT)
客户端:
Client.GetSendBuf(InPutCString);
Client.SendData(NULL);
////////////////////////////用户定义消息响应函数-开始///////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////
//OnDataReach-开始//
//当有新数据到达时执行的代码//
////////////////