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

📄 msg1dlg.cpp

📁 自己写的一个类似飞鸽,可以和飞鸽通信的,且象酷狗的一个局域网通信的程序,但播放mp3的功能不完没,希望得到指点
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -