mymodemdlg.cpp

来自「有gsm打电话功能.可以做图象处理.还有unicode的转化函数」· C++ 代码 · 共 644 行 · 第 1/2 页

CPP
644 行
字号
//DEL }

void CMyModemDlg::OnStop() //停止显示
{
	// TODO: Add your control notification handler code here
	m_ShowBMP.OnStopTimer();
}


/////////////////////////////////////////////////////////////////////
//连接断开事件
void CALLBACK CMyModemDlg::OnDisConnect(CWnd* pWnd)
{
	CTCPClientDlg * pDlg = (CTCPClientDlg*)pWnd;
	
	CStatic * pStatus = (CStatic *)pDlg->GetDlgItem(IDC_LBLCONNSTATUS);
	ASSERT(pStatus != NULL);
	pStatus->SetWindowText(_T("已断开"));
	
	/*设置按钮可用属性*/
	CButton * pBtnConn =(CButton*)pDlg->GetDlgItem(IDC_BTNCONN);
	CButton * pBtnDisConn = (CButton*)pDlg->GetDlgItem(IDC_BTNDISCONN);
	CButton * pBtnSendData =  (CButton*)pDlg->GetDlgItem(IDC_BTNSENDDATA);
	ASSERT(pBtnConn != NULL );
	ASSERT(pBtnDisConn != NULL );
	ASSERT(pBtnSendData != NULL );
	pBtnConn->EnableWindow(TRUE);
	pBtnDisConn->EnableWindow(FALSE);
	pBtnSendData->EnableWindow(FALSE);
}

//数据接收事件
void CALLBACK CMyModemDlg::OnRead(CWnd* pWnd,const char * buf,int len )
{
	CTCPClientDlg * pDlg = (CTCPClientDlg*)pWnd;
	CEdit * pEdtRecv = (CEdit*)pDlg->GetDlgItem(IDC_EDTRECV);
	ASSERT(pEdtRecv != NULL);
	CString strRecv = buf;
	//将接收的数据显示到接收文本框上
	pEdtRecv->SetWindowText(strRecv);
}

//Socket错误事件
void CALLBACK CMyModemDlg::OnError(CWnd* pWnd,int nErrorCode)
{
	AfxMessageBox(_T("客户端socket发生错误"));
}


//建立连接按钮
void CMyModemDlg::OnBtnconn() 
{
	UpdateData(TRUE);
	//设置m_tcpClient属性
	m_tcpClient.m_remoteHost = m_remoteHost;
	m_tcpClient.m_port = m_remotePort;
	m_tcpClient.OnDisConnect = OnDisConnect;
	m_tcpClient.OnRead = OnRead;
	m_tcpClient.OnError = OnError;
	//打开客户端socket
	m_tcpClient.Open(this);
	
	//建立与服务器端连接
	if (m_tcpClient.Connect())
	{
		CStatic *pStatus = (CStatic*)GetDlgItem(IDC_LBLCONNSTATUS);
		ASSERT(pStatus != NULL);
		pStatus->SetWindowText(L"已连接");
		UpdateData(FALSE);
	}
	else
	{
		AfxMessageBox(_T("建立连接失败"));
		CStatic *pStatus = (CStatic*)GetDlgItem(IDC_LBLCONNSTATUS);
		ASSERT(pStatus != NULL);
		pStatus->SetWindowText(L"连接断开");
		return;
	}
	/*设置按钮可用属性*/
	CButton * pBtnConn =(CButton*)GetDlgItem(IDC_BTNCONN);
	CButton * pBtnDisConn = (CButton*)GetDlgItem(IDC_BTNDISCONN);
	CButton * pBtnSendData =  (CButton*)GetDlgItem(IDC_BTNSENDDATA);
	ASSERT(pBtnConn != NULL );
	ASSERT(pBtnDisConn != NULL );
	ASSERT(pBtnSendData != NULL );
	pBtnConn->EnableWindow(FALSE);
	pBtnDisConn->EnableWindow(TRUE);
	pBtnSendData->EnableWindow(TRUE);
	
}

//断开连接按钮单击事件
void CMyModemDlg::OnBtndisconn() 
{
	if (m_tcpClient.Close())
	{
		CStatic *pStatus = (CStatic*)GetDlgItem(IDC_LBLCONNSTATUS);
		ASSERT(pStatus != NULL);
		pStatus->SetWindowText(L"连接断开");
		CButton * pBtnConn =(CButton*)GetDlgItem(IDC_BTNCONN);
		CButton * pBtnDisConn = (CButton*)GetDlgItem(IDC_BTNDISCONN);
		CButton * pBtnSendData = (CButton*)GetDlgItem(IDC_BTNSENDDATA);
		ASSERT(pBtnConn != NULL );
		ASSERT(pBtnDisConn != NULL );
		ASSERT(pBtnSendData != NULL );
		pBtnConn->EnableWindow(TRUE);
		pBtnDisConn->EnableWindow(FALSE);
		pBtnSendData->EnableWindow(FALSE);
	}
	else
	{
		AfxMessageBox(_T("连接断开失败"));
	}	
}

//发送数据按钮单击事件代码
void CMyModemDlg::OnBtnsenddata() 
{
	char * sendBuf;
	int sendLen=0;
	UpdateData(TRUE);
	
	sendLen = m_sendData.GetLength();
	sendBuf = new char[sendLen*2];
	wcstombs(sendBuf,m_sendData,sendLen);
	if (!m_tcpClient.SendData(sendBuf,sendLen))
	{
		AfxMessageBox(_T("发送失败"));
	}
	delete[] sendBuf;
	sendBuf = NULL;		
}

//得到本地的IP地址
CString CMyModemDlg::GetLocalIP()
{
	
	HOSTENT *LocalAddress;
	char	*Buff;
	TCHAR	*wBuff;
	CString strReturn = _T("");
	
	
	//创建新的缓冲区
	Buff = new char[256];
	wBuff = new TCHAR[256];
	//置空缓冲区
	memset(Buff, '\0', 256);
	memset(wBuff, TEXT('\0'), 256*sizeof(TCHAR));
	//得到本地计算机名
	if (gethostname(Buff, 256) == 0)
	{
		//转换成双字节字符串
		mbstowcs(wBuff, Buff, 256);
		//得到本地地址
		LocalAddress = gethostbyname(Buff);
		//置空buff
		memset(Buff, '\0', 256);
		//组合本地IP地址
		sprintf(Buff, "%d.%d.%d.%d\0", LocalAddress->h_addr_list[0][0] & 0xFF,
			LocalAddress->h_addr_list[0][1] & 0x00FF, LocalAddress->h_addr_list[0][2] & 0x0000FF, LocalAddress->h_addr_list[0][3] & 0x000000FF);
		//置空wBuff
		memset(wBuff, TEXT('\0'), 256*sizeof(TCHAR));
		//转换成双字节字符串
		mbstowcs(wBuff, Buff, 256);
        //设置返回值
		strReturn = wBuff;
	}
	else
	{
	}
	
	//释放Buff缓冲区
	delete[] Buff;
	//释放wBuff缓冲区
	delete[] wBuff;
	return strReturn;
}





/////////////////////////////////////////////////////////////////////





void CMyModemDlg::OnSetfocusEdit1() 
{
m_sCommand=_T("");
UpdateData(0);
}

void CMyModemDlg::OnSetfocusEdit2() 
{
m_sText=_T("");
UpdateData(0);	
}

void CMyModemDlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	
	CDialog::OnChar(nChar, nRepCnt, nFlags);
}

void CMyModemDlg::OnTimer(UINT nIDEvent) 
{
BYTE strCommRecvMsg[51];
memset(strCommRecvMsg,0,51);
BYTE bCommRecvMsg[51];
memset(bCommRecvMsg,0,51);

DWORD dw;
BOOL b=ReadFile(hCommDev,strCommRecvMsg,50,&dw,NULL);	
if(!b)return;
if(dw<1)return;
CString str,s;
UpdateData(1);

if(dw==1)
	{
	if(g_nFirst==1)
		{
		c[0]=(char)g_sFirst;
		c[1]=(char)strCommRecvMsg[0];
		wsprintf(cc,_T("%s"),g_dbf.CharToWideChar((unsigned char*)c,2));
		g_nFirst=0;
		g_sFirst=0;
		m_sReceive+=cc;
		UpdateData(0);
		}
	else				//g_nFirst==0
		{
		if(IsChinesecharacter(strCommRecvMsg[0]))
			{
			g_sFirst=strCommRecvMsg[0];
			g_nFirst=1;
			}
		else
			{
			m_sReceive+=(TCHAR)strCommRecvMsg[0];
			UpdateData(0);
			g_nFirst=0;
			g_sFirst=0;
			}
		}
	}
else					//dw>1
	{
	if(g_nFirst==1)
		{
		c[0]=(char)g_sFirst;
		c[1]=(char)strCommRecvMsg[0];
		memcpy(bCommRecvMsg,strCommRecvMsg+1,dw-1);
		ProcessChar(bCommRecvMsg,dw-1,str);
		wsprintf(cc,_T("%s"),g_dbf.CharToWideChar((unsigned char*)c,2));
		m_sReceive+=cc;
		m_sReceive+=str;
		UpdateData(0);
		g_nFirst=0;
		g_sFirst=0;
		}
	else
		{	
		ProcessChar(strCommRecvMsg,dw,str);
		m_sReceive+=str;
		UpdateData(0);
		g_nFirst=0;
		g_sFirst=0;
		}
	}

	CDialog::OnTimer(nIDEvent);
	
}

void CMyModemDlg::OnDestroy() 
{
KillTimer(1);	
CDialog::OnDestroy();
}

void CMyModemDlg ::ProcessChar(BYTE* bb,int len,CString& str)
{
str=_T("");
BYTE temp;
int i=0;
while(i<len)
	{
	temp=bb[i];
	if(!IsChinesecharacter(temp))
		{
		str+=(TCHAR)temp;
		i++;	
		}
	else
		{
		i++;
		if(i<len)
			{
			c[0]=(char)temp;
			c[1]=(char)bb[i];
			wsprintf(cc,_T("%s"),g_dbf.CharToWideChar((unsigned char*)c,2));
			str+=cc;
			i++;
			}
		}
	}
}

BOOL CMyModemDlg ::IsChinesecharacter(BYTE ch)
{
if((BYTE)ch>=0x80)
	return TRUE;
else
    return FALSE;
}

⌨️ 快捷键说明

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