您的位置:首页 > 移动开发 > 微信开发

实现类似qq的聊天小程序

2014-09-10 18:11 921 查看
这个程序是室友编的,由于自己现在对MFC还不了解吧,先放这里吧以后好用(环境VS2010)

主函数:

// Chat.cpp : 定义应用程序的类行为。

//

#include "stdafx.h"

#include "Chat.h"

#include "ChatDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

// CChatApp

BEGIN_MESSAGE_MAP(CChatApp, CWinApp)

 ON_COMMAND(ID_HELP, &CWinApp::OnHelp)

END_MESSAGE_MAP()

// CChatApp 构造

CChatApp::CChatApp()

{

 // TODO: 在此处添加构造代码,

 // 将所有重要的初始化放置在 InitInstance 中

}

// 唯一的一个 CChatApp 对象

CChatApp theApp;

// CChatApp 初始化

BOOL CChatApp::InitInstance()

{

 CWinApp::InitInstance();

 if (!AfxSocketInit())

 {

  AfxMessageBox(IDP_SOCKETS_INIT_FAILED);

  return FALSE;

 }

 // 创建 shell 管理器,以防对话框包含

 // 任何 shell 树视图控件或 shell 列表视图控件。

 CShellManager *pShellManager = new CShellManager;

 // 标准初始化

 // 如果未使用这些功能并希望减小

 // 最终可执行文件的大小,则应移除下列

 // 不需要的特定初始化例程

 // 更改用于存储设置的注册表项

 // TODO: 应适当修改该字符串,

 // 例如修改为公司或组织名

 SetRegistryKey(_T("应用程序向导生成的本地应用程序"));

 CChatDlg dlg;

 m_pMainWnd = &dlg;

 INT_PTR nResponse = dlg.DoModal();

 if (nResponse == IDOK)

 {

  // TODO: 在此放置处理何时用

  //  “确定”来关闭对话框的代码

 }

 else if (nResponse == IDCANCEL)

 {

  // TODO: 在此放置处理何时用

  //  “取消”来关闭对话框的代码

 }

 // 删除上面创建的 shell 管理器。

 if (pShellManager != NULL)

 {

  delete pShellManager;

 }

 // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,

 //  而不是启动应用程序的消息泵。

 return FALSE;

}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

另外一个cpp文件:

 

// ChatDlg.cpp : 实现文件

//

#include "stdafx.h"

#include "Chat.h"

#include "ChatDlg.h"

#include "afxdialogex.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

// CChatDlg 对话框

 

CChatDlg::CChatDlg(CWnd* pParent )

 : CDialogEx(CChatDlg::IDD, pParent)

{

 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CChatDlg::DoDataExchange(CDataExchange* pDX)

{

 CDialogEx::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CChatDlg, CDialogEx)

 ON_WM_PAINT()

 ON_WM_QUERYDRAGICON()

 ON_BN_CLICKED(IDOK, &CChatDlg::OnBnClickedOk)

 ON_MESSAGE(WM_RECVDATA,(LRESULT (__thiscall CWnd::* )(WPARAM,LPARAM))OnRecvData)

 

END_MESSAGE_MAP()

// CChatDlg 消息处理程序

BOOL CChatDlg::OnInitDialog()

{

 CDialogEx::OnInitDialog();

 // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动

 //  执行此操作

 SetIcon(m_hIcon, TRUE);   // 设置大图标

 SetIcon(m_hIcon, FALSE);  // 设置小图标

 // TODO: 在此添加额外的初始化代码

 char hostport[100];

 char toipaddr[100];

 char toport[100];

 char hostname[256];

 GetPrivateProfileString("HOSTINFO","HOSTPORT","6500",hostport,100,".\\init.ini");

 GetPrivateProfileString("TOINFO","TOIPADDR","127.0.0.1",toipaddr,100,".\\init.ini");

 GetPrivateProfileString("TOINFO","TOPORT","6500",toport,100,".\\init.ini");

 

 gethostname(hostname,256);

 HOSTENT *hostinfo=gethostbyname(hostname);

 ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESSHOST))->SetAddress(hostinfo->h_addr_list[0][0]&0x00ff,

                 hostinfo->h_addr_list[0][1]&0x00ff,

                 hostinfo->h_addr_list[0][2]&0x00ff,

                 hostinfo->h_addr_list[0][3]&0x00ff);

 SetDlgItemText(IDC_EDITHOST,hostport);

 

 

 DWORD dwIP;

 ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESSHOST))->GetAddress(dwIP);

 IN_ADDR addbuf;

 addbuf.S_un.S_addr=htonl(dwIP);

 WritePrivateProfileString("HOSTINFO","HOSTIP",inet_ntoa(addbuf),".\\init.ini");

 

 host_socket=socket(AF_INET,SOCK_DGRAM,0);

 if(INVALID_SOCKET==host_socket)

 {

  MessageBox("套接字创建失败!");

  return FALSE;

 }

 

 host_addrSock.sin_family=AF_INET;

 host_addrSock.sin_port=htons((u_short)atoi(hostport));

 host_addrSock.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

 int retval;

 retval=bind(host_socket,(SOCKADDR*)&host_addrSock,sizeof(SOCKADDR));

 if(SOCKET_ERROR==retval)

 {

  closesocket(host_socket);

  MessageBox("绑定失败!");

  return FALSE;

 }

 

 ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESSTO))->SetAddress(htonl(inet_addr(toipaddr)));

 SetDlgItemText(IDC_EDIT_PORTTO,toport);

 RECVPARAM *pRecvParam=new RECVPARAM;

 pRecvParam->sock=host_socket;

 pRecvParam->hwnd=m_hWnd;

 HANDLE hThread=CreateThread(NULL,0,RecvProc,(LPVOID)pRecvParam,0,NULL);

 CloseHandle(hThread);

 return TRUE;

 

 return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE

}

// 如果向对话框添加最小化按钮,则需要下面的代码

//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,

//  这将由框架自动完成。

void CChatDlg::OnPaint()

{

 if (IsIconic())

 {

  CPaintDC dc(this); // 用于绘制的设备上下文

  SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(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);

 }

 else

 {

  CDialogEx::OnPaint();

 }

}

//当用户拖动最小化窗口时系统调用此函数取得光标

//显示。

HCURSOR CChatDlg::OnQueryDragIcon()

{

 return static_cast<HCURSOR>(m_hIcon);

}

 

void CChatDlg::OnBnClickedOk()

{

 // TODO: 在此添加控件通知处理程序代码

 DWORD dwIP;

 ((CIPAddressCtrl*)GetDlgItem(IDC_IPADDRESSTO))->GetAddress(dwIP);

 CString strPort;

 GetDlgItemText(IDC_EDIT_PORTTO,strPort);

 

 SOCKADDR_IN addrTo;    

 addrTo.sin_family=AF_INET;

 addrTo.sin_port=htons((unsigned short)atoi(strPort));

 addrTo.sin_addr.S_un.S_addr=htonl(dwIP);

 CString strSend;

 GetDlgItemText(IDC_EDIT_SEND,strSend);

 strSend+="\r\n";

 sendto(host_socket,strSend,strSend.GetLength()+1,0,(SOCKADDR*)&addrTo,sizeof(SOCKADDR));

 SetDlgItemText(IDC_EDIT_SEND,"");

 CString strMy="我  说:"+strSend;

 CString strTemp;

 GetDlgItemText(IDC_EDIT_RECV,strTemp); 

 strMy=strTemp+strMy;

 SetDlgItemText(IDC_EDIT_RECV,strMy);

 //CDialogEx::OnOK();

}

DWORD WINAPI CChatDlg::RecvProc(LPVOID lpParameter)

{

 SOCKET sock=((RECVPARAM*)lpParameter)->sock;

 HWND hwnd=((RECVPARAM*)lpParameter)->hwnd;

 delete lpParameter; 

 SOCKADDR_IN addrFrom;

 int len=sizeof(SOCKADDR);

 char recvBuf[200];

 char tempBuf[300];

 int retval;

 while(TRUE)

 {

  retval=recvfrom(sock,recvBuf,200,0,(SOCKADDR*)&addrFrom,&len);

  if(SOCKET_ERROR==retval)

   break;

  sprintf_s(tempBuf,"%s说: %s",inet_ntoa(addrFrom.sin_addr),recvBuf);

  ::PostMessage(hwnd,WM_RECVDATA,0,(LPARAM)tempBuf);

 }

 return 0;

}

void CChatDlg::OnRecvData(WPARAM wParam,LPARAM lParam)

{

 CString str=(char*)lParam;

 CString strTemp;

 GetDlgItemText(IDC_EDIT_RECV,strTemp);

 str=strTemp+str;

 SetDlgItemText(IDC_EDIT_RECV,str);

 

}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

一些头文件:

1:// Chat.h : PROJECT_NAME 应用程序的主头文件

//

#pragma once

#ifndef __AFXWIN_H__

 #error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件"

#endif

#include "resource.h"  // 主符号

// CChatApp:

// 有关此类的实现,请参阅 Chat.cpp

//

class CChatApp : public CWinApp

{

public:

 CChatApp();

// 重写

public:

 virtual BOOL InitInstance();

// 实现

 DECLARE_MESSAGE_MAP()

};

extern CChatApp theApp;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

2:// ChatDlg.h : 头文件

//

#pragma once

typedef struct recvparam

{

 SOCKET sock;

 HWND hwnd;

}RECVPARAM;  

#define WM_RECVDATA  WM_USER+1

// CChatDlg 对话框

class CChatDlg : public CDialogEx

{

// 构造

public:

 CChatDlg(CWnd* pParent = NULL); // 标准构造函数

// 对话框数据

 enum { IDD = IDD_CHAT_DIALOG };

 protected:

 virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持

// 实现

 static DWORD WINAPI RecvProc(LPVOID lpParameter);

protected:

 HICON m_hIcon;

 // 生成的消息映射函数

 virtual BOOL OnInitDialog();

 afx_msg void OnPaint();

 afx_msg HCURSOR OnQueryDragIcon();

 afx_msg void OnRecvData(WPARAM wParam,LPARAM lParam);

 DECLARE_MESSAGE_MAP()

public:

 afx_msg void OnBnClickedOk();

private:

 SOCKET host_socket;  //本机套接字

 SOCKADDR_IN host_addrSock;

public:

 

};

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

3://{{NO_DEPENDENCIES}}

// Microsoft Visual C++ generated include file.

// Used by Chat.rc

//

#define IDD_CHAT_DIALOG                 102

#define IDP_SOCKETS_INIT_FAILED         103

#define IDR_MAINFRAME                   128

#define IDC_IPADDRESSTO                 1000

#define IDC_EDIT_SEND                   1001

#define IDC_EDIT_RECV                   1002

#define IDC_EDIT_PORTTO                 1003

#define IDC_IPADDRESSHOST               1004

#define IDC_EDIT1                       1005

#define IDC_EDITHOST                    1005

// Next default values for new objects

//

#ifdef APSTUDIO_INVOKED

#ifndef APSTUDIO_READONLY_SYMBOLS

#define _APS_NEXT_RESOURCE_VALUE        129

#define _APS_NEXT_COMMAND_VALUE         32771

#define _APS_NEXT_CONTROL_VALUE         1006

#define _APS_NEXT_SYMED_VALUE           101

#endif

#endif

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

4:// stdafx.h : 标准系统包含文件的包含文件,

// 或是经常使用但不常更改的

// 特定于项目的包含文件

#pragma once

#ifndef _SECURE_ATL

#define _SECURE_ATL 1

#endif

#ifndef VC_EXTRALEAN

#define VC_EXTRALEAN            // 从 Windows 头中排除极少使用的资料

#endif

#include "targetver.h"

#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // 某些 CString 构造函数将是显式的

// 关闭 MFC 对某些常见但经常可放心忽略的警告消息的隐藏

#define _AFX_ALL_WARNINGS

#include <afxwin.h>         // MFC 核心组件和标准组件

#include <afxext.h>         // MFC 扩展

 

 

#ifndef _AFX_NO_OLE_SUPPORT

#include <afxdtctl.h>           // MFC 对 Internet Explorer 4 公共控件的支持

#endif

#ifndef _AFX_NO_AFXCMN_SUPPORT

#include <afxcmn.h>             // MFC 对 Windows 公共控件的支持

#endif // _AFX_NO_AFXCMN_SUPPORT

#include <afxcontrolbars.h>     // 功能区和控件条的 MFC 支持

#include <afxsock.h>            // MFC 套接字扩展

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

5:#pragma once

// 包括 SDKDDKVer.h 将定义最高版本的可用 Windows 平台。

// 如果要为以前的 Windows 平台生成应用程序,请包括 WinSDKVer.h,并将

// WIN32_WINNT 宏设置为要支持的平台,然后再包括 SDKDDKVer.h。

#include <SDKDDKVer.h>

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

基本的一些就是这些吧,貌似还有一下VS的头文件就算了~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: