📄 hatdlg.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 + -