📄 chatdlg.cpp
字号:
{
Result=connect(Pfrienddata[j].m_socket,(sockaddr*)&SevAddr,sizeof(SOCKADDR));
n++;
}
IsYes=TRUE;
sprintf(buf,"1@%d",UserNum);
///// Sleep(2000);
if(Result==SOCKET_ERROR)
sprintf(buf,"2@3");
/* else
MessageBox("连接成功");*/
break;
}
} break;
case 2://
// MessageBox("用户注册");
i=str.Find("@",0);
Pfrienddata[UserNum].Name=str.Left(i);
str=str.Right(str.GetLength()-i-1);
i=str.Find("#",0);
Pfrienddata[UserNum].code=atoi(str.Left(i));
str=str.Right(str.GetLength()-i-1);
i=str.Find("#",0);
port1=atoi(str.Left(i));
str=str.Right(str.GetLength()-i-1);
i=str.Find("#",0);
port2=atoi(str.Left(i));
str=str.Right(str.GetLength()-i-1);
i=str.Find("#",0);
port3=atoi(str.Left(i));
str=str.Right(str.GetLength()-i-1);
Pfrienddata[UserNum].id=1000+UserNum;
Pfrienddata[UserNum].IsOnline=1;
Pfrienddata[UserNum].RecvMsgPort=port3;
Pfrienddata[UserNum].ip=inet_ntoa(SevAddr.sin_addr);
SevAddr.sin_port=htons(port1);
Result=connect(Pfrienddata[UserNum].m_socket,(sockaddr*)&SevAddr,sizeof(SOCKADDR));
while(Result==SOCKET_ERROR&&n<3)
{
Result=connect(Pfrienddata[UserNum].m_socket,(sockaddr*)&SevAddr,sizeof(SOCKADDR));
n++;
}
IsYes=TRUE;
Num=UserNum;
sprintf(buf,"3@%d",1000+UserNum);
if(Result==SOCKET_ERROR)
sprintf(buf,"2@3");
/* MessageBox("连接失败");
else
MessageBox("连接成功");
*/
// Sleep(2000);
UserNum++;
break;
}
m_DataStr.Empty();
m_DataStr.Format("%d*",UserNum);
for (j=0;j<(int)UserNum;j++)
{
temp.Format("%d@%d@%s@%d@%s@%d@#",Pfrienddata[j].code,Pfrienddata[j].id,Pfrienddata[j].Name,Pfrienddata[j].IsOnline,Pfrienddata[j].ip,Pfrienddata[j].RecvMsgPort);
m_DataStr+=temp;
}
// MessageBox(m_DataStr);
if(msgType==2)
{
CString FileStr;
for (j=0;j<UserNum;j++)
{
temp.Format("%d@%d@%s%@#",Pfrienddata[j].code,Pfrienddata[j].id,Pfrienddata[j].Name);
FileStr+=temp;
}
CFile file;//将新注册用户信息写入文件.
file.Open("c://userdata.txt",CFile::modeWrite);
file.Write(FileStr,FileStr.GetLength());
file.Close();
}
SevAddr.sin_port=htons(port2);
if(IsYes)
{
// MessageBox(m_DataStr);
int Result=sendto(m_socket1,buf,100,0,(SOCKADDR*)&SevAddr,sizeof(SOCKADDR));
//Sleep(3000);
CString str=m_DataStr;
int i;
/* for(i=0;i<UserNum;i++)
if(Pfrienddata[i].m_socket==SOCKET_ERROR)
{
Pfrienddata[i].IsOnline=0;
Pfrienddata[i].ip="未知IP";
}*/
// send(Pfrienddata[i].m_socket,str,1000+1,0);
//MessageBox(str);
int SocketResult;
for(i=0;i<UserNum;i++)
if(Pfrienddata[i].IsOnline==1)
{
SocketResult=send(Pfrienddata[i].m_socket,str,str.GetLength(),0);
if(SocketResult==SOCKET_ERROR)
{
Pfrienddata[i].IsOnline=0;
Pfrienddata[i].ip="未知IP";
}
}
}
else
{
sprintf(buf,"2@3");
sendto(m_socket1,buf,100,0,(SOCKADDR*)&SevAddr,sizeof(SOCKADDR));
}
}
void CChatDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
CDialog::OnLButtonDown(nFlags, point);
}
void CChatDlg::OnButtonSend()
{
CSysMsgSendDlg dlg;
CString str;
int i;
str.Format("%d*",200);
if(dlg.DoModal()==IDOK)
{
str+=dlg.m_msg;
str+="$";
for(i=0;i<UserNum;i++)
{
if(Pfrienddata[i].IsOnline==1)
{
send(Pfrienddata[i].m_socket,str,str.GetLength(),0);
}
}
}
}
HBRUSH CChatDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CreateSolidBrush(RGB(100,150,240));//CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(nCtlColor==CTLCOLOR_STATIC)
{
pDC->SetTextColor(RGB(255,0,0));
pDC->SetBkColor(TRANSPARENT);
pDC->SetBkColor(RGB(100,150,240));
}
// TODO: Change any attributes of the DC here
if(nCtlColor==CTLCOLOR_EDIT)
{
pDC->SetTextColor(RGB(0,0,255));
pDC->SetBkColor(TRANSPARENT);
pDC->SetBkColor(RGB(100,150,240));
}
return hbr;
}
void CChatDlg::OnBtnStartSev()
{
//////////////////读取文件中用户信息并保存在数组中//////////////////
CFile file;
char *ch;
if(!file.Open("c://userdata.txt",CFile::modeRead))
{
if(IDYES==MessageBox("查找文件失败!是否要重新创建?","Error!",MB_ICONQUESTION|MB_YESNO))
file.Open("c://userdata.txt",CFile::modeCreate);
else
return;
}
int length=file.GetLength();
ch=new char[length];
file.Read(ch,length);
file.Close();
CString str=ch;
CString temp2,temp3;
CString Usertemp;
UserNum=0;
int i,j=0;
i=str.Find("#");
while(i!=-1)
{
temp2=str.Left(i);
str=str.Right(str.GetLength()-i-1);
i=temp2.Find("@");
temp3=temp2.Left(i);
temp2=temp2.Right(temp2.GetLength()-i-1);
Pfrienddata[j].code=atoi(temp3);//1密码
i=temp2.Find("@");
temp3=temp2.Left(i);
temp2=temp2.Right(temp2.GetLength()-i-1);
Pfrienddata[j].id=atoi(temp3);//2用户ID
i=temp2.Find("@");
temp3=temp2.Left(i);
temp2=temp2.Right(temp2.GetLength()-i-1);
Pfrienddata[j].Name=temp3;//3用户姓名
Pfrienddata[j].IsOnline=0;
Pfrienddata[j].ip="未知IP";
i=str.Find("#");
j++;
UserNum++;
}
m_UserNum=UserNum;
for(j=0;j<15;j++)
{
Pfrienddata[j].m_socket=socket(AF_INET,SOCK_STREAM,0);
Pfrienddata[j].RecvMsgPort=0;
}
////////////////////向ListCtrl中添加用户信息////////////////////////
CString disptemp;
for(j=0;j<UserNum;j++)
{
disptemp.Format("%d",Pfrienddata[j].id);
m_list.InsertItem(j,disptemp);
disptemp.Format("%s",Pfrienddata[j].Name);
m_list.SetItemText(j,1,disptemp);
disptemp.Format("%d",Pfrienddata[j].code);
m_list.SetItemText(j,2,disptemp);
disptemp.Format("%s",Pfrienddata[j].ip);
m_list.SetItemText(j,3,disptemp);
if(Pfrienddata[j].IsOnline==1)
disptemp="在线";
else
{
disptemp="离线";
// m_list.SetTextBkColor(0x00);
}
m_list.SetItemText(j,4,disptemp);
}
////////////隐藏开启服务器按纽显示发送系统信息按纽////////////////
CWnd *pWnd=GetDlgItem(IDC_BTN_START_SEV);
pWnd->ShowWindow(SW_HIDE);
pWnd=GetDlgItem(IDC_BUTTON_SEND);
pWnd->ShowWindow(SW_SHOW);
//////////////////////////////////////////////////////////////////
UpdateData(FALSE);
}
void CChatDlg::OnTimer(UINT nIDEvent)
{
/////////////////////将所有用户信息格式华保存在 m_DataStr中/////////////////////////
CString temp;
int j;
m_DataStr.Empty();
m_DataStr.Format("%d*",UserNum);
for (j=0;j<UserNum;j++)
{
temp.Format("%d@%d@%s@%d@%s@%d@#",Pfrienddata[j].code,Pfrienddata[j].id,Pfrienddata[j].Name,Pfrienddata[j].IsOnline,Pfrienddata[j].ip,Pfrienddata[j].RecvMsgPort);
m_DataStr+=temp;
}
int SocketResult,i;
////////////////////////向所有在线用户发送当前所有用户信息/////////////////////
for(i=0;i<UserNum;i++)
if(Pfrienddata[i].IsOnline==1)
{
SocketResult=send(Pfrienddata[i].m_socket,m_DataStr,m_DataStr.GetLength(),0);
if(SocketResult==SOCKET_ERROR)
{
Pfrienddata[i].IsOnline=0;
closesocket(Pfrienddata[i].m_socket);
Pfrienddata[i].m_socket=socket(AF_INET,SOCK_STREAM,0);
Pfrienddata[i].ip="未知IP";
}
}
CString disptemp;
m_OnlineNum=0;
////////////////////////////更新ListCtrl中的用户信息///////////////////
for(j=0;j<UserNum;j++)
m_list.DeleteItem(0);//删除所有项
for(j=0;j<UserNum;j++)
{
disptemp.Format("%d",Pfrienddata[j].id);
m_list.InsertItem(j,disptemp);
disptemp.Format("%s",Pfrienddata[j].Name);
m_list.SetItemText(j,1,disptemp);
disptemp.Format("%d",Pfrienddata[j].code);
m_list.SetItemText(j,2,disptemp);
if(Pfrienddata[j].IsOnline==1)
{
disptemp.Format("%s:%d",Pfrienddata[j].ip,Pfrienddata[j].RecvMsgPort);
m_list.SetItemText(j,3,disptemp);
disptemp="在线";
m_OnlineNum++;
m_list.SetItemText(j,4,disptemp);
}
else
{
disptemp.Format("%s:%d",Pfrienddata[j].ip,Pfrienddata[j].RecvMsgPort);
m_list.SetItemText(j,3,disptemp);
disptemp="离线";
m_list.SetItemText(j,4,disptemp);
m_list.SetItemText(j,5,disptemp);
}
}
/////////////////////////////////////////////////////////
m_UserNum=UserNum;
UpdateData(FALSE);
CDialog::OnTimer(nIDEvent);
}
void CChatDlg::OnRclickList2(NMHDR* pNMHDR, LRESULT* pResult)
{
CMenu menu;
CPoint Point;
menu.LoadMenu(IDR_MENU1);//装载菜单
CMenu* pPopup = menu.GetSubMenu(0);//获取某个菜单
GetCursorPos( &Point );//获取当前坐标
SetForegroundWindow();//设置为前景窗口
pPopup->TrackPopupMenu(
TPM_LEFTALIGN | TPM_RIGHTBUTTON,
Point.x, Point.y, this); //弹出菜单方式
*pResult = 0;
}
void CChatDlg::OnSendmsg()
{
}
void CChatDlg::OnButton1()
{
// TODO: Add your control notification handler code here
// for(int j=0;j<UserNum;j++)
// m_list.DeleteItem(0);
// m_list.SetItemText(0,5,"aaa");
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -