📄 yhjkdlg.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 + -