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

📄 猩猩即时通dlg.cpp

📁 聊天室 可以群聊 exe文件图标可以在任务栏的通知区显示,
💻 CPP
字号:
// 猩猩即时通Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "猩猩即时通.h"
#include "猩猩即时通Dlg.h"

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


/////////////////////////////////////////////////////////////////////////////
// CMyDlg dialog

CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMyDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CMyDlg)
	//}}AFX_DATA_INIT
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMyDlg)
	DDX_Control(pDX, IDABOUT, m_aboutButton);
	DDX_Control(pDX, IDC_BUTTON1, m_exchangeKey);
	DDX_Control(pDX, IDC_LIST2, m_listCtrl);
	DDX_Control(pDX, IDC_RICHEDIT2, m_inputEdit);
	DDX_Control(pDX, IDC_RICHEDIT1, m_showEdit);
	DDX_Control(pDX, IDSEND, m_sendButton);
	DDX_Control(pDX, IDC_CLOSE, m_quit);
	DDX_Control(pDX, IDC_MIN, m_mini);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CMyDlg, CDialog)
	//{{AFX_MSG_MAP(CMyDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_WM_ERASEBKGND()
	ON_WM_LBUTTONDOWN()
	ON_MESSAGE(WM_SHOWTASK, OnTaskBar)
	ON_BN_CLICKED(IDABOUT, OnAbout)
	ON_MESSAGE(WM_NETMSG, OnNetMsg)
	ON_BN_CLICKED(IDSEND, OnSend)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
	ON_COMMAND(ID_ENTER, OnEnter)
	ON_COMMAND(ID_CTRLENTER, OnCtrlEnter)
	
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyDlg message handlers

BOOL CMyDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
//init
	len = sizeof(Agreement);
	bNext = true;
	bShow = false;
	bTimer = false;
	bKey = true;

	markNumItem = 0;

	imageList.Create(20, 20, false, 0, 1);
	int i;
	for (i = 0; i < 95; i++)
	{
		HBITMAP BIT;
		CString temp;
		temp.Format("%s\\face\\%d_m.bmp", szPath, i);
		BIT = (HBITMAP)::LoadImage(NULL, temp, IMAGE_BITMAP, 20, 20, LR_LOADFROMFILE);
		CBitmap map;
		map.Attach(BIT);
		imageList.Add(&map, RGB(0, 0, 0));
		map.Detach();
	}
	m_listCtrl.SetImageList(&imageList,LVSIL_SMALL); 

	if (myMenu.CreatePopupMenu())
	{
		myMenu.AppendMenu(MF_STRING, ID_ENTER, "按 Enter 键发送消息");
		myMenu.AppendMenu(MF_STRING, ID_CTRLENTER, "按 Ctrl+Enter 键发送消息");
		myMenu.CheckMenuItem(ID_CTRLENTER, MF_CHECKED);
	}

	// TODO: Add extra initialization here
	m_sendButton.SetFocus();
	

	GetClientRect(&windowRect);

	SetWindowText("猩猩即通信 v1.0");

	CBitmap map;
	map.LoadBitmap(IDB_ABOUT);
	m_aboutButton.SetBitmap(HBITMAP(map));
	map.Detach();

	map.LoadBitmap(IDB_SEND);
	m_sendButton.SetBitmap(HBITMAP(map));
	map.Detach();

	SetWindowLong(GetSafeHwnd(), GWL_EXSTYLE, WS_EX_TOOLWINDOW); 
	tnd.cbSize=sizeof(NOTIFYICONDATA);
	tnd.hWnd=this->m_hWnd;
	tnd.uID=IDR_MAINFRAME;
	tnd.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
	tnd.uCallbackMessage=WM_SHOWTASK;
	tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
	strcpy(tnd.szTip,"猩猩即通信 v1.0");
	Shell_NotifyIcon(NIM_ADD,&tnd);

	CMyLogin myLogin(&name, &face, &ip);
	if (IDCANCEL == myLogin.DoModal())
	{
		bNext = false;
		OnCancel();
	}
	OnRequestConnect();
    //SS_NOTIFY
	//m_listBox.AddString(name);
	return true;  // return TRUE  unless you set the focus to a control
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CMyDlg::OnRequestConnect()
{
		if (false == bNext)
			return;
		WSADATA wsaD;
		int result;

//WSA初始化
		result = WSAStartup(MAKEWORD(1,1),&wsaD);
		if (result != 0)
		{
			MessageBox("WSA初始化DLL失败");
		}

//创建Socket
		uniSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//bind
		sockaddr_in clientAddr;
		memset(&clientAddr, 0, sizeof(clientAddr));
		clientAddr.sin_family = AF_INET;
		clientAddr.sin_addr.s_addr = inet_addr(ip.GetBuffer(0));
		long lPort = 8786;
		clientAddr.sin_port = ::htons(u_short(lPort));
		//serverAddr.sin_zero
		result = connect(uniSocket, (SOCKADDR*)&clientAddr, sizeof(clientAddr));
		if (result == SOCKET_ERROR)
		{
			MessageBox("连接失败");
			//OnCancel();
		}

		Agreement ag;
		lstrcpy(ag.myname, name);
		lstrcpy(ag.mark,"add");
		ag.numFace = face;
		send(uniSocket, (char *)&ag, len , 0);


		result = WSAAsyncSelect(uniSocket, GetSafeHwnd(), WM_NETMSG, FD_READ|FD_CLOSE);
		if (result == SOCKET_ERROR)
		{
			MessageBox("WSA_Select建立失败");
			//OnCancel();
		}
}

void CMyDlg::OnNetMsg(WPARAM wParam,LPARAM lParam)
{
	switch (lParam)
	{
		case FD_READ:
		{

			if (!IsWindowVisible() && !bTimer)
			{
				SetTimer(1, 400, NULL);
				bTimer = true;
			}
			Agreement readAgr;
			recv(uniSocket, (char *)&readAgr, len, 0);

			if (!lstrcmp(readAgr.mark,"msg"))
			{
				sndPlaySound(szPath+"\\music\\SingleMsg.wav", SND_ASYNC); 
				m_showEdit.SetSel(-1, -1);
				CString say;
				say.Format("%s: %s\n", readAgr.myname, readAgr.contents);
				m_showEdit.SetSel(-1, -1);
				m_showEdit.ReplaceSel(say);

				m_showEdit.LineScroll(10);

				return;
			}
			else if (!lstrcmp(readAgr.mark,"add"))
			{
				m_listCtrl.InsertItem(markNumItem, readAgr.myname, readAgr.numFace-1);
				markNumItem++;
				return;
			}
			else if (!lstrcmp(readAgr.mark,"del"))
			{
				LVFINDINFO info;
				int nIndex;

				info.flags = LVFI_PARTIAL|LVFI_STRING;
				info.psz = readAgr.myname;
				while ((nIndex=m_listCtrl.FindItem(&info)) != -1)
				{
					m_listCtrl.DeleteItem(nIndex);
				}

				m_showEdit.SetSel(-1, -1);
				CString s;
				s.Format("%s 离开了\n", readAgr.myname);
				m_showEdit.ReplaceSel(s);
				return;
			}
			else if (!lstrcmp(readAgr.mark,"delAll"))
			{
				sndPlaySound(szPath+"\\music\\LogonMsg.wav", SND_ASYNC);
				m_listCtrl.DeleteAllItems();
				return;
			}
			else
			{
				MessageBox("协议error……");
				OnCancel();
				return;
			}

		}

		case FD_CLOSE:
		{
				m_listCtrl.DeleteAllItems();
				MessageBox("服务器已经断开……");
				OnCancel();
				return;
		}

	}

}

void CMyDlg::OnPaint() 
{
	if (IsIconic())
	{
		CPaintDC dc(this); // device context for painting

		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

		// Center icon in client rectangle
		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;

		// Draw the icon
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CPaintDC dc(this); 
		backMap.DeleteObject();
		backMap.LoadBitmap(IDB_BACKS);
		CDC memDC;
		memDC.CreateCompatibleDC(&dc);
		memDC.SelectObject(&backMap);
		dc.BitBlt(0, 0, windowRect.Width(), windowRect.Height(), &memDC, 0, 0, SRCCOPY);

		CDialog::OnPaint();
	}
}

HCURSOR CMyDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

BOOL CMyDlg::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default

	return true;
	//return CDialog::OnEraseBkgnd(pDC);
}

void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x, point.y));
	CDialog::OnLButtonDown(nFlags, point);
}

void CMyDlg::OnTaskBar(WPARAM wParam,LPARAM lParam)
{	
	switch(lParam)
	{
		case WM_RBUTTONUP:
		{
				POINT *lpoint=new POINT;
				GetCursorPos((LPPOINT)lpoint);
				CMenu menu;
				menu.CreatePopupMenu();
				menu.AppendMenu(MF_STRING,WM_DESTROY,"关闭"); 
				menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);
				HMENU hmenu=menu.Detach();
				menu.DestroyMenu();
				delete lpoint;
		}
		case WM_LBUTTONDBLCLK:
		{
				KillTimer(1);
				bTimer = false;
				tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
				Shell_NotifyIcon(NIM_MODIFY,&tnd);
				bShow = false;
				ShowWindow(SW_SHOW);
				SetForegroundWindow();
				break;
		}
	}
}

CMyDlg::~CMyDlg()
{
	if (bTimer)
	{
		KillTimer(1);
	}
	closesocket(uniSocket);
	WSACleanup();
	Shell_NotifyIcon(NIM_DELETE,&tnd);
}

void CMyDlg::OnCancel() 
{
	// TODO: Add extra cleanup here
	
	CDialog::OnCancel();
}


void CMyDlg::OnAbout() 
{
	CMyAbout dlg;
	dlg.DoModal();
}

void CMyDlg::OnSend() 
{
	// TODO: Add your control notification handler code here
	m_showEdit.SetSel(-1, -1);
	CString inputContent;
	m_inputEdit.GetWindowText(inputContent);


	Agreement sendCon;
	lstrcpy(sendCon.myname, name);
	lstrcpy(sendCon.mark,"msg");
	lstrcpy(sendCon.contents, inputContent.GetBufferSetLength(inputContent.GetLength()+1));

	send(uniSocket, (char*)&sendCon, len, 0);


	m_inputEdit.SetSel(0, -1);
	m_inputEdit.Clear();

	m_inputEdit.SetFocus();
}

BOOL CMyDlg::PreTranslateMessage(MSG* pMsg) 
{
	// TODO: Add your specialized code here and/or call the base class
	if (pMsg->message == WM_KEYDOWN)
	{
		if (pMsg->wParam == VK_RETURN && GetKeyState(VK_CONTROL)&0x80)
		{
			if (bKey == true)
			{
				OnSend();
			}
			else if (bKey == false)
			{
				m_inputEdit.SetSel(-1,-1);
				m_inputEdit.ReplaceSel("\n");
			}
			return true;
		}
		else if (pMsg->wParam == VK_RETURN)
		{
			if (bKey == false)
			{
				OnSend();
			}
			else if (bKey == true)
			{
				m_inputEdit.SetSel(-1,-1);
				m_inputEdit.ReplaceSel("\n");
			}
			return true;
		}

	}
	return CDialog::PreTranslateMessage(pMsg);
}

void CMyDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if (nIDEvent == 1)
	{
		if (bShow)
		{
			//......
			tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));
			Shell_NotifyIcon(NIM_MODIFY,&tnd);
			bShow = false;
		}
		else
		{
			//.....
			tnd.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_BLANK));
			Shell_NotifyIcon(NIM_MODIFY,&tnd);
			bShow = true;
		}
	}
	CDialog::OnTimer(nIDEvent);
}

void CMyDlg::OnButton1() 
{
	// TODO: Add your control notification handler code here
		CRect rect;
		m_exchangeKey.GetWindowRect(&rect);
		myMenu.TrackPopupMenu(TPM_LEFTALIGN, rect.BottomRight().x, rect.BottomRight().y, this); 
}

void CMyDlg::OnEnter()
{
	myMenu.CheckMenuItem(ID_CTRLENTER, MF_UNCHECKED);
	myMenu.CheckMenuItem(ID_ENTER, MF_CHECKED);
	bKey = false;
	m_sendButton.SetFocus();
}

void CMyDlg::OnCtrlEnter()
{
	myMenu.CheckMenuItem(ID_CTRLENTER, MF_CHECKED);
	myMenu.CheckMenuItem(ID_ENTER, MF_UNCHECKED);
	bKey = true;
	m_sendButton.SetFocus();
}

⌨️ 快捷键说明

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