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

📄 bqqdlg.cpp

📁 该源代码实现了局域网内的信息传递、文件传输
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// BQQDlg.cpp : implementation file
//

#include "stdafx.h"
#include "BQQ.h"
#include "BQQDlg.h"


//#include "computerlist.h"
#include "parameter.h"
#include "mailslot.h"

//#include "mysheet.h"
#include "myAddrDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
//===========================================================================
extern BOOL	g_bExit;
extern CStringList g_listGroup;
extern BOOL	g_bSending;
extern BOOL	g_bSendOnly;

extern BOOL	g_bAlwaysTop;
extern BOOL	g_bHide;
extern BOOL	g_bEnableTooltips;
extern BOOL	g_bAutoPopup;
extern BOOL	g_bAutoPopupMessBox;
extern BOOL	g_bCloseDelLast;
extern BOOL	g_bUseSmiley;
extern BOOL	g_bPlaySound;
extern BOOL	m_bEnter2Send;
extern int	g_iMaxLast;
extern UINT	g_uCloseAfter;
extern CString	g_sSignature;
extern BYTE g_buffer[MAX_BUFFER_SIZE+1];
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog
{
public:
	CAboutDlg();

// Dialog Data
	//{{AFX_DATA(CAboutDlg)
	enum { IDD = IDD_ABOUTBOX };
	//}}AFX_DATA

	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CAboutDlg)
	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
	//}}AFX_VIRTUAL

// Implementation
protected:
	//{{AFX_MSG(CAboutDlg)
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
	//{{AFX_DATA_INIT(CAboutDlg)
	//}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CAboutDlg)
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
	//{{AFX_MSG_MAP(CAboutDlg)
		// No message handlers
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBQQDlg dialog

CBQQDlg::CBQQDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CBQQDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CBQQDlg)
	m_InOutMsg = _T("");
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	m_bClose = FALSE;
	g_bExit = FALSE;
	first = TRUE;
}

void CBQQDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CBQQDlg)
	DDX_Control(pDX, IDC_ADDRLIST, m_AddrEdit);
	DDX_Control(pDX, IDC_SEND, m_Send);
	DDX_Control(pDX, IDC_ADDRESS, m_Addr);
	DDX_Control(pDX, IDC_ANONYMOUS, m_Anony);
	DDX_Control(pDX, IDC_PARAM, m_Param);
	DDX_Control(pDX, IDC_INPUTMSG, m_InputMsg);
	DDX_Control(pDX, IDC_INCLUDEATTACH, m_IncAttach);
	DDX_Control(pDX, IDC_HISTORY, m_History);
	//DDX_Control(pDX, IDC_CLEAR, m_Clear);
	DDX_Control(pDX, IDC_ATTACH, m_Attach);
	DDX_Control(pDX, IDC_INOUT, m_InOutCtrl);
	DDX_Text(pDX, IDC_INOUT, m_InOutMsg);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CBQQDlg, CDialog)
	//{{AFX_MSG_MAP(CBQQDlg)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_HISTORY, OnHistory)
//	ON_BN_CLICKED(IDC_CLEAR, OnClear)
	ON_BN_CLICKED(IDC_PARAM, OnParam)
	ON_BN_CLICKED(IDC_ATTACH, OnAttach)
	ON_BN_CLICKED(IDC_SEND, OnSend)
	ON_BN_CLICKED(IDC_ADDRESS, OnAddress)
	ON_WM_KEYDOWN()
	ON_BN_CLICKED(IDC_INPUTMSG, OnInputmsg)
	ON_MESSAGE(WM_RECEIVE_MESSAGE, OnSetMessage)
	ON_WM_CLOSE()
	ON_WM_CREATE()
	ON_WM_TIMER()
	ON_WM_QUERYENDSESSION()
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_LIBEN,OnLiben)//reload the window 
	ON_MESSAGE(WM_HOTKEY,OnHotKey)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CBQQDlg message handlers

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

	// Add "About..." menu item to system menu.

	// IDM_ABOUTBOX must be in the system command range.
	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);
		}
	}

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	// TODO: Add extra initialization here
	LOGFONT lf1={12,0,0,0,FW_LIGHT,0,0,0,0,0,0,0,0,"宋体"};
	m_Send.SetFont(&lf1);
	m_Send.SetToolTipText("发送");
	m_Send.SetShade(SHS_SOFTBUMP);
	m_Addr.SetFont(&lf1);
	m_Addr.SetToolTipText("地址");
	m_Addr.SetShade(SHS_SOFTBUMP);
	m_Anony.SetFont(&lf1);
	m_Anony.SetToolTipText("匿名发送");
	m_Anony.SetShade(SHS_METAL,8,30); 
	m_Anony.SetIcon(IDI_UNCHECKED, BS_LEFT, IDI_CHECKED);
	m_Param.SetFont(&lf1);
	m_Param.SetToolTipText("设置");
	m_Param.SetShade(SHS_SOFTBUMP);
	m_InputMsg.SetFont(&lf1);
	m_InputMsg.SetToolTipText("回复");
	m_InputMsg.SetShade(SHS_SOFTBUMP);
	m_IncAttach.SetFont(&lf1);
	m_IncAttach.SetToolTipText("没有附件");
	m_IncAttach.SetShade(SHS_METAL,8,30); 
	m_IncAttach.SetIcon(IDI_UNCHECKED, BS_LEFT, IDI_CHECKED);
	m_History.SetFont(&lf1);
	m_History.SetToolTipText("历史");
	m_History.SetShade(SHS_SOFTBUMP);
	//m_Clear.SetFont(&lf1);
	//m_Clear.SetToolTipText("清空");
	//m_Clear.SetShade(SHS_SOFTBUMP);
	m_Attach.SetFont(&lf1);
	m_Attach.SetToolTipText("附件");
	m_Attach.SetShade(SHS_SOFTBUMP);
	m_AddrEdit.SetDimText(_T("请输入发送地址"));
	//m_InOutCtrl.SetDimText(_T("按键开始输入!"));
	///topmost show
	int onTop = 0,sav=0,startServ=0;
	int x = ::GetSystemMetrics(SM_CXMAXIMIZED);
	int y =  ::GetSystemMetrics(SM_CYMAXIMIZED);
	onTop = ((CBQQApp*)AfxGetApp())->GetProfileInt("privatesetting","onTop",0);
	if(onTop == 1)
		((CBQQApp*)AfxGetApp())->m_pMainWnd->SetWindowPos(&CWnd::wndTopMost,x/4,y/4,0,0,SWP_NOSIZE);
	sav = ((CBQQApp*)AfxGetApp())->GetProfileInt("privatesetting","autoSave",0);
	if(sav == 0)
		((CBQQApp*)AfxGetApp())->WriteProfileInt("privatesetting","autoSave",1);
	startServ =	((CBQQApp*)AfxGetApp())->GetProfileInt("privatesetting","autoRestart",2);
	if(startServ ==2)
		((CBQQApp*)AfxGetApp())->WriteProfileInt("privatesetting","autoRestart",1);
	////////////////
	AfxBeginThread( ServerMailslot, this);
	//m_nTimer = SetTimer(1,600000,0);
	m_nTimer0 = SetTimer(2,1000,0);
	if(!CreateListenerSock())//listen
	{
		MessageBox("创建套接字失败,系统\r\n将不能接受SOCKET消息!","提示",MB_ICONERROR|MB_OK);
	}
	int tips = ((CBQQApp*)AfxGetApp())->GetProfileInt("privatesetting","Tips",2);
	if(tips >= 1)
	{
		GetDlgItem(IDC_INOUT)->SetWindowText("\t使用手册:\r\n\t\t1、请不要屏蔽2118端口\r\n\t\
											2、如果对方没有安装本软件,将不能发送附件,也不能通过IP发送消息\r\n\t\
											3、使用本信使前,请关掉其它信使服务,及加入DCOM支持\r\n\t\
											4、第一次使用使用时请先设置相应的参数,部分功能右键提供\r\n\t\
											5、呼出热键为CTRL+ALT+A、F4,隐藏为ESC键\r\n\t\
											6、如果对方没有装本信使且不在一个子网内,发送将失败\r\n\t\
											7、频繁关闭并启动本程序的时间间隔请不要小于60秒\r\n\t\
											8、任何问题请与作者联系,谢谢\r\n");
		if(tips ==2)
			((CBQQApp*)AfxGetApp())->WriteProfileInt("privatesetting","Tips",0);
	}
	GetDlgItem(IDC_INPUTMSG)->EnableWindow(FALSE);
	GetDlgItem(IDC_INOUT)->SetFocus();
	((CBQQApp*)AfxGetApp())->hasAttachment = hasAttachment = FALSE;
	isAnonymous = FALSE;
	fileName = _T("");
	hostName = _T("");
	sendTarget = _T("");
	isHistory = FALSE;
	sendTarget = _T("");
	file="";
	///////////////////
	//CHAR *hostN = new CHAR[MAX_PATH+1];
	//ZeroMemory(hostN,MAX_PATH+1);
	//if(SOCKET_ERROR == gethostname(hostN,MAX_PATH))
	//	ASSERT(0);
	CString hostIP="",sName="";
		//////////////////////
	TCHAR sComputerName[MAX_NAME_SIZE+1];
	DWORD nSize = MAX_NAME_SIZE;
	if ( !GetComputerName( sComputerName,  &nSize) )
			strcpy(sComputerName, "iunknown");
	//////////////////////
	//sName.Format("%s",hostN);
	sName.Format("%s",sComputerName);
	//////////////////////
	((CBQQApp*)AfxGetApp())->senderName=sName;
	unsigned long hsIP=  GetHsByName(sName);
	hostIP.Format("%u",hsIP);
	((CBQQApp*)AfxGetApp())->hostIP=hostIP;
	//delete hostN;

	//HidenIt();
	///////////////////////////////////////
	//AnimateWindow(this->GetSafeHwnd(),300,AW_SLIDE|AW_CENTER);
	///AnimateWindow(this->GetSafeHwnd(),400,AW_BLEND|AW_HIDE|AW_HOR_NEGATIVE|AW_VER_POSITIVE);
	return FALSE;  // return TRUE  unless you set the focus to a control
}

void CBQQDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else if(SC_MINIMIZE ==nID)
	{
		HidenIt();
	}
/*
	else if(nID == SC_CLOSE)
	{
		CDialog::OnClose();
	}
*/
/*@**#---2002-09-12 17:18:20 (李春)---#**@
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
*/}

// 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 CBQQDlg::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
	{
		CDialog::OnPaint();
	}
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CBQQDlg::OnQueryDragIcon()
{
	return (HCURSOR) m_hIcon;
}

void CBQQDlg::OnHistory() 
{
	// TODO: Add your control notification handler code here

	UpdateData();
	if(((CEdit*)GetDlgItem(IDC_INOUT))->GetStyle()&ES_READONLY )
	{
		OnClear();
		GetDlgItem(IDC_INOUT)->SetWindowText(((CBQQApp*)AfxGetApp())->tmpMsg);
		((CBQQApp*)AfxGetApp())->tmpMsg ="";
		((CButton*)GetDlgItem(IDC_HISTORY))->SetWindowText("历史(&H)");
		((CEdit*)GetDlgItem(IDC_INOUT))->SetReadOnly(FALSE);
		GetDlgItem(IDC_INOUT)->SetFocus();
	
	}
	else
	{
		//if(!(((CEdit*)GetDlgItem(IDC_INOUT))->GetStyle()&ES_READONLY ))
		//CString tt = ((CBQQApp*)AfxGetApp())->tmpMsg;
		GetDlgItem(IDC_INOUT)->GetWindowText(((CBQQApp*)AfxGetApp())->tmpMsg);
		//tt = ((CBQQApp*)AfxGetApp())->tmpMsg;
		CString time="",hisMsg="",log="",workDir=".\\";
		///*
		TCHAR exeFullPath[MAX_PATH];

		GetModuleFileName(GetModuleHandle(AfxGetApp()->m_pszAppName),exeFullPath,MAX_PATH);
		workDir = CString(exeFullPath);
		int curPost=0,posx=0;
		while((curPost=workDir.Find('\\',curPost+1))!=-1)
		{
			posx = curPost;
		}
		workDir = workDir.Left(posx+1);
		//*/

		CTime t = CTime::GetCurrentTime();
		time = t.Format( "%B");
		time+=".log";
		log.Format("%s%s",workDir,time);
		CFile fp;
		fp.Open(log,CFile::modeReadWrite|CFile::modeCreate|CFile::modeNoTruncate);
		long fileLeng = fp.GetLength();
		fp.ReadHuge(hisMsg.GetBuffer(fileLeng),fileLeng);
		hisMsg.ReleaseBuffer();
		fp.Close();
		hisMsg	+= ((CBQQApp*)AfxGetApp())->hisMsg;
		((CEdit*)GetDlgItem(IDC_INOUT))->SetReadOnly(TRUE);
		GetDlgItem(IDC_SEND)->EnableWindow(FALSE);
		GetDlgItem(IDC_INOUT)->SetWindowText(hisMsg);
		int len = GetDlgItem(IDC_INOUT)->GetWindowTextLength();
		((CEdit*)GetDlgItem(IDC_INOUT))->SetSel(len,len);
		((CEdit*)GetDlgItem(IDC_INOUT))->ReplaceSel("");
		isHistory = TRUE;
		//GetDlgItem(IDC_HISTORY)->EnableWindow(FALSE);
		((CButton*)GetDlgItem(IDC_HISTORY))->SetWindowText("清除历史(&C)");
		GetDlgItem(IDC_INOUT)->SetFocus();

	}
}

void CBQQDlg::OnClear() 
{
	// TODO: Add your control notification handler code here
	//((CBQQApp*)AfxGetApp())->tmpMsg="";
	GetDlgItem(IDC_INOUT)->SetWindowText("");
	GetDlgItem(IDC_SEND)->EnableWindow(TRUE);
	GetDlgItem(IDC_INPUTMSG)->EnableWindow(FALSE);
	GetDlgItem(IDC_INOUT)->SetFocus();
	((CEdit*)GetDlgItem(IDC_INOUT))->SetReadOnly(FALSE);
	GetDlgItem(IDC_HISTORY)->EnableWindow(TRUE);
	isHistory = FALSE;
}

void CBQQDlg::OnParam() 
{
	// TODO: Add your control notification handler code here
	CParameter paramDlg;
	if(paramDlg.DoModal()==IDOK)
	{
	}
}

void CBQQDlg::OnAttach() 
{
	// TODO: Add your control notification handler code here
	hasAttachment = ((CBQQApp*)AfxGetApp())->hasAttachment;
	if(hasAttachment)
	{
		((CButton*)GetDlgItem(IDC_INCLUDEATTACH))->SetCheck(BST_UNCHECKED);
		GetDlgItem(IDC_INCLUDEATTACH)->EnableWindow(FALSE);
		GetDlgItem(IDC_ATTACH)->SetWindowText("附件(&F)");
		fileName = "";
		//((CBQQApp*)AfxGetApp())->sendFileFullName ="";
		//((CBQQApp*)AfxGetApp())->sendFileFullName ="";
		((CBQQApp*)AfxGetApp())->hasAttachment = hasAttachment = FALSE;
		return;
	}
	CFileDialog flDlg(TRUE, NULL, NULL,
		OFN_FILEMUSTEXIST | OFN_ENABLESIZING | OFN_HIDEREADONLY,
		"All files|*.*||", this);
	if(flDlg.DoModal()==IDOK)
	{
		((CBQQApp*)AfxGetApp())->sendFileFullName = "";
		((CBQQApp*)AfxGetApp())->sendFileName ="";
		((CBQQApp*)AfxGetApp())->sendFileFullName = file = flDlg.GetPathName();
		((CBQQApp*)AfxGetApp())->sendFileName = fileName = flDlg.GetFileName();
		GetDlgItem(IDC_INCLUDEATTACH)->EnableWindow(TRUE);
		GetDlgItem(IDC_INCLUDEATTACH)->SetWindowText("发送附件");
		GetDlgItem(IDC_ATTACH)->SetWindowText("清除附件(&D)");
		((CButton*)GetDlgItem(IDC_INCLUDEATTACH))->SetCheck(BST_UNCHECKED);
		((CBQQApp*)AfxGetApp())->hasAttachment = hasAttachment = TRUE;
	}
	else
	{
		
		GetDlgItem(IDC_INCLUDEATTACH)->EnableWindow(FALSE);
		GetDlgItem(IDC_INCLUDEATTACH)->SetWindowText("没有附件");
		((CButton*)GetDlgItem(IDC_INCLUDEATTACH))->SetCheck(BST_UNCHECKED);
		((CBQQApp*)AfxGetApp())->hasAttachment = hasAttachment = FALSE;
		//UpdateData(FALSE);
	}
}

void CBQQDlg::OnSend() 
{
	// TODO: Add your control notification handler code here
	if(((CEdit*)GetDlgItem(IDC_INOUT))->GetStyle()&ES_READONLY )
	{
		MessageBox("您还没有输入要发送的消息!","提示",MB_ICONINFORMATION|MB_OK);
		return;
	}
	CString msgStr="",tmpStr="",tm="",sdStr="";
	UpdateData();
	if(!FormatAddr())
		return;
	hostName = ((CBQQApp*)AfxGetApp())->senderName;
//	if(sendTarget == hostName || hostName=="")
//	{
//		MessageBox("不用自言自语了吧!","提示");
//		return;
//	}
	//unsigned long hsIP=  GetHsByName(hostName);
	//hostIP.Format("%d",hsIP);
	hostIP=((CBQQApp*)AfxGetApp())->hostIP;
	GetDlgItem(IDC_INOUT)->GetWindowText(sdStr);
	sdStr.TrimLeft();
	sdStr.TrimRight();
	if(sdStr.IsEmpty())
	{
		MessageBox("不能发送空信息!","提示");
		return;
	}
	GetDlgItem(IDC_SEND)->EnableWindow(FALSE);
	HidenIt();
	this->sendMessageStr = sdStr+"\0";
	CStringList psLs;
	parsePhrases(FALSE,sendTarget,';',&psLs);
	///
	//AfxBeginThread(SendData,this);
	//return;
	////
	sendTarget="";
	for (int i = 0; i< psLs.GetCount () ; i++ )
	{
		CString sUser;
		sUser = psLs.GetAt (psLs.FindIndex (i));
		if(!ConnectServer(sUser))
		{
			if(psLs.GetCount ()==1)
				sendTarget += sUser;
			else
				sendTarget += sUser+";";
			continue;
		}
		if(!SendTheMsg(sUser))
			continue;
		//sockClient.Close();

	}
	sockClient.Close();

⌨️ 快捷键说明

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