1、CWinApp:OnHelp)END_MESSAGE_MAP()/ CChatApp 构造CChatApp:CChatApp() / TODO: 在此处添加构造代码, / 将所有重要的初始化放置在 InitInstance 中/ 唯一的一个 CChatApp 对象CChatApp theApp;/ CChatApp 初始化BOOL CChatApp:InitInstance() / 如果一个运行在 Windows XP 上的应用程序清单指定要 / 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式, /则需要 InitCommonControlsEx()。否则,将无法创建窗口
2、。 INITCOMMONCONTROLSEX InitCtrls; InitCtrls.dwSize = sizeof(InitCtrls); / 将它设置为包括所有要在应用程序中使用的 / 公共控件类。 InitCtrls.dwICC = ICC_WIN95_CLASSES; InitCommonControlsEx(&InitCtrls); CWinApp:InitInstance(); AfxEnableControlContainer(); / 标准初始化 / 如果未使用这些功能并希望减小 / 最终可执行文件的大小,则应移除下列 / 不需要的特定初始化例程 / 更改用于存储设置的注册表
3、项 应适当修改该字符串, / 例如修改为公司或组织名 SetRegistryKey(_T(应用程序向导生成的本地应用程序); CChatDlg dlg; m_pMainWnd = &dlg; INT_PTR nResponse = dlg.DoModal(); if (nResponse = IDOK) 在此放置处理何时用 / “确定”来关闭对话框的代码 else if (nResponse = IDCANCEL) / “取消”来关闭对话框的代码 / 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序, / 而不是启动应用程序的消息泵。 return FALSE;/#endif/ Ch
4、atDlg.h : 头文件#includePublic.hServer.hClient.h#ifndef _CChatDlg_h_/用于防止头文件嵌套多次1#define _CChatDlg_h_/用于防止头文件嵌套多次2Sound.h#define WM_DATAREACH WM_APP+110#define CLIENT 1#define SERVER 2/ CChatDlg 对话框class CChatDlg : public CDialog/ 构造 CChatDlg(CWnd* pParent = NULL); / 标准构造函数/ 对话框数据 enum IDD = IDD_CHAT_D
5、IALOG ; protected: virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV 支持protected: HICON m_hIcon; / 生成的消息映射函数 virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon();/ afx_msg void OnBnClickedButton3();/自定义数据/
6、 bool ServerFlag;/用于表示是否已经建立了服务器,没有则为false,已经建立则为true bool ClientFlag;/用于表示是否已经连接了服务器,没有则为false,已经建立则为true CServer Server;/用于服务器端的操作 CClient Client;/用于服务端的操作 CSound Sound;/用于音频操作 CString InPutCString;/用于保存输入窗口的文字数据 CString AllCString;/用于保存所有聊天记录的文字数据 int Mark;/用于标识是客户端还是服务器 bool SoundChat;/用于标识是否已经开
7、始语音聊天,false表示没有,true表示已经建立语音聊天了 WAVEHDR *p;/自定义消息响应函数-开始/ LRESULT OnDataReach(WPARAM wParam, LPARAM lParam);/当有新数据到达时执行的代码 afx_msg LRESULT GetInBufferFull(WPARAM wp, LPARAM lp);/一个buffer满后调用 afx_msg LRESULT WriteOutBufferEmpty(WPARAM wp, LPARAM lp);/一个buffer播放完后调用/自定义消息响应函数-结束/ afx_msg void OnBnClic
8、kedLinkserver(); afx_msg void OnBnClickedBuildserver(); afx_msg void OnIpnFieldchangedIpaddress(NMHDR *pNMHDR, LRESULT *pResult); afx_msg void OnBnClickedSend(); afx_msg void OnEnChangeChat(); afx_msg void OnBnClickedClose(); afx_msg void OnBnClickedVoicechat();#endif/用于防止头文件嵌套多次3/ ChatDlg.cpp : 实现文
9、件/#includeWmiutils.h#ifdef _DEBUG#define new DEBUG_NEW/ 用于应用程序“关于”菜单项的 CAboutDlg 对话框class CAboutDlg : CAboutDlg(); enum IDD = IDD_ABOUTBOX ;CAboutDlg:CAboutDlg() : CDialog(CAboutDlg:IDD)void CAboutDlg:DoDataExchange(CDataExchange* pDX) CDialog:DoDataExchange(pDX);BEGIN_MESSAGE_MAP(CAboutDlg, CDialog
10、)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);void CChatDlg:BEGIN_MESSAGE_MAP(CChat
11、Dlg, 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, &OnIpnFieldchangedI
12、paddress)/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
13、)/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 消息处理程序BOOL CChatDlg:OnInitDialog()OnInitDialog(); / 将“关于.”菜单项添加到系统菜单中。 / IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT(
14、IDM_ABOUTBOX & 0xFFF0) = IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX AppendMenu(MF_SEPARATOR);AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); / 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 / 执行此操作 SetIcon(m_hIcon, TRUE); / 设置大图标 SetIcon(m_hIcon, FALSE); / 设置小图标 在此添加额外的初始化代码 return TRUE; / 除非将焦点设置到控件,否则返回 TRUEOnSysComma
15、nd(UINT nID, LPARAM lParam) if (nID & 0xFFF0) = IDM_ABOUTBOX) CAboutDlg dlgAbout; dlgAbout.DoModal(); elseOnSysCommand(nID, lParam);/ 如果向对话框添加最小化按钮,则需要下面的代码/ 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,/ 这将由框架自动完成。OnPaint() if (IsIconic() CPaintDC dc(this); / 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_c
16、ast(dc.GetSafeHdc(), 0); / 使图标在工作区矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; / 绘制图标 dc.DrawIcon(x, y, m_hIcon);OnPaint(); /程序员添加代码-开始/ (
17、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();/将焦点设置为发送按钮 /程序员添加代码-结束/当用户拖动最小化窗口时系统调用此函数取得光标/显示。HCURSOR CChatDlg:OnQueryDragIcon() return static_cast(m_
18、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.ClientSo
19、cket,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.BindSoc
20、ket()& Server.ListeSocket()& Server.AcceptClient() ServerFlag=true;GetDlgItem(IDE_BUILDSTATE)-服务器设置成功 Mark=SERVER;WSAAsyncSelect(Server.ConnectSocket,this-WSAAsyncSelect(Server.ConnectSocketSound,this-OnIpnFieldchangedIpaddress(NMHDR *pNMHDR, LRESULT *pResult) LPNMIPADDRESS pIPAddr = reinterpret_cas
21、t(pNMHDR); *pResult = 0;OnBnClickedSend() (this-GetDlgItem(IDE_EDITCHAT)-GetWindowTextA(InPutCString);/把聊天输入窗口里面的文字保存到InPutCString中 if(InPutCString.GetLength()!=0) if(Mark=SERVER) AllCString=AllCString+ 服务器:+InPutCString+rnGetDlgItem(IDE_CHAT)-SetWindowText(AllCString); Server.GetSendBuf(InPutCString); Server.SendData(NULL); else if(Mark=CLIENT) 客户端: Client.GetSendBuf(InPutCString); Client.SendData(NULL);/用户定义消息响应函数-开始/ OnDataReach-开始 / 当有新数据到达时执行的代码 /
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1