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

📄 mainfrm.cpp

📁 仿QQ的聊天程序vc++/mfc来学习的简易聊天室代码功能较全
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//

#include "stdafx.h"
#include "msg.h"
#include "Client.h"
#include "lookdlg.h"
#include "talkdlg.h"
#include "frienddetail.h"
#include "modifypidlg.h"
#include "searchdlg.h"
#include "SendToalldlg.h"
#include "multisenddlg.h"
#include "ShowOnlinedlg.h"
#include "SendBroadcastDlg.h"
#include "ShowAddMsgDlg.h"
#include "ShowBroadcastDlg.h"
#include "addfrienddlg.h"
#include "USkin.h"

#include "MainFrm.h"

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

/////////////////////////////////////////////////////////////////////////////
// CMainFrame

IMPLEMENT_DYNAMIC(CMainFrame, CFrameWnd)

BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)
	//{{AFX_MSG_MAP(CMainFrame)
	ON_WM_CREATE()
	ON_WM_SETFOCUS()
	ON_WM_GETMINMAXINFO()
	ON_WM_CLOSE()
	ON_WM_TIMER()
	ON_COMMAND(ID_SEND_MESSAGE, OnSendMessage)
	ON_UPDATE_COMMAND_UI(ID_SEND_MESSAGE, OnUpdateSendMessage)
	ON_COMMAND(ID_FRIEND_DETAIL, OnFriendDetail)
	ON_COMMAND(ID_OFFLINE, OnOffline)
	ON_COMMAND(ID_ONHIDE, OnOnhide)
	ON_COMMAND(ID_ONLINE, OnOnline)
	ON_COMMAND(ID_SEARCH, OnSearch)
	ON_COMMAND(ID_PERSONINFO_SETUP, OnPersoninfoSetup)
	ON_COMMAND(ID_SENDTO_ALL, OnSendtoAll)
	ON_COMMAND(ID_SHOW_ONLINE, OnShowOnline)
	ON_COMMAND(ID_SEND_BROADCAST, OnSendBroadcast)
	ON_COMMAND(ID_ADD_FRIEND, OnAddFriend)
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_MY_TRAY_NOTIFICATION,OnTrayNotification)
	ON_MESSAGE(WM_HOTKEY,OnHotKey)
	ON_MESSAGE(WM_OUTBAR_NOTIFY, OnOutbarNotify)
	ON_MESSAGE(WM_RECIEVE_MSG,ProcRecv)
	ON_MESSAGE(WM_ADDFRIEND_REFRESH,OnAddFriendRefresh)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction

CMainFrame::CMainFrame()
{
	m_pSearch=NULL;	
	m_pModifyPI=NULL;
	m_pMultiSend=NULL;
	m_pSendToAll=NULL;		
	m_pShowOnline=NULL;
	m_pSendBroad=NULL;	
	m_pShowNotice=NULL;
	m_pAddFriendDlg=NULL;
	m_bRecvTotal=FALSE;
}

CMainFrame::~CMainFrame()
{
}

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
		return -1;	
		
	DWORD dwf = CGfxOutBarCtrl::fDragItems|CGfxOutBarCtrl::fEditGroups|CGfxOutBarCtrl::fEditItems|CGfxOutBarCtrl::fRemoveGroups|
		CGfxOutBarCtrl::fRemoveItems|CGfxOutBarCtrl::fAddGroups|CGfxOutBarCtrl::fAnimation;	
		
	m_wndBar.Create(WS_CHILD|WS_VISIBLE, CRect(0,0,0,0), this,AFX_IDW_PANE_FIRST, dwf);
	m_wndBar.SetOwner(this);	
	
	m_wndBar.SetImageList(&GetApp()->m_imaLarge, CGfxOutBarCtrl::fLargeIcon);
	m_wndBar.SetImageList(&GetApp()->m_imaSmall, CGfxOutBarCtrl::fSmallIcon);
	m_wndBar.AddFolder("我的好友", 0);	
	m_wndBar.AddFolder("陌生人", 1);
	m_wndBar.AddFolder("黑名单", 2);
	
	UserInfo* pInfo;
	CString str;
	for(int i=1;i<GetApp()->m_aUserInfo.GetSize();i++)
	{
		pInfo=GetApp()->m_aUserInfo.GetAt(i);
		if(pInfo->HaveDetail)
			m_wndBar.AddItem(0,pInfo->Name,pInfo->PhotoId,pInfo->Id);
		else
		{
			str.Format("%d",pInfo->Id);
			m_wndBar.AddItem(0,str,0,pInfo->Id);
		}
	}
	m_wndBar.SetSelFolder(0);

	BOOL result1=::RegisterHotKey(m_hWnd,1001,MOD_CONTROL|MOD_ALT,'X');
	BOOL result2=::RegisterHotKey(m_hWnd,1002,MOD_CONTROL|MOD_ALT,'x');
	BOOL result3=::RegisterHotKey(m_hWnd,1003,MOD_CONTROL|MOD_ALT,'m');
	BOOL result4=::RegisterHotKey(m_hWnd,1004,MOD_CONTROL|MOD_ALT,'M');
	if(!result1&&!result2&&!result3&&!result4)
	{
		//AfxMessageBox(IDS_HOTKEY_REG_FAIL);
	}	

	m_TrayIcon.SetNotificationWnd(this,WM_MY_TRAY_NOTIFICATION);
	str=GetApp()->m_strCurUserDir;
	str=str.Left(str.GetLength()-1);
	m_TrayIcon.SetIcon(IDR_OFFLINE,str);	

	str.Format("ID:%d",GetApp()->m_uCurrentUserID);
	SetWindowText(str);
	CMenu* pMenu=GetMenu();
	menu1.Attach(pMenu->GetSubMenu(0)->GetSafeHmenu());
	menu2.Attach(pMenu->GetSubMenu(1)->GetSafeHmenu());
	menu1.LoadToolBarResource(IDR_TOOLBAR1);
	menu2.LoadToolBarResource(IDR_TOOLBAR2);
	menu1.RemapMenu(&menu1);
	menu2.RemapMenu(&menu2);
	
	return 0;
}

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
	if( !CFrameWnd::PreCreateWindow(cs) )
		return FALSE;
	
	cs.dwExStyle|=WS_EX_TOOLWINDOW|WS_EX_TOPMOST;
	cs.lpszClass = AfxRegisterWndClass(0);
	cs.x=650;
	cs.y=50;
	cs.cx=150;
	cs.cy=500;
	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics

#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
	CFrameWnd::AssertValid();
}

void CMainFrame::Dump(CDumpContext& dc) const
{
	CFrameWnd::Dump(dc);
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
void CMainFrame::OnSetFocus(CWnd* pOldWnd)
{
	// forward focus to the view window
	m_wndBar.SetFocus();
}

BOOL CMainFrame::OnCmdMsg(UINT nID, int nCode, void* pExtra, AFX_CMDHANDLERINFO* pHandlerInfo)
{
	// let the view have first crack at the command
	if (m_wndBar.OnCmdMsg(nID, nCode, pExtra, pHandlerInfo))
		return TRUE;

	// otherwise, do default handling
	return CFrameWnd::OnCmdMsg(nID, nCode, pExtra, pHandlerInfo);
}


void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpMMI) 
{
	lpMMI->ptMinTrackSize.x = 90;
	lpMMI->ptMaxTrackSize.x=200;
	lpMMI->ptMinTrackSize.y=200;
	CFrameWnd::OnGetMinMaxInfo(lpMMI);
}

LRESULT CMainFrame::OnHotKey(WPARAM wParam,LPARAM lParam)
{
	if (wParam== 1001||wParam==1002)
	{
		ShowWindow(SW_NORMAL); 
		SetForegroundWindow();
		return 1;
	}
	else if(wParam== 1003||wParam==1004)
	{
		SendMessage(WM_SYSCOMMAND,SC_MINIMIZE,0);
		return 1;
	}
	return 0;
}

LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) 
{
	if(message==WM_SYSCOMMAND)
	{
		if(wParam==SC_MINIMIZE)
		{
			ShowWindow(SW_HIDE);
			return 0;
		}
		else if(wParam==SC_CLOSE)
		{
			ShowWindow(SW_HIDE);
			return 0;
		}
	}
			
	return CFrameWnd::WindowProc(message, wParam, lParam);	
}

LRESULT CMainFrame::OnTrayNotification(WPARAM wp,LPARAM lp)
{
	return m_TrayIcon.OnTrayNotification(wp,lp);
}

void CMainFrame::OnClose() 
{
	::UnregisterHotKey(m_hWnd,1001); 
	::UnregisterHotKey(m_hWnd,1002); 
	::UnregisterHotKey(m_hWnd,1003); 
	::UnregisterHotKey(m_hWnd,1004); 
	CFrameWnd::OnClose();
}

LRESULT CMainFrame::OnOutbarNotify(WPARAM wParam, LPARAM lParam)
{
	switch (wParam)
	{
		case NM_OB_ITEMCLICK:
		// cast the lParam to an integer to get the clicked item
			{
				nGroupFlag=m_wndBar.iSelFolder;				
				nCurSelID = m_wndBar.GetItemData(lParam);
				nCurSelIndex=lParam;
				CMenu menu;
				CGfxPopupMenu cMenu;
				menu.LoadMenu(IDR_POPMENU);
				cMenu.Attach(menu.GetSubMenu(0)->GetSafeHmenu());
				if(nGroupFlag==1)
				{
					cMenu.AppendMenu(MF_STRING,ID_ADD_FRIEND,"加为好友");
				}				
				cMenu.LoadToolBarResource(IDR_TOOLBAR3);
				cMenu.RemapMenu(&cMenu);				
				CPoint mouse;
				GetCursorPos(&mouse);				
				cMenu.TrackPopupMenu(TPM_LEFTALIGN,mouse.x,mouse.y,this);						
			}		
			return 1;
		case NM_OB_ITEMDCLICK:
			{
				nGroupFlag=m_wndBar.iSelFolder;				
				nCurSelID = m_wndBar.GetItemData(lParam);
				nCurSelIndex=lParam;
				SendMessage(WM_COMMAND,ID_SEND_MESSAGE,0);				
			}
			return 1;
		case NM_OB_ONLABELENDEDIT:
		// cast the lParam to an OUTBAR_INFO * struct; it will contain info about the edited item
		// return 1 to do the change and 0 to cancel it
			{
				OUTBAR_INFO * pOI = (OUTBAR_INFO *) lParam;
				//TRACE2("Editing item %d, new text:%s\n", pOI->index, pOI->cText);
			}
		return 1;

		case NM_OB_ONGROUPENDEDIT:
		// cast the lParam to an OUTBAR_INFO * struct; it will contain info about the edited folder
		// return 1 to do the change and 0 to cancel it
			{
				OUTBAR_INFO * pOI = (OUTBAR_INFO *) lParam;
				TRACE2("Editing folder %d, new text:%s\n", pOI->index, pOI->cText);
			}
		return 1;

		case NM_OB_DRAGITEM:
		// cast the lParam to an OUTBAR_INFO * struct; it will contain info about the dragged items
		// return 1 to do the change and 0 to cancel it
			{
				OUTBAR_INFO * pOI = (OUTBAR_INFO *) lParam;
				TRACE2("Drag item %d at position %d\n", pOI->iDragFrom, pOI->iDragTo);
			}
		return 1;
	}
	return 0;
}

LRESULT CMainFrame::ProcRecv(WPARAM wParam,LPARAM lParam)
{
	CData* pData=(CData*)wParam;
	UINT index=pData->index;
	int & iOnlineState=GetApp()->m_bOnlineState;

	switch(index)
	{
	case SEND_MSG_TO_FRIEND:
		{
			//recv from friend or server
			if(iOnlineState==0)break;
			CMsg1 msg;
			CopyDataBuf(&msg,pData);
			if(!msg.LoadFromBuf())
			{
				TRACE0("msg.LoadFromBuf error!\n");
				break;
			}

			int mindex=0;
			SaveMsg* pMsg=new SaveMsg;
			pMsg->type=NORMAL_MSG;
			pMsg->ID=msg.MyId;
			pMsg->Time=msg.Time;
			pMsg->Msg=msg.Msg;

			UserInfo *pInfo=NULL;
			FriendState *pState=NULL;
			if(FindInArray(GetApp()->m_aUserInfo,GetApp()->m_aUserState,msg.MyId,pInfo,pState))
			{
				pState->aMsg.Add(pMsg);			
			}			
			else
			{
				// 陌生人			
				if(FindInArray(GetApp()->m_aStranger,GetApp()->m_aStrangerState,msg.MyId,pInfo,pState))
				{
					pState->aMsg.Add(pMsg);
				}
				else
				{
					pInfo=new UserInfo;					
					pInfo->Id=msg.MyId;
					pInfo->HaveDetail=0;
					pState=new FriendState;					
					pState->IP=msg.tarIP;
					pState->Port=msg.nPort;
					pState->OnlineState=1;
					pState->aMsg.Add(pMsg);
					GetApp()->m_aStranger.Add(pInfo);					
					GetApp()->m_aStrangerState.Add(pState);
					GetApp()->m_aStranger.GetSize();
					CString str;
					str.Format("%d",pInfo->Id);
					m_wndBar.AddItem(1,str,0,pInfo->Id);					
					m_wndBar.Invalidate();
				}
			}
			if(pState->pRecv==NULL)
			{
				pState->pRecv=new CLookDlg;
				pState->pRecv->Create(CLookDlg::IDD,GetDesktopWindow());
			}
			pState->pRecv->PostMessage(WM_RECVMSG,(WPARAM)pInfo,(LPARAM)pState);			
			
			break;
		}
	case SOMEONE_ONHIDE:
		{				
			if(iOnlineState==0)break;

			CNoticeMsg msg;
			CopyDataBuf(&msg,pData);

			if(!msg.LoadFromBuf())break;

			UserInfo *pInfo=NULL;
			FriendState *pState=NULL;
			if(FindInArray(GetApp()->m_aUserInfo,GetApp()->m_aUserState,msg.MyId,pInfo,pState))
			{
				pState->OnlineState=2;
				m_wndBar.SetOnlineImage(msg.MyId,FALSE);
				m_wndBar.Invalidate();
			}			
			break;
		}
	case SOMEONE_ONLINE:
		{
			if(iOnlineState==0)break;

			CNoticeMsg msg;
			CopyDataBuf(&msg,pData);

			if(!msg.LoadFromBuf())break;

			UserInfo *pInfo=NULL;
			FriendState *pState=NULL;
			if(FindInArray(GetApp()->m_aUserInfo,GetApp()->m_aUserState,msg.MyId,pInfo,pState))
			{
				pState->OnlineState=1;
				m_wndBar.SetOnlineImage(msg.MyId);
				m_wndBar.Invalidate();
			}						
			break;
		}
	case SOMEONE_OFFLINE:
		{
			if(iOnlineState==0)break;
			UserInfo *pInfo=NULL;
			FriendState *pState=NULL;
			if(FindInArray(GetApp()->m_aUserInfo,GetApp()->m_aUserState,pData->MyId,pInfo,pState))
			{
				pState->OnlineState=0;				
				m_wndBar.SetOnlineImage(pData->MyId,FALSE);	
				m_wndBar.Invalidate();
			}			
			break;
		}
	case ONLINE_OK:
		{
			if(!GetApp()->m_bOnlineState)
				SetTimer(1,TimerSpanClient,NULL);
			GetApp()->m_bOnlineState=1;
			CString str=GetApp()->m_strCurUserDir;			
			str=str.Left(str.GetLength()-1);
			m_TrayIcon.SetIcon(IDR_ONLINE,str);			
			AfxBeginThread(RequestFriendDetail,0,THREAD_PRIORITY_BELOW_NORMAL);			
			break;
		}
	case ONHIDE_OK:
		{
			if(!GetApp()->m_bOnlineState)
				SetTimer(1,TimerSpanClient,NULL);
			GetApp()->m_bOnlineState=2;
			CString str=GetApp()->m_strCurUserDir;				
			str=str.Left(str.GetLength()-1);
			m_TrayIcon.SetIcon(IDR_ONHIDE,str);
			AfxBeginThread(RequestFriendDetail,0,THREAD_PRIORITY_BELOW_NORMAL);			
			break;
		}
	case ALL_FRIEND_ID:
		{
			if(iOnlineState==0)break;
			CMsg2 msg;
			CopyDataBuf(&msg,pData);
			if(!msg.LoadFromBuf())
				break;			
			
			CString str1;
			for(int i=0;i<msg.aFriendId.GetSize();i++)
			{
				if(FindInArray(GetApp()->m_aUserInfo,msg.aFriendId.GetAt(i))!=-1)
					continue;

⌨️ 快捷键说明

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