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

📄 ircwnd.cpp

📁 非常出名开源客户端下载的程序emule
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//This program is free software; you can redistribute it and/or
//modify it under the terms of the GNU General Public License
//as published by the Free Software Foundation; either
//version 2 of the License, or (at your option) any later version.
//
//This program is distributed in the hope that it will be useful,
//but WITHOUT ANY WARRANTY; without even the implied warranty of
//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
//GNU General Public License for more details.
//
//You should have received a copy of the GNU General Public License
//along with this program; if not, write to the Free Software
//Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

// IrcWnd.cpp : implementation file
//

#include "stdafx.h"
#include "IrcWnd.h"
#include "emule.h"
#include "otherfunctions.h"
#include "opcodes.h"

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


/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
// CIrcWnd dialog
/////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNAMIC(CIrcWnd, CDialog)
CIrcWnd::CIrcWnd(CWnd* pParent /*=NULL*/)
	: CResizableDialog(CIrcWnd::IDD, pParent)
{
   m_pIrcMain = 0; // i_a: bugfix: crash prevention 
   m_bConnected = false;          // i_a 
   m_bLoggedIn = false;          // i_a 
   m_pCurrentChannel = 0;         // i_a 
   memset(&asc_sort, 0, sizeof(asc_sort)); // i_a 
}

CIrcWnd::~CIrcWnd()
{
	if( m_bConnected )
		m_pIrcMain->Disconnect(true);
	POSITION pos1, pos2;
	for (pos1 = channelLPtrList.GetHeadPosition();( pos2 = pos1 ) != NULL;){
		channelLPtrList.GetNext(pos1);
		ChannelList* cur_channel =	(ChannelList*)channelLPtrList.GetAt(pos2);
		channelLPtrList.RemoveAt(pos2);
		delete cur_channel;
	}
	DeleteAllChannel();
	delete m_pIrcMain;
	delete m_pIRCFont;
}

void CIrcWnd::UpdateNickCount(){
	CHeaderCtrl* pHeaderCtrl;
	HDITEM hdi;
	hdi.mask = HDI_TEXT;
	CString strRes;
	pHeaderCtrl = nickList.GetHeaderCtrl();
	if( nickList.GetItemCount() )
		strRes.Format( "%s[%i]", GetResString(IDS_IRC_NICK), nickList.GetItemCount());
	else
		strRes.Format( "%s", GetResString(IDS_IRC_NICK));
	hdi.pszText = strRes.GetBuffer();
	pHeaderCtrl->SetItem(0, &hdi);
	strRes.ReleaseBuffer();
}

void CIrcWnd::Localize(){
	if( m_bConnected )
		GetDlgItem(IDC_BN_IRCCONNECT)->SetWindowText(GetResString(IDS_IRC_DISCONNECT));
	else
		GetDlgItem(IDC_BN_IRCCONNECT)->SetWindowText(GetResString(IDS_IRC_CONNECT));
	GetDlgItem(IDC_CHATSEND)->SetWindowText(GetResString(IDS_IRC_SEND));
	GetDlgItem(IDC_CLOSECHAT)->SetWindowText(GetResString(IDS_FD_CLOSE));

	CHeaderCtrl* pHeaderCtrl;
	HDITEM hdi;
	hdi.mask = HDI_TEXT;
	CString strRes;

	UpdateNickCount();

	pHeaderCtrl = serverChannelList.GetHeaderCtrl();

	strRes = GetResString(IDS_UUSERS);
	hdi.pszText = strRes.GetBuffer();
	pHeaderCtrl->SetItem(1, &hdi);
	strRes.ReleaseBuffer();

	strRes = GetResString(IDS_DESCRIPTION);
	hdi.pszText = strRes.GetBuffer();
	pHeaderCtrl->SetItem(2, &hdi);
	strRes.ReleaseBuffer();

	strRes = GetResString(IDS_IRC_NAME);
	hdi.pszText = strRes.GetBuffer();
	pHeaderCtrl->SetItem(0, &hdi);
	strRes.ReleaseBuffer();

}

BOOL CIrcWnd::OnInitDialog(){
	CResizableDialog::OnInitDialog();

	imagelist.Create(16,16,ILC_COLOR32 ,0,10);
	imagelist.SetBkColor(::GetSysColor(COLOR_BTNFACE));
	imagelist.Add(theApp.LoadIcon(IDI_CHAT));
	imagelist.Add(theApp.LoadIcon(IDI_MESSAGE));
	imagelist.Add(theApp.LoadIcon(IDI_MPENDING));
	channelselect.SetImageList(&imagelist);

	m_bConnected = false;
	m_bLoggedIn = false;
	Localize();
	m_pIrcMain = new CIrcMain();
	m_pIrcMain->SetIRCWnd(this);

	nickList.InsertColumn(0,GetResString(IDS_IRC_NICK),LVCFMT_LEFT,113);
	nickList.InsertColumn(1,"",LVCFMT_LEFT,32);

	serverChannelList.InsertColumn(0, GetResString(IDS_IRC_NAME), LVCFMT_LEFT, 203 );
	serverChannelList.InsertColumn(1, GetResString(IDS_UUSERS), LVCFMT_LEFT, 50 );
	serverChannelList.InsertColumn(2, GetResString(IDS_DESCRIPTION), LVCFMT_LEFT, 350 );

	CRect rect;
	GetDlgItem(IDC_STATUSWINDOW)->GetWindowRect(rect);
	::MapWindowPoints(NULL, m_hWnd, (LPPOINT)&rect, 2);
	statusWindow.CreateEx(WS_EX_STATICEDGE,0,"MsgWnd",WS_CHILD | HTC_WORDWRAP |HTC_AUTO_SCROLL_BARS | HTC_UNDERLINE_HOVER,rect.left,rect.top,rect.Width(),rect.Height(),m_hWnd,0);
	NewChannel( GetResString(IDS_STATUS), 1 );
	NewChannel( GetResString(IDS_IRC_CHANNELLIST), 2);
	m_pIRCFont = new CFont();
	m_pIRCFont->CreatePointFont(110,_T("Times New Roman"));
	statusWindow.SetFont(m_pIRCFont);
	titleWindow.SetFont(m_pIRCFont);
	inputWindow.SetFont(m_pIRCFont);

	m_pCurrentChannel = (Channel*)channelPtrList.GetTail();
	AddStatus( GetResString(IDS_IRC_STATUSLOG ));
	titleWindow.SetWindowText(GetResString(IDS_IRC_CHANNELLIST));
	channelselect.SetCurSel(1);
	
	AddAnchor(IDC_BN_IRCCONNECT,BOTTOM_LEFT);
	AddAnchor(IDC_CLOSECHAT,BOTTOM_LEFT);
	AddAnchor(IDC_CHATSEND,BOTTOM_RIGHT);
	AddAnchor(IDC_INPUTWINDOW,BOTTOM_LEFT,BOTTOM_RIGHT);
	AddAnchor(IDC_NICKLIST,TOP_LEFT,BOTTOM_LEFT);
	AddAnchor(IDC_TITLEWINDOW,TOP_LEFT,TOP_RIGHT);
	AddAnchor(IDC_SERVERCHANNELLIST,TOP_LEFT,BOTTOM_RIGHT);
	AddAnchor(statusWindow,TOP_LEFT,BOTTOM_RIGHT);
	AddAnchor(IDC_TAB2,TOP_LEFT, TOP_RIGHT);

	serverChannelList.SortItems(SortProcChanL, 11);
	serverChannelList.SetSortArrow(1, false);
	nickList.SortItems(SortProcNick, 0);
	return true;
}

void CIrcWnd::OnSize(UINT nType, int cx, int cy) 
{
	CResizableDialog::OnSize(nType, cx, cy);
}

int CIrcWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) {
	return CResizableDialog::OnCreate(lpCreateStruct);
}

void CIrcWnd::DoDataExchange(CDataExchange* pDX)
{
	CResizableDialog::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_NICKLIST, nickList);
	DDX_Control(pDX, IDC_INPUTWINDOW, inputWindow);
	DDX_Control(pDX, IDC_TITLEWINDOW, titleWindow);
	DDX_Control(pDX, IDC_SERVERCHANNELLIST, serverChannelList);
	DDX_Control(pDX, IDC_TAB2, channelselect);

}

BOOL CIrcWnd::OnCommand(WPARAM wParam,LPARAM lParam ){ 
   int nickItem= nickList.GetSelectionMark(); 
   int chanItem= channelselect.GetCurSel(); 
   int chanLItem= serverChannelList.GetSelectionMark(); 
   switch( wParam ){
	   case IDC_BN_IRCCONNECT: {
		   OnBnClickedBnIrcconnect();
		   return true;
	   }
	   case IDC_CHATSEND: {
		   OnBnClickedChatsend();
		   return true;
	   }
	   case IDC_CLOSECHAT: {
		   OnBnClickedClosechat();
		   return true;
	   }
	   case Irc_Priv: {
		   Nick* nick = (Nick*)nickList.GetItemData(nickItem);
		   if(nick)
			   AddInfoMessage( nick->nick, GetResString(IDS_IRC_PRIVATECHANSTART));
		   return true;
	   }
	   case Irc_Op: {
		   Nick* nick = (Nick*)nickList.GetItemData(nickItem);
		   TCITEM item;
		   item.mask = TCIF_PARAM;
		   channelselect.GetItem(chanItem,&item);
		   Channel* chan = (Channel*)item.lParam;
		   if( nick && chan ){
			   CString send;
			   send.Format( "MODE %s +o %s", chan->name, nick->nick );
			   m_pIrcMain->SendString(send);
		   }
		   return true;
	   }
	   case Irc_DeOp: {
		   Nick* nick = (Nick*)nickList.GetItemData(nickItem);
		   TCITEM item;
		   item.mask = TCIF_PARAM;
		   channelselect.GetItem(chanItem,&item);
		   Channel* chan = (Channel*)item.lParam;
		   if( nick && chan ){
			   CString send;
			   send.Format( "MODE %s -o %s", chan->name, nick->nick );
			   m_pIrcMain->SendString(send);
		   }
		   return true;
	   }
	   case Irc_HalfOp: {
		   Nick* nick = (Nick*)nickList.GetItemData(nickItem);
		   TCITEM item;
		   item.mask = TCIF_PARAM;
		   channelselect.GetItem(chanItem,&item);
		   Channel* chan = (Channel*)item.lParam;
		   if( nick && chan ){
			   CString send;
			   send.Format( "MODE %s +h %s", chan->name, nick->nick );
			   m_pIrcMain->SendString(send);
		   }
		   return true;
	   }
	   case Irc_DeHalfOp: {
		   Nick* nick = (Nick*)nickList.GetItemData(nickItem);
		   TCITEM item;
		   item.mask = TCIF_PARAM;
		   channelselect.GetItem(chanItem,&item);
		   Channel* chan = (Channel*)item.lParam;
		   if( nick && chan ){
			   CString send;
			   send.Format( "MODE %s -h %s", chan->name, nick->nick );
			   m_pIrcMain->SendString(send);
		   }
		   return true;
	   }
	   case Irc_Voice: {
		   Nick* nick = (Nick*)nickList.GetItemData(nickItem);
		   TCITEM item;
		   item.mask = TCIF_PARAM;
		   channelselect.GetItem(chanItem,&item);
		   Channel* chan = (Channel*)item.lParam;
		   if( nick && chan ){
			   CString send;
			   send.Format( "MODE %s +v %s", chan->name, nick->nick );
			   m_pIrcMain->SendString(send);
		   }
		   return true;
	   }
	   case Irc_DeVoice: {
		   Nick* nick = (Nick*)nickList.GetItemData(nickItem);
		   TCITEM item;
		   item.mask = TCIF_PARAM;
		   channelselect.GetItem(chanItem,&item);
		   Channel* chan = (Channel*)item.lParam;
		   if( nick && chan ){
			   CString send;
			   send.Format( "MODE %s -v %s", chan->name, nick->nick );
			   m_pIrcMain->SendString(send);
		   }
		   return true;
	   }
	   case Irc_Kick: {
		   Nick* nick = (Nick*)nickList.GetItemData(nickItem);
		   TCITEM item;
		   item.mask = TCIF_PARAM;
		   channelselect.GetItem(chanItem,&item);
		   Channel* chan = (Channel*)item.lParam;
		   if( nick && chan ){
			   CString send;
			   send.Format( "KICK %s %s", chan->name, nick->nick );
			   m_pIrcMain->SendString(send);
		   }
		   return true;
	   }
	   case Irc_Slap: {
		   Nick* nick = (Nick*)nickList.GetItemData(nickItem);
		   TCITEM item;
		   item.mask = TCIF_PARAM;
		   channelselect.GetItem(chanItem,&item);
		   Channel* chan = (Channel*)item.lParam;
		   if( nick && chan ){
			   CString send;
			   send.Format( IDS_IRC_SLAPMSGSEND, chan->name, nick->nick );
			   AddInfoMessage( chan->name, GetResString(IDS_IRC_SLAPMSG), m_pIrcMain->GetNick(), nick->nick);
			   m_pIrcMain->SendString(send);
		   }
		   return true;
	   }
	   case Irc_AddFriend: {
		   Nick* nick = (Nick*)nickList.GetItemData(nickItem);
		   TCITEM item;
		   item.mask = TCIF_PARAM;
		   channelselect.GetItem(chanItem,&item);
		   Channel* chan = (Channel*)item.lParam;
		   if( nick && chan ){
			   CString send;
			   send.Format( "PRIVMSG %s :\001RSQFRIEND |%i|\001", nick->nick, m_pIrcMain->SetVerify() );
			   m_pIrcMain->SendString(send);
		   }
		   return true;
	   }
	   case Irc_SendLink: {
   		   Nick* nick = (Nick*)nickList.GetItemData(nickItem);
		   TCITEM item;
		   item.mask = TCIF_PARAM;
		   channelselect.GetItem(chanItem,&item);
		   Channel* chan = (Channel*)item.lParam;
		   if( nick && chan ){
			   CString send;
			   send.Format( "PRIVMSG %s :\001SENDLINK !|%s\001", nick->nick, GetSendFileString() );
			   m_pIrcMain->SendString(send);
		   }
		   return true;
		}

	   case Irc_Close: {
		   OnBnClickedClosechat();
		   return true;
	   }
	   case Irc_Join: {
		   JoinChannels();
		   return true;
	   }
   }
   return true;
}

BOOL CIrcWnd::PreTranslateMessage(MSG* pMsg) {
   if((pMsg->message == WM_KEYDOWN) && (pMsg->wParam == 13)){
	   if (pMsg->hwnd == GetDlgItem(IDC_INPUTWINDOW)->m_hWnd)
			OnBnClickedChatsend();
   }
   return CResizableDialog::PreTranslateMessage(pMsg);
}

void CIrcWnd::OnBnClickedBnIrcconnect()
{
	if(!m_bConnected){
		m_pIrcMain->Connect();
	}
	else{
		m_pIrcMain->Disconnect();
	}
}

void CIrcWnd::OnBnClickedClosechat()
{
	TCITEM item;
	item.mask = TCIF_PARAM;
	int cur_sel = channelselect.GetCurSel();
	if (cur_sel == (-1))
		return;
	channelselect.GetItem(cur_sel,&item);
	Channel* partChannel = (Channel*)item.lParam;
	if( partChannel ){
		if( partChannel->type == 4 &&  m_bConnected){
			CString part;
			part = "PART " + partChannel->name;
			m_pIrcMain->SendString( part );
			return;
		}
		else if (partChannel->type == 5 || partChannel->type == 4){
			RemoveChannel(partChannel->name);
			return;
		}
	}
}

void CIrcWnd::OnTcnSelchangeTab2(NMHDR *pNMHDR, LRESULT *pResult)
{
//	int index = -1;
//	LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
	// TODO: Add your control notification handler code here
	nickList.DeleteAllItems();

	TCITEM item;
	item.mask = TCIF_PARAM;
	int cur_sel = channelselect.GetCurSel();
	if (cur_sel == (-1))
		return;
	channelselect.GetItem(cur_sel,&item);
	Channel* update = (Channel*)item.lParam;
	m_pCurrentChannel = update;
	UpdateNickCount();
	if( m_pCurrentChannel->type == 1 ){
		titleWindow.SetWindowText(GetResString(IDS_STATUS));
		statusWindow.ShowWindow(SW_SHOW);
		serverChannelList.ShowWindow(SW_HIDE);
	}
	if( m_pCurrentChannel->type == 2 ){
		titleWindow.SetWindowText(GetResString(IDS_IRC_CHANNELLIST));
		statusWindow.ShowWindow(SW_HIDE);
		serverChannelList.ShowWindow(SW_SHOW);
		return;
	}
	SetActivity( m_pCurrentChannel->name, false );
	statusWindow.SetHyperText(&m_pCurrentChannel->log);
	statusWindow.ShowWindow(SW_SHOW);
	serverChannelList.ShowWindow(SW_HIDE);
	RefreshNickList( update->name );
	SetTitle( update->name, update->title );
	if( pResult )
		*pResult = 0;
}

BEGIN_MESSAGE_MAP(CIrcWnd, CDialog)
	ON_NOTIFY(NM_CLICK, IDC_NICKLIST, OnNMClickNicklist)
	ON_NOTIFY(NM_DBLCLK, IDC_SERVERCHANNELLIST, OnNMDblclkserverChannelList)
	ON_NOTIFY(NM_DBLCLK, IDC_NICKLIST, OnNMDblclkNickList)
	ON_NOTIFY(LVN_COLUMNCLICK, IDC_NICKLIST, OnColumnClickNick)
	ON_NOTIFY(LVN_COLUMNCLICK, IDC_SERVERCHANNELLIST, OnColumnClickChanL)

⌨️ 快捷键说明

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