⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hatdlg.cpp

📁 本系统所完成功能如下: &#61548 即时消息:用户之间发送即时消息。 &#61548 聊天纪录:聊天记录的保存及显示。 &#61548 注册:登陆界面即可进入注册界面 &#61548
💻 CPP
字号:
// hatDlg.cpp : implementation file
//

#include "stdafx.h"
#include "IM.h"
#include "hatDlg.h"
#include "RecordDlg.h"
#include "Node.h"

extern int m_uid,total;
extern CString CRdir;
extern struct user 
{
	int uid;
	CString fipport;
	CString fnicheng;
	BOOL fonline;
	BOOL fvip;
}fuser[100];
extern HWND ChathWnd;
extern struct APacket
{
	int uid;
	CString msg;
}apacket;
extern Node <struct APacket> * head;

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// ChatDlg dialog


ChatDlg::ChatDlg(CWnd* pParent /*=NULL*/)
	: CDialog(ChatDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(ChatDlg)
	m_nuid = 0;
	m_nicheng = _T("");
	//m_nChistory = _T("");
	m_nToSendMsg = _T("");
	//}}AFX_DATA_INIT
}


void ChatDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(ChatDlg)
	DDX_Text(pDX, IDC_EDIT2, m_nuid);
	DDX_Text(pDX, IDC_EDIT1, m_nicheng);
//	DDX_Text(pDX, IDC_EDIT3, m_nChistory);
	DDX_Text(pDX, IDC_EDIT4, m_nToSendMsg);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(ChatDlg, CDialog)
	//{{AFX_MSG_MAP(ChatDlg)
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_BN_CLICKED(IDC_BUTTON2, OnBtnSend)
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_RECVDATA,OnRecvData)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// ChatDlg message handlers

BOOL ChatDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	ChathWnd=m_hWnd;

	//聊天窗口初始化是读消息链表 有则显示初始化数据
	if(head!=NULL)
	{
		Node <struct APacket> *p=head,*tempnode=head->NextNode();
		while(tempnode!=NULL)
		{
			
			
			if(tempnode->data.uid==m_nuid)
			{
				tempnode->data.msg.Delete(0,1);
				SetSaveRecvTxt(tempnode->data.msg,TRUE);
				p->DeleteAfter();
			}
			p=tempnode;
			tempnode = tempnode->NextNode();
		}
	}
	if(m_nuid==1000)
	{
		CWnd *pWnd;
		pWnd=GetDlgItem(IDC_EDIT4);
		pWnd->EnableWindow(FALSE);
	}
	
	//判断该好友在本地是否有聊天纪录文件
	FILE * fID;
	CString str;
	str.Format("%s\\%d.ini",CRdir,m_nuid);
	fID=fopen(str,"r+");
	if(fID==NULL)
	{
		fID=fopen(str,"w+");
		WritePrivateProfileString("History","Hnum",
						"0",str);
	}
	fclose(fID);

	UpdateData(FALSE);
	return TRUE;
}

void ChatDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
	RecordDlg rd;
	rd.m_nuid=m_nuid;
	rd.DoModal();
}

BOOL ChatDlg::SetSaveRecvTxt(CString str,BOOL Ta)
{
	//设置窗口显示字符串str并在本地保存
	//Ta 用来判断是对方还是自己发送的数据

	//显示
	CString strTemp,s,time,t;
	GetDlgItemText(IDC_EDIT3,strTemp);
	CTime   currenttime   =   CTime::GetCurrentTime();  
	time=currenttime.Format("%#Y/%#m/%#d/%#H/%#M/%#S");
	
	if(Ta)
		s.Format("用户 %d 于 %s 说:\r\n",m_nuid,time);
	else
		s.Format("用户 %d 于 %s 说:\r\n",m_uid,time);
	t=s;
	s=s+str+"\r\n";
	s=strTemp+s;
	SetDlgItemText(IDC_EDIT3,s);
	
	//保存聊天纪录
	s.Format("%s\\%d.ini",CRdir,m_nuid);
	int i=GetPrivateProfileInt("History","Hnum",0,s);
	strTemp.Format("H%d",++i);

	WritePrivateProfileString("History",strTemp,t,s);
	strTemp.Format("H%d",++i);
	WritePrivateProfileString("History",strTemp,str,s);
	strTemp.Format("%d",i);
	WritePrivateProfileString("History","Hnum",strTemp,s);


	return TRUE;
}

void ChatDlg::OnRecvData(WPARAM wParam,LPARAM lParam)
{
	//消息映射处理函数 接收并显示聊天内容 并保存
	CString str=(char*)lParam;
	str.Delete(0,1);
	SetSaveRecvTxt(str,TRUE);
}

void ChatDlg::OnBtnSend() 
{
	//发送消息处理函数

	// TODO: Add your control notification handler code here
	if(m_nuid!=1000)
	{
		for(int i=1;i<=total;i++)
		{
			if(fuser[i].uid==m_nuid) 
				break;
		}
		
		//初始化对方UDP地址
		SOCKADDR_IN addrTo;
		addrTo.sin_family=AF_INET;	

		//获得ip和端口
		CString str=fuser[i].fipport,s="";
		int length=str.GetLength();
		for(i=length-1;i>=0;i--)
		{
			s=str.GetAt(i)+s;
			if(str.GetAt(i)==':')
			{
				str.SetAt(i,'\0');
				break;
			}
		}
		int digital,num=0;
		for(int j=1;j<length-i;j++)
		{
			digital=s.GetAt(j)-48;//-48什么意思? 
			num=num*10+digital; 
		}

		addrTo.sin_port=htons(num);
		addrTo.sin_addr.s_addr=inet_addr(str);

		GetDlgItemText(IDC_EDIT4,str);
		
		//将内容通过UDP发送给好友
		//A类服务 普通聊天
		str="a"+str;
		sendto(m_socket,str,str.GetLength()+1,0,
			(SOCKADDR*)&addrTo,sizeof(SOCKADDR));
		SetDlgItemText(IDC_EDIT4,"");
		str.Delete(0,1);
		SetSaveRecvTxt(str,FALSE);
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -