📄 msg1dlg.cpp
字号:
// msg1Dlg.cpp : 实现文件
//
#pragma once
#include "stdafx.h"
#include "msg1.h"
#include "msg1Dlg.h"
#include "vfw.h"
#include "ipmsg.h"
#include "setting.h"
#pragma comment(lib,"vfw32.lib")
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
int SendPack(int cmd,char *message,char *szip);
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
Cmsg1Dlg* pDlg;
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// Cmsg1Dlg 对话框
Cmsg1Dlg::Cmsg1Dlg(CWnd* pParent /*=NULL*/)
: CDialog(Cmsg1Dlg::IDD, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
pDlg=this;
}
void Cmsg1Dlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST1, m_a);
DDX_Control(pDX, IDC_EDIT1, m_mes);
DDX_Control(pDX, IDC_LIST3, m_musiclist);
DDX_Control(pDX, IDC_EDIT2, m_quninput);
}
BEGIN_MESSAGE_MAP(Cmsg1Dlg, CDialog)
ON_MESSAGE(WM_TASK,dealmsg) //////////////////////////////// //加的
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDOK, &Cmsg1Dlg::OnBnClickedOk)
ON_BN_CLICKED(IDC_BUTTON1, &Cmsg1Dlg::OnBnClickedButton1)
ON_NOTIFY(NM_DBLCLK, IDC_LIST1, &Cmsg1Dlg::OnNMDblclkList1)
ON_NOTIFY(NM_DBLCLK, IDC_LIST3, &Cmsg1Dlg::OnNMDblclkList3)
ON_WM_CLOSE()
ON_WM_SIZE()
ON_BN_CLICKED(IDCANCEL, &Cmsg1Dlg::OnBnClickedCancel)
ON_COMMAND(ID_WO_3, &Cmsg1Dlg::OnWo3)
ON_NOTIFY(NM_RCLICK, IDC_LIST1, &Cmsg1Dlg::OnNMRclickList1)
ON_NOTIFY(NM_RCLICK, IDC_LIST3, &Cmsg1Dlg::OnNMRclickList3)
ON_COMMAND(ID_WO_32776, &Cmsg1Dlg::OnWoDownload)
ON_COMMAND(ID_WO_32778, &Cmsg1Dlg::Ontransfile)
ON_COMMAND(ID_WO_2, &Cmsg1Dlg::OnSetting)
END_MESSAGE_MAP()
// Cmsg1Dlg 消息处理程序
CString tmpip;
UINT UdpListenThread(LPVOID pParam);
UINT TcpListenThread(LPVOID pParam);
BOOL Cmsg1Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 将“关于...”菜单项添加到系统菜单中。
udpinit();
AfxBeginThread(UdpListenThread,0);
AfxBeginThread(TcpListenThread,0);
m_a.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT );
m_a.InsertColumn(0,_T("nickname"));
m_a.InsertColumn(1,_T("主机名"));
m_a.InsertColumn(2,_T("IP"));
for(int i=0;i<3;i++)
m_a.SetColumnWidth(i,120);
m_musiclist.InsertColumn(0,"音乐列表");
m_musiclist.SetColumnWidth(0,360);
m_musiclist.SetExtendedStyle(LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT );
//AfxBeginThread(Cmsg1Dlg::UdpListenThread,0);
// IDM_ABOUTBOX 必须在系统命令范围内。
char tip[]="over";
HICON hicon;
HINSTANCE llll=AfxFindResourceHandle(MAKEINTRESOURCE(IDR_MAINFRAME),RT_GROUP_ICON);
hicon=(HICON)LoadImage(llll,MAKEINTRESOURCE(IDR_MAINFRAME),IMAGE_ICON,16,16,LR_DEFAULTCOLOR);
NOTIFYICONDATA jiegou;
jiegou.cbSize=sizeof(NOTIFYICONDATA);
jiegou.hWnd=m_hWnd;
jiegou.uID=IDR_MAINFRAME;
jiegou.uFlags=(NIF_MESSAGE|NIF_ICON|NIF_TIP);
jiegou.uCallbackMessage=WM_TASK; //上面定义的消息
jiegou.hIcon=hicon; /*addddddddddddddddd*/
lstrcpyn(jiegou.szTip,tip,sizeof(jiegou.szTip)); // 托盘图标Dlg.h line4&&line 33
Shell_NotifyIcon(NIM_ADD,&jiegou); // this line62&&line156以下
//MessageBox("JKJKJLJKJJHD");
PopMenu.LoadMenu(IDR_MENU1);
pMenu= PopMenu.GetSubMenu (0);
friendPopMenu.LoadMenu(IDR_MENU2);
pfriendMenu= friendPopMenu.GetSubMenu (0);
musicPopMenu.LoadMenu(IDR_MENU3);
pmusicMenu= musicPopMenu.GetSubMenu (0);
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
// TODO: 在此添加额外的初始化代码
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
void Cmsg1Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void Cmsg1Dlg::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
{
CDialog::OnPaint();
}
}
//当用户拖动最小化窗口时系统调用此函数取得光标显示。
//
HCURSOR Cmsg1Dlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}
//2097921
int SendPack(int cmd,char *message,char *szip,int len)
{
char buf[MAXBUF];
sockaddr_in sin;
sin.sin_addr.s_addr=inet_addr(szip);
sin.sin_family=AF_INET;
sin.sin_port=htons(2425);
int addrlen=sizeof(sin);
static int packcnt=100000;
packcnt++;
sprintf(buf,"1:%d:%s:%s:%d:",packcnt,username,cmpname,cmd);
int i,j;
int buflen=strlen(buf);
for(j=0,i=buflen;j<len;i++,j++)
buf[i]=message[j];
int a=sendto(sockudplisten,buf,len+buflen,0,(sockaddr*)&sin,addrlen);
//if(a<0)AfxMessageBox("udp send error");
return 0;
}
void Cmsg1Dlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
onlineuser=0;
m_a.DeleteAllItems();
/* m_a.InsertItem(onlineuser,"群聊",0);
m_a.SetItemText(onlineuser,1,"群聊");
m_a.SetItemText(onlineuser,2,"255.255.255.255");
onlineuser++;
*/
SendPack(2097921,nickname,"255.255.255.255",strlen(nickname));
}
void Cmsg1Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
POSITION pos=m_a.GetFirstSelectedItemPosition();
int cur=m_a.GetNextSelectedItem(pos);
CString szip=m_a.GetItemText(cur,2);
char buf[MAXBUF];
m_quninput.GetWindowTextA(buf,1000);
SendPack(10000,buf,"255.255.255.255",strlen(buf));
m_quninput.SetWindowText("");
}
UINT UdpListenThread(LPVOID pParam)
{
char buf[MAXBUF];
sockudplisten=socket(AF_INET,SOCK_DGRAM,0);
sockaddr_in sin,cliaddr;
sin.sin_addr.s_addr=0;
sin.sin_family=AF_INET;
sin.sin_port=htons(2425);
char on=1;
setsockopt(sockudplisten,SOL_SOCKET,SO_BROADCAST,&on,sizeof(int));
if(bind(sockudplisten,(sockaddr*)&sin,sizeof(sockaddr))==-1)
{
closesocket(sockudplisten);
AfxMessageBox("udp bind error");
return 1;
}
pDlg->OnBnClickedOk();
CString szip;
int addrlen=sizeof(sockaddr);
int irecvlen;
pDlg->Allqunchat="";
char prename[20]="";
int prepackcnt=0;
while(1)
{
irecvlen=recvfrom(sockudplisten,buf,MAXBUF,0,(sockaddr*)&cliaddr,&addrlen);
if(irecvlen==SOCKET_ERROR)
{
AfxMessageBox("recv udp");
break;
}
buf[irecvlen]='\0';
Msg msg;
resolv(buf,msg);
if(msg.packcnt==prepackcnt && strcmp(prename,msg.username)==0)
continue;
prepackcnt=msg.packcnt;
strcpy(prename,msg.username);
if((msg.cmd &288)==288)
{
addnewline(msg.message);
pDlg->m_mes.SetWindowTextA(msg.message);
SendPack(33,"",inet_ntoa(cliaddr.sin_addr),0);
}
if(msg.cmd==6291457 || msg.cmd ==2097921)
{
SendPack(2097155,nickname,inet_ntoa(cliaddr.sin_addr),strlen(nickname));
}
if(msg.cmd==6291459 || msg.cmd==6291457 || msg.cmd== 2097921 || msg.cmd==2097155)
{
int c=pDlg->m_a.GetItemCount();
char *ip=inet_ntoa(cliaddr.sin_addr);
char listip[100];
int i;
for(i=0;i<c;i++)
{
pDlg->m_a.GetItemText(i,2,listip,100);
if(strcmp(ip,listip)==0)break;
}
if(i==c)
{
pDlg->m_a.InsertItem(onlineuser,msg.message,0);
pDlg->m_a.SetItemText(onlineuser,1,msg.username);
pDlg->m_a.SetItemText(onlineuser,2,ip);
onlineuser++;
}
}
if(msg.cmd==10000)
{
CString chatmessage(msg.message);
pDlg->Allqunchat=msg.username+CString(":")+chatmessage+"\r\n"+pDlg->Allqunchat;
pDlg->m_mes.SetWindowText(pDlg->Allqunchat);
}
}
return 0;
}
UINT TcpGetListThread(LPVOID param);
void Cmsg1Dlg::OnNMDblclkList1(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
NMLISTVIEW* pListView = (NMLISTVIEW*)pNMHDR;
int iSel = pListView->iItem;
if(iSel == -1)
return;
CString szip = m_a.GetItemText(iSel, 2);
tmpip=szip;
AfxBeginThread(TcpGetListThread,(LPVOID*)tmpip.GetBuffer());
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -