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

📄 yhjkdlg.cpp

📁 智能大厦自动报警系统---网上搜集的资料
💻 CPP
字号:
// yhjkDlg.cpp : implementation file
//

#include "stdafx.h"
#include "yhjk.h"
#include "yhjkDlg.h"
#include "resource.h"
#include "Dbfcssz.h"
#include "DPortSet.h"
#include "DLog.h"
#include "Ddjdzsz.h"
#include "DCall.h"
#include "Dcjcssz.h"
#include  "tapi.h"
#include "DSystem.h"
#include "DCs.h"
#include "ExternDllHeader.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CMainDlg dialog

CMainDlg::CMainDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CMainDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CMainDlg)
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_IsTimeRun=false;
	m_Subscript=0;
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CMainDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CMainDlg)
	DDX_Control(pDX, IDC_BUT_CS, m_ButCs);
	DDX_Control(pDX, IDC_BUT_XTGL, m_ButXtgl);
	DDX_Control(pDX, IDC_BUT_RZGL, m_ButRzgl);
	DDX_Control(pDX, IDC_BUT_CJCSSZ, m_ButCjcssz);
	DDX_Control(pDX, IDC_BUT_CKSXSZ, m_ButCkszsz);
	DDX_Control(pDX, IDC_BUT_BJDZSZ, m_ButBjdzsz);
	DDX_Control(pDX, IDC_BUT_BFCSSZ, m_ButBfcssz);
	DDX_Control(pDX, IDC_MSCOMM, m_Com);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CMainDlg, CDialog)
	//{{AFX_MSG_MAP(CMainDlg)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUT_BFCSSZ, OnButBfcssz)
	ON_BN_CLICKED(IDC_BUT_CJCSSZ, OnButCjcssz)
	ON_BN_CLICKED(IDC_BUT_BJDZSZ, OnButBjdzsz)
	ON_COMMAND(ID_EXIT, OnExit)
	ON_BN_CLICKED(IDC_BUT_CKSXSZ, OnButCksxsz)
	ON_BN_CLICKED(IDC_BUT_RZGL, OnButRzgl)
	ON_WM_CLOSE()
	ON_COMMAND(ID_HIDE, OnHide)
	ON_COMMAND(ID_SET, OnSet)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_BUT_XTGL, OnButXtgl)
	ON_MESSAGE(WM_ONTRAY,OnTray)
	ON_BN_CLICKED(IDC_BUT_CS, OnButCs)
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_ONTRAY,OnTray)

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMainDlg message handlers

BOOL CMainDlg::OnInitDialog()
{
	CDialog::OnInitDialog();
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	// TODO: Add extra initialization here
	this->m_ButBfcssz.LoadPic(IDB_BIT_BUTUP,IDB_BIT_BUTDOWN,IDB_BIT_BUTUP);
	this->m_ButBjdzsz.LoadPic(IDB_BIT_BUTUP,IDB_BIT_BUTDOWN,IDB_BIT_BUTUP);
	this->m_ButCjcssz.LoadPic(IDB_BIT_BUTUP,IDB_BIT_BUTDOWN,IDB_BIT_BUTUP);
	this->m_ButCkszsz.LoadPic(IDB_BIT_BUTUP,IDB_BIT_BUTDOWN,IDB_BIT_BUTUP);
	this->m_ButRzgl.LoadPic(IDB_BIT_BUTUP,IDB_BIT_BUTDOWN,IDB_BIT_BUTUP);
	this->m_ButXtgl.LoadPic(IDB_BIT_BUTUP,IDB_BIT_BUTDOWN,IDB_BIT_BUTUP);
	this->m_ButCs.LoadPic(IDB_BIT_BUTUP,IDB_BIT_BUTDOWN,IDB_BIT_BUTUP);

	//添加系统托盘
	char lpszTip[]="智能大厦自动报警系统";
	NOTIFYICONDATA data;
	data.cbSize=sizeof(NOTIFYICONDATA);
	data.hWnd=m_hWnd;
	lstrcpyn(data.szTip,lpszTip,sizeof(lpszTip));
	data.uCallbackMessage=WM_ONTRAY;
	data.uFlags=NIF_MESSAGE|NIF_ICON|NIF_TIP;
	data.hIcon=m_hIcon;
	data.uID=IDR_MAINFRAME;
	Shell_NotifyIcon(NIM_ADD,&data);

	//打开数据库,取出设置
	RxRecordset rst;
	rst.Open("端口设置表");
	CString sInBuffer,sOutBuffer,sPort,sRate,sCheckOut,sBits,sStopBits;
	sInBuffer=rst.GetFieldValue("输入缓冲区");
	sOutBuffer=rst.GetFieldValue("输出缓冲区");
	sPort=rst.GetFieldValue("默认端口");
	sRate=rst.GetFieldValue("波特率");
	sCheckOut=rst.GetFieldValue("校验");
	sBits=rst.GetFieldValue("数据位");
	sStopBits=rst.GetFieldValue("停止位");
	CString sValue;
	CString sLength;
	sCheckOut=sCheckOut.Left(1);
	sValue.Format("%s,%s,%s,%s",sRate,sCheckOut,sBits,sStopBits);
	CString sID;
	sID=sPort.Right(1);
	m_Com.SetCommPort(atoi(sID)); //选择COM

	m_Com.SetInBufferSize(atoi(sInBuffer)); //设置输入缓冲区的大小,Bytes
	m_Com.SetOutBufferSize(atoi(sOutBuffer)); //设置输入缓冲区的大小,Bytes

	if(!m_Com.GetPortOpen()) //打开串口   
	m_Com.SetPortOpen(TRUE);
	m_Com.SetInputMode(1); //设置输入方式为二进制方式
	
	m_Com.SetSettings(sValue); //设置波特率等参数
	rst.Open("SELECT 地址编码长度+动作编码长度 as 长度 FROM 系统设置表",adCmdText);
	sLength=rst.GetFieldValue("长度");
	m_Com.SetRThreshold(atoi(sLength)); //sLength个字符引发一个事件    
	m_Com.SetInputLen(0);
	m_wav.OpenDevice();
	
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CMainDlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	if (IsIconic())
	{
		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;

		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}

	CBitmap bit;
	CDC memDC;
	CRect rect;
	this->GetClientRect(&rect);
	bit.LoadBitmap(IDB_BIT_BLACK);
	memDC.CreateCompatibleDC(&dc);
	memDC.SelectObject(&bit);
	dc.BitBlt(0,0,rect.Width(),rect.Height(),&memDC,0,0,SRCCOPY);
	memDC.DeleteDC();
	::DeleteObject(&bit);

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

void CMainDlg::OnOK() 
{
}

void CMainDlg::OnButBfcssz() 
{
	CDbfcssz dlg;
	dlg.DoModal();
}

void CMainDlg::OnButCjcssz() 
{
	CDcjcssz dlg;
	dlg.DoModal();
}

void CMainDlg::OnButBjdzsz() 
{
	CDdjdzsz dlg;
	dlg.DoModal();
		
}

void CMainDlg::OnButCksxsz() 
{
	CDPortSet dlg;
	dlg.DoModal();
}

void CMainDlg::OnButRzgl() 
{
	CDLog dlg;
	dlg.DoModal();
}

void CMainDlg::OnClose() 
{
	this->CloseWindow();
	this->ShowWindow(SW_HIDE);	
}

void CMainDlg::OnTray(WPARAM wParam, LPARAM lParam)
{
	UINT uMouseMsg=(UINT) lParam;
	if(uMouseMsg==WM_RBUTTONDOWN)
	{
		POINTS point;
		DWORD pos=::GetMessagePos();
		point=MAKEPOINTS(pos);
		CRect rect;
		HWND wnd=::FindWindow("Shell_TrayWnd",NULL);
		::GetWindowRect(wnd,&rect);
			CMenu menu;
		VERIFY(menu.LoadMenu(POP_TRAY));

		CMenu* pPopup = menu.GetSubMenu(0);
		ASSERT(pPopup != NULL);
		CWnd* pWndPopupOwner = this;

		while (pWndPopupOwner->GetStyle() & WS_CHILD)
			pWndPopupOwner = pWndPopupOwner->GetParent();

		pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, rect.top,
			pWndPopupOwner);
	
	}
	if(uMouseMsg==WM_LBUTTONDBLCLK)
		this->ShowWindow(SW_SHOWNOACTIVATE);
}

void CMainDlg::OnCancel() 
{
	if(MessageBox("确定要退出智能大厦自动报警系统吗?","系统提示",MB_OKCANCEL|MB_ICONQUESTION)!=1)
		return;
	this->Close();
}

void CMainDlg::OnExit() 
{
	this->OnCancel();	
}

void CMainDlg::OnHide() 
{
	this->ShowWindow(SW_HIDE);	
	
}

void CMainDlg::OnSet() 
{
	this->ShowWindow(SW_SHOWNOACTIVATE);	
}

void CMainDlg::OnTimer(UINT nIDEvent) 
{
	CString sMessageText;
	this->KillTimer(nIDEvent);
	if(m_Message[0].IsEmpty())
		return;
	CString sLayers;
	int nActs;
	RxRecordset rst;
	rst.Open("系统设置表");
	sLayers=rst.GetFieldValue("楼层数");
	rst.Open("动作设置表");
	nActs=rst.GetRecordCount();
	TAXIS tax,tax2;
	int nCurArray=0;
	for(int m=0;m<=m_Subscript;m++)
	{
		for(int l=0;l<atoi(sLayers);l++)
		{
			for(int a=0;a<nActs;a++)
			{
				if(m_Message[m]==m_Coding[l][a]&&m_Message[m].IsEmpty()!=true)
				{
					CString sLayers,sAct;
					sAct.Format("%d",a+1);
					sLayers.Format("%d楼",l+1);
					sAct=ado.FieldToOtherField("动作设置表","编号",sAct,"动作名称",2);
					tax.Taxis[nCurArray]=a+1;
					nCurArray++;
					sMessageText=sMessageText+m_TimeMessage[m]+ "    "+sLayers+sAct+"\r\n";
				}
			}
		}
	}
	//排序
	tax2=Taxis(tax);
	//根据设定的处警参数报警
	int i=0;
	CString sBS,sStr;
	while(tax2.Taxis[i]!=0 && tax2.Taxis[i]!=-858993460)
	{
		sStr.Format("%d",tax2.Taxis[i]);
		sBS=sBS+sStr+"-";
		i++;
	}
	CString sSQL;
	sBS=sBS.Left(sBS.GetLength()-1);
	sSQL.Format("SELECT * FROM 处警动作设置 WHERE 标识='%s'",sBS);
	rst.Open(sSQL,adCmdText);
	if(rst.GetRecordCount()<1)
	{
		Bell("铃声Ⅰ");
	}
	else
	{
		CString sType,sValue;
		sType=rst.GetFieldValue("动作类型");
		sValue=rst.GetFieldValue("动作参数");
		if(sType=="1")
			Tel(sValue);
		if(sType=="2")
			InPutPort(sValue);
		if(sType=="3")
			Bell(sValue);
	}

	//写到日志中

	FILE * fp;
	fp=fopen("zndsjk.log","a");
	fprintf(fp,"--------------------------------------\n");
	fprintf(fp,"%s\n",sMessageText);
	fprintf(fp,"--------------------------------------\n");
	fclose(fp);
	m_IsTimeRun=false;
	for(m=0;m<=m_Subscript;m++)
	{
		m_Message[m]="";
	}
	m_Subscript=0;
	if(sMessageText.IsEmpty())
	{
		CDialog::OnTimer(nIDEvent);
		return;
	}

	CDCall dlg(NULL,sMessageText);
	dlg.DoModal();
	CDialog::OnTimer(nIDEvent);
}

BEGIN_EVENTSINK_MAP(CMainDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CMainDlg)
	ON_EVENT(CMainDlg, IDC_MSCOMM, 1 /* OnComm */, OnCom, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CMainDlg::OnCom() 
{
	if(	m_IsTimeRun==false)
	{
		m_IsTimeRun=true;
		this->SetTimer(1,30000,NULL);
	}
	VARIANT vResponse;
	char *str;
	char *str1;
	CTime time;
	time=time.GetCurrentTime();
	int YY,MM,DD,hh,mm,ss;
	YY=time.GetYear();
	MM=time.GetMonth();
	DD=time.GetDay();
	hh=time.GetHour();
	mm=time.GetMinute();
	ss=time.GetSecond();
    int k, nEvent, i;
   
    nEvent = m_Com.GetCommEvent();

    switch(nEvent)
	{
	case 2:  //收到大于RTHresshold个字符
		k = m_Com.GetInBufferCount(); //接收到的字符数目
		
		if(k > 0)
		{
			vResponse=m_Com.GetInput(); //read
			//对数据进行其他处理 
           str = (char*)(unsigned char*) vResponse.parray->pvData;
		}    
		// 接收到字符,MSComm控件发送事件
		i = 0;
		str1 = str;
		while (i < k)
		{
			i++;
			str1++;
		}
		*str1 = '\0';
		//清除字符串中的不必要字符
		
		break;
	case 3:  //CTS线状态发生了变化
		break;
	case 4:  //DSR线状态发生了变化
		break;
	case 5:  //CD线状态发生了变化
		break;
	case 6:  //Ring Indicator发生变化
		break;
    }    

	UpdateData(false);
	 bool bHave=false;
	 CString sStr;
	 sStr.Format("%s",(const char *)str);
	for(int n=0;n<m_Subscript;n++)
	{
		if(m_Message[n]==sStr)
			bHave=true;
	}
	if(bHave==true)
		return;
	m_Message[m_Subscript].Format("%s",sStr);
	m_TimeMessage[m_Subscript].Format("%d:%d:%d %d.%d.%d",YY,MM,DD,hh,mm,ss);
	m_Subscript++;

	
}


void CMainDlg::Bell(CString sBellName)
{
	CString sPatch,sFileName,sWavFileName;
	CFile file("zndsjk.log",CFile::modeWrite);
	sPatch=file.GetFilePath();
	sFileName=file.GetFileName();
	sPatch=sPatch.Left(sPatch.GetLength()-sFileName.GetLength());
	
	sWavFileName.Format("%sWAV\\%s.WAV",sPatch,sBellName);
	m_wav.Play(this,sWavFileName);
	
}

void CMainDlg::InPutPort(CString sSend)
{	
	RxRecordset rst;
	rst.Open("端口设置表");
	CString sInBuffer,sOutBuffer,sRate,sCheckOut,sBits,sStopBits;
	sInBuffer=rst.GetFieldValue("输入缓冲区");
	sOutBuffer=rst.GetFieldValue("输出缓冲区");
	sRate=rst.GetFieldValue("波特率");
	sCheckOut=rst.GetFieldValue("校验");
	sBits=rst.GetFieldValue("数据位");
	sStopBits=rst.GetFieldValue("停止位");
	CString sValue;
	sValue.Format("%s,%s,%s,%s",sRate,sCheckOut,sBits,sStopBits);

	rst.Open("系统设置表");
	CString sCOM;
	sCOM=rst.GetFieldValue("输出端口");
	//打开输出端口
	m_OutPutCom.SetCommPort(atoi(sCOM)); //选择COM

	m_OutPutCom.SetInBufferSize(atoi(sInBuffer)); //设置输入缓冲区的大小,Bytes
	m_OutPutCom.SetOutBufferSize(atoi(sOutBuffer)); //设置输入缓冲区的大小,Bytes

	if(!m_OutPutCom.GetPortOpen()) //打开串口   
	m_OutPutCom.SetPortOpen(TRUE);
	m_OutPutCom.SetInputMode(1); //设置输入方式为二进制方式
	
	m_OutPutCom.SetSettings(sValue); //设置波特率等参数
	m_Com.SetInputLen(0);

	//向端口写数据
	UpdateData(true);	
	UpdateData(false);

	m_OutPutCom.SetOutput((_variant_t)(_bstr_t)sSend);

}

void CMainDlg::Tel(CString TelNumber)
{
	CString strBuff;
	CString  strAppName , strCallParty;
	long nResult;

	UpdateData(TRUE);

	nResult = tapiRequestMakeCall(TelNumber, strAppName, strCallParty, _T(""));

	if(nResult != 0)
	{
		strBuff = "电话号码无效";

		switch(nResult)
		{
		//没有Windows电话拨号程序错误
		case TAPIERR_NOREQUESTRECIPIENT:
			strBuff += "Windows电话拨号程序错误";
			break;
		//正在运行,拨号队列已满
		case TAPIERR_REQUESTQUEUEFULL:
			strBuff += "拨号队列已满";
			break;
		//电话号码无效
		case TAPIERR_INVALDESTADDRESS:
			strBuff += "电话号码无效";
			break;
		//其他错误
		default:
			strBuff += "未知错误";
			break;
		}
		//显示错误信息
		::MessageBox(NULL, strBuff, "系统提示", MB_OK);
	}			
}

BOOL CMainDlg::DestroyWindow() 
{
//	m_wav.Stop();
	
	return CDialog::DestroyWindow();
}

void CMainDlg::OnButXtgl() 
{
	CDSystem dlg;
	dlg.DoModal();
}

void CMainDlg::Close()
{
	//删除系统托盘
	NOTIFYICONDATA data;
	data.cbSize=sizeof(NOTIFYICONDATA);
	data.hWnd=m_hWnd;
	data.uID=IDR_MAINFRAME;
	Shell_NotifyIcon(NIM_DELETE,&data);
	CDialog::OnCancel();
}
/*


*/

void CMainDlg::OnButCs() 
{

	CDCs dlg;
	dlg.DoModal();
	CString sSend=dlg.m_String;

	m_Com.SetOutput((_variant_t)(_bstr_t)sSend);

}

⌨️ 快捷键说明

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