ipcountdlg.cpp

来自「IP电话计费管理系统本地版」· C++ 代码 · 共 2,338 行 · 第 1/5 页

CPP
2,338
字号
	}
}

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

void CIPCountDlg::OnSysSetup() 
{
	// TODO: Add your control notification handler code here


    if(!bSystem)
	{
		mdlg->Create(IDD_DIALOG_SETUP);
		mdlg->ShowWindow(SW_SHOW);
		bSystem=TRUE;
	}
	else
	{
		mdlg->DestroyWindow();
		bSystem=FALSE;
	}
}

void CIPCountDlg::OnSaleMang() 
{
	// TODO: Add your control notification handler code here
	int nAddFlag=mdlg->GetAddMoneyFlag();
    nGetSaleCutFlag=mdlg->GetSaleCutFlag();
	nPrintAtOnce=mdlg->GetPrintFlag();
	nPrintMode=mdlg->GetPrintOneFlag();
	strUpSpace=mdlg->GetUpSpace();
    SetInitRate();
	if(bOpenCom[0])
	{
		SendData("c",nGwCom[0]);
		SendData("admin",nGwCom[0]);
		SendData("deb cdr",nGwCom[0]);
        SendData("deb line",nGwCom[0]);		

		if(mdlg->GetNoPreMoney()==0)
		{
		strTempNum[0]=mdlg->GetMoneyLine("Line0");//每一线的押金
		strTempNum[1]=mdlg->GetMoneyLine("Line1");
		strTempNum[2]=mdlg->GetMoneyLine("Line2");
		strTempNum[3]=mdlg->GetMoneyLine("Line3");
		strTempNum[4]=mdlg->GetMoneyLine("Line4");
		strTempNum[5]=mdlg->GetMoneyLine("Line5");
		strTempNum[6]=mdlg->GetMoneyLine("Line6");
		strTempNum[7]=mdlg->GetMoneyLine("Line7");
		}
		else//无押金模式
		{
			for(int nNum=0;nNum<8;nNum++)
				strTempNum[nNum]="";
		}
	}
	
	if(bOpenCom[1])
	{
		SendData("c",nGwCom[1]);
		SendData("admin",nGwCom[1]);
		SendData("deb cdr",nGwCom[1]);
        SendData("deb line",nGwCom[1]);
		
		if(mdlg->GetNoPreMoney()==0)
		{		
		strTempNum[8]=mdlg->GetMoneyLine("Line8");
		strTempNum[9]=mdlg->GetMoneyLine("Line9");
		strTempNum[10]=mdlg->GetMoneyLine("Line10");
		strTempNum[11]=mdlg->GetMoneyLine("Line11");
		strTempNum[12]=mdlg->GetMoneyLine("Line12");
		strTempNum[13]=mdlg->GetMoneyLine("Line13");
		strTempNum[14]=mdlg->GetMoneyLine("Line14");
		strTempNum[15]=mdlg->GetMoneyLine("Line15");
		}
		else
		{
			for(int nNum=8;nNum<16;nNum++)
				strTempNum[nNum]="";
		}
	}

	if(!bOpenSale)
	{
		sdlg->Create(IDD_DIALOG_SALE_MANG);
		sdlg->ShowWindow(SW_SHOW);
        if(nAddFlag==1)
		{
			sdlg->m_AddLine.EnableWindow(TRUE);
			sdlg->m_AddMany.EnableWindow(TRUE);
			sdlg->m_AddMoney.EnableWindow(TRUE);
		}
		bOpenSale=TRUE;
		if (hThread == NULL)
		{
			hThread = CreateThread( //创建线程
				NULL,                        // default security attributes 
				0,                           // use default stack size  
				ReceiveMsgProc,                  // thread function 
				this,                // argument to thread function 
				0,                           // use default creation flags 
				&dwThreadId);                // returns the thread identifier 
		}
	}
	else
	{
		sdlg->OnCancel();
		if(!sdlg->bCanQuit)
			sdlg->ShowWindow(SW_SHOW);
		else
	        bOpenSale=FALSE;
	}

}

void CIPCountDlg::OnStatics() 
{
	// TODO: Add your control notification handler code here
	if(!bOpenStatics)
	{
	m_Sheet=new CStaticsSheet();
	m_page1=new CDayStaticsPage();
	m_page2=new CMonStaticsPage();
	m_Sheet->AddPage(m_page2);
	m_Sheet->AddPage(m_page1);
	m_Sheet->Create(this);
	m_Sheet->ShowWindow(SW_SHOW);
	bOpenStatics=TRUE;
	}
	else
	{
		m_Sheet->DestroyWindow();
		bOpenStatics=FALSE;
	}
}

void CIPCountDlg::OnRate() 
{
	// TODO: Add your control notification handler code here
/*	if (!bRate)
	{
		fdlg->Create(IDD_DIALOG_RATE);
		fdlg->ShowWindow(SW_SHOW);
		bRate=TRUE;
	}
	else
	{
		fdlg->DestroyWindow();
		bRate=FALSE;
	}*/


	if(!bRate)
	{
	m_FSheet=new CFeeRateSheet();
	m_Fpage1=new CFeeRatePage();
	m_Fpage2=new CSaleCutPage();
	m_FSheet->AddPage(m_Fpage1);
	m_FSheet->AddPage(m_Fpage2);
	m_FSheet->Create(this);
	m_FSheet->ShowWindow(SW_SHOW);
	bRate=TRUE;
	}
	else
	{
		m_FSheet->DestroyWindow();
		bRate=FALSE;
	}
}

void CIPCountDlg::OnModpswd() 
{
	// TODO: Add your control notification handler code here

	cdlg->DoModal();
}

void CIPCountDlg::OnVer() 
{
	// TODO: Add your control notification handler code here
	CAboutDlg adlg;
	adlg.DoModal();

}

BEGIN_EVENTSINK_MAP(CIPCountDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CIPCountDlg)
	ON_EVENT(CIPCountDlg, IDC_MSCOMM1, 1 /* OnComm */, OnComm, VTS_NONE)
	ON_EVENT(CIPCountDlg, IDC_MSCOMM2, 1 /* OnComm */, OnComm2, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CIPCountDlg::OnComm() 
{
	// TODO: Add your control notification handler code here
	
    int nRxPort = m_ctrlComm.GetCommPort();

	VARIANT variant_inp;
	COleSafeArray safearray_inp;
	LONG len,k;
	BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
	CString strtemp;
	
	if(m_ctrlComm.GetCommEvent()==2)     //事件值为2表示接收缓冲区内有字符
	{
		variant_inp=m_ctrlComm.GetInput();   //读缓冲区
		safearray_inp=variant_inp;           //VARIANT型变量转换为ColeSafeArray型变量
		len=safearray_inp.GetOneDimSize(); //得到有效数据长度
        n=m_ctrlComm.GetInBufferCount();
		
		for(k=0;k<len;k++)
			safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
		for(k=0;k<len;k++)             //将数组转换为Cstring型变量
		{
			BYTE bt=*(char*)(rxdata+k);      //字符型
			strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
			m_strRXData[0]+=strtemp;    //加入接收编辑框对应字符串
            //下面代码判断是否是回车符
			char str2[2];
			char tempchar[2];
			tempchar[0] = (char)bt;
			tempchar[1] ='\0';
			sprintf(str2,"%c",'\r');//回车符
			if(strcmp(tempchar,str2)==0)  
			{
				OnRecvDTMF(nGwCom[0]);
				int nFind=0;
				nFind=m_strRXData[0].Find('#',0);

				if(nFind!=-1)
				{
					strSaveInfo.Format("%s", m_strRXData[0].Mid(nFind+1));
					m_strRXData[0]="";
					MidInfo(strSaveInfo,nGwCom[0]);
				}
				
			}
			
		}
	} 	
    DealReboot(nGwCom[0]);
}

/////////////////////////////////////////////////////////////
////通用版本新增代码
BOOL CIPCountDlg::InitCom(int nGW, int nInitCom)
{
    if (nGW == 1)
	{
		if(m_ctrlComm.GetPortOpen())
			m_ctrlComm.SetPortOpen(FALSE);
		
		if (!bCommValid(nInitCom))
		{
			CString sMessage = "";
			sMessage.Format("串口%d被占用或不存在", nInitCom);
			AfxMessageBox(sMessage, MB_ICONSTOP);
			return FALSE;
		}
		
		m_ctrlComm.SetCommPort(nInitCom);   //选择nCom号的串口
		if( !m_ctrlComm.GetPortOpen())
		{
			m_ctrlComm.SetPortOpen(TRUE);//打开串口
		}
		else
			AfxMessageBox("cannot open serial port 1");
		
		m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位
		m_ctrlComm.SetInputMode(1); //以二进制方式检到数据
		m_ctrlComm.SetRThreshold(2); //将1改为3
		//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
		m_ctrlComm.SetInputLen(0);  //设置当前接收区数据长度为0
		m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据
	}

	if (nGW == 2)
	{
		if(m_ctrlComm2.GetPortOpen())
			m_ctrlComm2.SetPortOpen(FALSE);
		
		if (!bCommValid(nInitCom))
		{
			CString sMessage = "";
			sMessage.Format("串口%d被占用或不存在", nInitCom);
			AfxMessageBox(sMessage, MB_ICONSTOP);
			return FALSE;
		}
		
		m_ctrlComm2.SetCommPort(nInitCom);   //选择nCom号的串口
		if( !m_ctrlComm2.GetPortOpen())
		{
			m_ctrlComm2.SetPortOpen(TRUE);//打开串口
		}
		else
			AfxMessageBox("cannot open serial port 1");
		
		m_ctrlComm2.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位
		m_ctrlComm2.SetInputMode(1); //以二进制方式检到数据
		m_ctrlComm2.SetRThreshold(2); //将1改为3
		//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
		m_ctrlComm2.SetInputLen(0);  //设置当前接收区数据长度为0
		m_ctrlComm2.GetInput();//先预读缓冲区以清除残留数据
	}
	return TRUE;
}
//end 

BOOL CIPCountDlg::bCommValid(int portnr)
{
	CString szPort;
	HANDLE hComm = NULL;

	// prepare port strings
	szPort.Format("COM%d", portnr);
		
	// get a handle to the port
	hComm = CreateFile(szPort,					// communication port string (COMX)
			     GENERIC_READ | GENERIC_WRITE,	// read/write types
			     0,								// comm devices must be opened with exclusive access
			     NULL,							// no security attributes
			     OPEN_EXISTING,					// comm devices must use OPEN_EXISTING
			     FILE_FLAG_OVERLAPPED,			// Async I/O
			     0);							// template must be 0 for comm devices
	
	if (hComm == INVALID_HANDLE_VALUE)
	{
		// port not found
		return FALSE;	
	}
	else
	{
		CloseHandle(hComm);
		hComm = NULL;
		return TRUE;
	}
}

void CIPCountDlg::OnRecvDTMF(int nCom)
{
    int k=0;
	int nLine = 0;
	k=m_strRXData[0].Find('(',0);	
	if(k!=-1)
	{	
		CString strChan=m_strRXData[0].Mid(k-4,2);

 	    if(strcmp(strChan,"ch")==0)//判断是否是摘挂机
		{
		   CString strLine=m_strRXData[0].Mid(k+1,1);
		   
           CString strHangUp=m_strRXData[0].Mid(k+9,2);

		   m_strRXData[0]="";
		   nLine=atoi(strLine);

           if (nCom == nGwCom[0])
			   nLine = nLine + 1;
		   else if (nCom == nGwCom[1])
			   nLine = nLine + 9;
		   
		   if(strcmp(strHangUp,"up")==0)
		   {
			   if(bOpenSale)
			   {
				   if(strcmp(sdlg->m_SaleGrid.GetTextMatrix(nLine,9),"开")==0)
				   {
				       nFlagLine[nLine-1]=1;//摘机
				       ShowStatus(nLine,1,"摘机");
				       ShowStatus(nLine,2,"");
				       ShowStatus(nLine,3,"");
				       ShowStatus(nLine,4,"");
				       ShowStatus(nLine,5,"");
				       ShowStatus(nLine,6,"");
				       m_CalledTempNum[nLine-1]="";
					   bClosed[nLine-1]=FALSE;
					   bTalking[nLine-1]=FALSE;

				   }//end of 是否开按钮
				   else
					   m_CalledTempNum[nLine-1]="";//09-26
			   }//end of bOpenSale
			   
		  }//end of up
		  else //挂机
		   {
 			      if(bOpenSale)
				  {	
				      if(strcmp(sdlg->m_SaleGrid.GetTextMatrix(nLine,9),"开")==0)
					  {	
 					      nFlagLine[nLine-1]=6;//挂机
                          if(bClosed[nLine-1])//对方先挂机
							  bClosed[nLine-1]=FALSE;//待测试

						  if((!bClosed[nLine-1])&&(!bTalking[nLine-1]))//没有通话或对方先挂机
						  {
							  if(bClosedLine[nLine-1])
							  {
								  sdlg->nCountClk[nLine-1]=0;
								  nFlagLine[nLine-1]=7;//锁定
								  ShowStatus(nLine,1,"锁定");
								  ShowStatus(nLine,9,"关");
								  ShowLineColor(nLine-1,RGB(255,50,0));
							  }
							  else
							  {
								  nFlagLine[nLine-1]=0;
								  if(strcmp(sdlg->m_SaleGrid.GetTextMatrix(nLine,3),"")==0)//拨号未通话时
								  {
								      ShowStatus(nLine,2,"");//清空信息
								      ShowStatus(nLine,5,"");
								  }
								  ShowStatus(nLine,1,"空闲");
								  ShowLineColor(nLine-1,RGB(0,40,140));
							  }
							  return;
						  }

                          if(strcmp(sdlg->m_SaleGrid.GetTextMatrix(nLine,2),"锁定")!=0)
						  {
					         int nRadio=mdlg->GetRadio();//从注册表获得设置信息
					         if(nRadio==0)
						         nRadio=1;//默认为挂机自动锁定

					         if(nRadio==1)//如果是挂机自动锁机
							 {
								 sdlg->nCountClk[nLine-1]=0;
								 sdlg->ControlLine(sdlg->nCountClk[nLine-1],nLine);//
							 }
					         else
							 {
							     if(bClosedLine[nLine-1])
								 {
								     nFlagLine[nLine-1]=7;//锁定
								     ShowStatus(nLine,1,"锁定");
									 ShowStatus(nLine,9,"关");
									 ShowLineColor(nLine-1,RGB(255,50,0));
								 }
							     else
								 {
								     nFlagLine[nLine-1]=0;
								     ShowStatus(nLine,1,"空闲");
									 ShowLineColor(nLine-1,RGB(0,40,140));
								 }
							 }
						  }
					 }
					 else //状态为关
                     {
						  nFlagLine[nLine-1]=7;//锁定
						  ShowStatus(nLine,1,"锁定");
					 }
				  }
  		   }
           m_strRXData[0]="";
 		}
		else if(strcmp(strChan,"Ch")==0)//拨号
		{
		   	CString strLine=m_strRXData[0].Mid(k+1,1);
            if(IsCharAlpha(strLine[0]))//处理掉非数字的字符,如果线号出错,直接返回
				return;
			nLine=atoi(strLine);

⌨️ 快捷键说明

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