📄 猩猩即时通dlg.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 + -