// comElvesDlg.cpp : implementation file // #include "stdafx.h" #include "comElves.h" #include "comElvesDlg.h" #include "mycomsetdlg.h" #include "math.h" #include "io.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About ///////////////////////////////////////////////////////////////////////////// // CComElvesDlg dialog CComElvesDlg::CComElvesDlg(CWnd* pParent /*=NULL*/) : CDialog(CComElvesDlg::IDD, pParent) { //{{AFX_DATA_INIT(CComElvesDlg) m_sData = _T(""); m_DRData = _T(""); m_bSHex = -1; m_bRHex = -1; m_bAuto = FALSE; m_bShow = FALSE; m_Status = _T(""); //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_uTime = 1000; m_bAuto = false; m_bShow = true; m_bSHex = 1; m_bRHex = 1; m_RCount = 0; m_SCount = 0; m_bOpened = false; m_sMod = true; m_rMod = true; m_sMod1 = ""; m_sMod2 = ""; m_rMod1 = ""; m_rMod2 = ""; m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); } void CComElvesDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CComElvesDlg) DDX_Control(pDX, IDC_COMRMOD, m_cTypeRecv); DDX_Control(pDX, IDC_COMSMOD, m_cTypeSend); DDX_Control(pDX, IDC_RXCOUNT, m_ctrlRCount); DDX_Control(pDX, IDC_TXCOUNT, m_ctrlSCount); DDX_Control(pDX, IDC_EDIT2, m_CRData); DDX_Text(pDX, IDC_EDIT1, m_sData); DDX_Text(pDX, IDC_EDIT2, m_DRData); DDX_Radio(pDX, IDC_RADIO1, m_bSHex); DDX_Radio(pDX, IDC_RADIO3, m_bRHex); DDX_Check(pDX, IDC_CHECKAUTO, m_bAuto); DDX_Check(pDX, IDC_CHECKSHOW, m_bShow); DDX_Text(pDX, IDC_STATUS, m_Status); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CComElvesDlg, CDialog) //{{AFX_MSG_MAP(CComElvesDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_SEND, OnSend) ON_COMMAND(IDM_COM_EXIT, OnComExit) ON_COMMAND(IDM_COM_SET, OnComSet) ON_BN_CLICKED(IDC_SCLEARN, OnSclearn) ON_BN_CLICKED(IDC_RCLEARN, OnRclearn) ON_BN_CLICKED(IDC_CHECKSHOW, OnCheckshow) ON_BN_CLICKED(IDC_CHECKAUTO, OnCheckauto) ON_WM_TIMER() ON_BN_CLICKED(IDC_COUNTCLEARN, OnCountclearn) ON_COMMAND(ID_CLEAR, OnClear) ON_COMMAND(IDM_COM_OPEN, OnComOpen) ON_WM_CREATE() ON_CBN_SELCHANGE(IDC_COMRMOD, OnSelchangeComrmod) ON_CBN_SELCHANGE(IDC_COMSMOD, OnSelchangeComsmod) ON_COMMAND(ID_FILE, OnFile) ON_COMMAND(IDM_OPT_AUTO, OnOptAuto) ON_COMMAND(IDM_OPT_DISPLAY, OnOptDisplay) ON_COMMAND(IDM_OPT_CLEAR_SEND, OnOptClearSend) ON_COMMAND(IDM_OPT_CLEAR_RECV, OnOptClearRecv) //}}AFX_MSG_MAP ON_MESSAGE(WM_COMM_RXCHAR, OnReceive) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CComElvesDlg message handlers BOOL CComElvesDlg::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 m_cTypeRecv.InsertString(0,"情景模式1"); m_cTypeRecv.InsertString(1,"情景模式2"); m_cTypeRecv.SetCurSel(0); m_cTypeSend.InsertString(0,"情景模式1"); m_cTypeSend.InsertString(1,"情景模式2"); m_cTypeSend.SetCurSel(0); m_ToolBar.Create(this,WS_CHILD | WS_VISIBLE | CBRS_TOP| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY| CBRS_SIZE_FIXED); m_ToolBar.LoadToolBar(IDR_TOOLBAR);//加载工具栏 CRect rect; CRect rectNow; GetClientRect(rect); RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0,reposQuery,rectNow); //放置控件条位置 CPoint ptOffset(rectNow.left-rect.left,rectNow.top-rect.top); CRect rcChild; CWnd* pwndChild=GetWindow(GW_CHILD); while (pwndChild) { pwndChild->GetWindowRect(rcChild); ScreenToClient(rcChild); rcChild.OffsetRect(ptOffset); pwndChild->MoveWindow(rcChild,FALSE); pwndChild=pwndChild->GetNextWindow(); } //调整对话框尺寸 CRect rcWindow; GetWindowRect(rcWindow); rcWindow.right+=rect.Width()-rectNow.Width(); rcWindow.bottom+=rect.Height()-rectNow.Height(); MoveWindow(rcWindow, FALSE); //控件条定位 RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); //对框居中 CenterWindow(); // TODO: Add extra initialization here m_nBaud = 115200; m_nCom = 1; m_cParity = 'N'; m_nDatabits = 8; m_nStopbits = 1; m_dwCommEvents = EV_RXFLAG | EV_RXCHAR; OpenPort(); OnCountclearn(); return TRUE; // return TRUE unless you set the focus to a control } void CComElvesDlg::OnSysCommand(UINT nID, LPARAM lParam) { 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 CComElvesDlg::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 CComElvesDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } void CComElvesDlg::OnSend() { // TODO: Add your control notification handler code here if(m_bAuto) { m_bAuto = false; GetDlgItem(IDC_SEND)->SetWindowText("发送"); KillTimer(1); UpdateData(false); return; } if(m_Port.m_hComm==NULL) { AfxMessageBox("串口没有打开,请打开串口"); return; } else { UpdateData(TRUE); SaveSMod(); if(m_bSHex) { char data[512]; int len=StrToHex(m_sData,data); m_Port.WriteToPort(data,len); m_SCount+=(long)((m_sData.GetLength()+1)/3); } else { //UpdateData(false); m_Port.WriteToPort((LPCTSTR)m_sData); //发送数据 m_SCount+=m_sData.GetLength(); } CString strTemp; strTemp.Format("TX:%d",m_SCount); m_ctrlSCount.SetWindowText(strTemp); } } LRESULT CComElvesDlg::OnReceive(WPARAM ch, LPARAM port) { if (port <= 0 || port > 4) return -1; m_RCount++; //接收的字节计数 CString strTemp; strTemp.Format("%ld",m_RCount); strTemp="RX:"+strTemp; m_ctrlRCount.SetWindowText(strTemp); //显示接收计数 if(!m_bShow) //如果选择了“停止显示”接收数据,则返回 return -1; //注意,这种情况下,计数仍在继续,只是不显示 if(m_CRData.GetLineCount()>400) { m_rData.Empty(); m_rData="***The Length of the Text is too long, Emptied Automaticly!!!***\r\n"; UpdateData(FALSE); } //如果选择了"十六进制显示",则显示十六进制值 CString str; if(m_bRHex) str.Format("%02X ",ch); else str.Format("%c",ch); //以下是将接收的字符加在字符串的最后,这里费时很多 //但考虑到数据需要保存成文件,所以没有用List Control int nLen=m_CRData.GetWindowTextLength(); m_CRData.SetSel(nLen, nLen); m_CRData.ReplaceSel(str); nLen+=str.GetLength(); UpdateData(true); SaveRMod(); return 0; } void CComElvesDlg::OnComExit() { // TODO: Add your command handler code here OnOK(); } void CComElvesDlg::OnComSet() { // TODO: Add your command handler code here if(m_bAuto) { m_bAuto = false; KillTimer(1); } m_Port.ClosePort(); UpdateData(true); CMyComSetDlg dlg; dlg.m_autoTime = m_uTime; dlg.m_bAuto = m_bAuto; dlg.m_BRHex = m_bRHex; dlg.m_BSHex = m_bSHex; dlg.m_nBaud = m_nBaud; dlg.m_cParity = m_cParity; dlg.m_nCom = m_nCom; dlg.m_nStopbits = m_nStopbits; dlg.m_nDatabits = m_nDatabits; if(dlg.DoModal() == IDOK) { m_nCom = dlg.m_nCom; m_nBaud = dlg.m_nBaud; m_cParity = dlg.m_cParity; m_nDatabits = dlg.m_nDatabits; m_nStopbits = dlg.m_nStopbits; m_uTime = dlg.m_autoTime; m_bAuto = dlg.m_bAuto; m_bRHex = dlg.m_BRHex; m_bSHex = dlg.m_BSHex; } OpenPort(); UpdateData(false); } void CComElvesDlg::OnSclearn() { // TODO: Add your control notification handler code here UpdateData(true); m_sData = ""; SaveSMod(); if(m_bAuto) { m_bAuto = false; GetDlgItem(IDC_SEND)->SetWindowText("发送"); KillTimer(1); } UpdateData(false); } void CComElvesDlg::OnRclearn() { m_DRData = ""; SaveRMod(); UpdateData(false); } void CComElvesDlg::OnCheckshow() { m_bShow = !m_bShow; } void CComElvesDlg::OnCheckauto() { // TODO: Add your control notification handler code here if(!m_bOpened) { MessageBox("请先打开串口!"); UpdateData(false); return; } m_bAuto = !m_bAuto; if(m_bAuto) { GetDlgItem(IDC_SEND)->SetWindowText("停止"); SetTimer(1,m_uTime,NULL); } else { GetDlgItem(IDC_SEND)->SetWindowText("发送"); KillTimer(1); } } int CComElvesDlg::StrToHex(CString str, char *data) { int t,t1; int rlen=0,len=str.GetLength(); if(len/2 != 0) { str += '0'; len += 1; } for(int i=0;i=len) break; l=str[i]; t=HexChar(h); t1=HexChar(l); if((t==16)||(t1==16)) break; else t=t*16+t1; i++; data[rlen]=(char)t; rlen++; } return rlen; } char CComElvesDlg::HexChar(char c) { if((c>='0')&&(c<='9')) return c-0x30; else if((c>='A')&&(c<='F')) return c-'A'+10; else if((c>='a')&&(c<='f')) return c-'a'+10; else return 0x10; } void CComElvesDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default UpdateData(true); SaveSMod(); switch(nIDEvent) { case 1: if(m_bSHex) { char data[512]; int len=StrToHex(m_sData,data); m_Port.WriteToPort(data,len); m_SCount+=(long)((m_sData.GetLength()+1)/2); //m_Port.WriteToPort(data); } else { // UpdateData(false); m_Port.WriteToPort((LPCTSTR)m_sData); //发送数据 m_SCount+=m_sData.GetLength(); } CString strTemp; strTemp.Format("TX:%d",m_SCount); m_ctrlSCount.SetWindowText(strTemp); break; } CDialog::OnTimer(nIDEvent); } void CComElvesDlg::OpenPort() { if (m_Port.OpenSerialPort(this, m_nCom, m_nBaud,m_cParity,m_nDatabits,m_nStopbits,m_dwCommEvents,512)) { m_Port.StartMonitoring(); m_bOpened = true; } else { m_bOpened = false; AfxMessageBox("没有发现此串口"); } SetOpenButton(); UpdateData(false); } void CComElvesDlg::OnCountclearn() { // TODO: Add your control notification handler code here m_RCount = 0; //接收的字节计数 CString strTemp; strTemp.Format("%ld",m_RCount); strTemp="RX:"+strTemp; m_ctrlRCount.SetWindowText(strTemp); //显示接收计数 m_SCount = 0; strTemp.Format("TX:%d",m_SCount); m_ctrlSCount.SetWindowText(strTemp); } void CComElvesDlg::OnClear() { // TODO: Add your command handler code here OnCountclearn(); } void CComElvesDlg::SetOpenButton() { CImageList imageList; CBitmap bitmap; if(!m_bOpened) { m_Status.Format("STATUS:COM%d CLOSED,%d,%c,%d,%d",m_nCom, m_nBaud,m_cParity,m_nDatabits,m_nStopbits); // Create and set the normal toolbar image list. bitmap.LoadBitmap(IDB_TOOL_CLOSE); imageList.Create(32, 32, ILC_COLORDDB|ILC_MASK, 13, 1); imageList.Add(&bitmap, RGB(192,192,192)); // RGB(192,192,192)是Win98的按扭颜色 m_ToolBar.SendMessage(TB_SETIMAGELIST, 0, (LPARAM)imageList.m_hImageList); } else { m_Status.Format("STATUS:COM%d OPENED,%d,%c,%d,%d",m_nCom, m_nBaud,m_cParity,m_nDatabits,m_nStopbits); // Create and set the normal toolbar image list. bitmap.LoadBitmap(IDB_TOOL_OPEN); imageList.Create(32, 32, ILC_COLORDDB|ILC_MASK, 13, 1); imageList.Add(&bitmap, RGB(192,192,192)); // RGB(192,192,192)是Win98的按扭颜色 m_ToolBar.SendMessage(TB_SETIMAGELIST, 0, (LPARAM)imageList.m_hImageList); } imageList.Detach(); bitmap.Detach(); m_ToolBar.Invalidate(); UpdateData(false); } void CComElvesDlg::OnComOpen() { // TODO: Add your command handler code here if(!m_bOpened) { OpenPort(); } else { m_Port.ClosePort(); m_bOpened = false; m_bAuto = false; GetDlgItem(IDC_SEND)->SetWindowText("发送"); KillTimer(1); UpdateData(false); SetOpenButton(); } } int CComElvesDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CDialog::OnCreate(lpCreateStruct) == -1) return -1; EnableToolTips(TRUE); // TODO: Add your specialized creation code here return 0; } BOOL CComElvesDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) { // TODO: Add your specialized code here and/or call the base class TOOLTIPTEXT *tip; tip=(TOOLTIPTEXT*)lParam; CString Tip; switch(tip-> hdr.code) { case TTN_NEEDTEXT: //该信息表明要求显示工具栏上的提示 switch(tip-> hdr.idFrom) { case IDM_COM_SET: Tip.LoadString(IDS_SET); //设置对应于工具栏上ID_PLAY的按钮的提示信息 break; case IDM_COM_OPEN: //IDS_FIRST,IDS_NEXT等为一系列CString串 if(m_bOpened) Tip.LoadString(IDS_CLOSE); else Tip.LoadString(IDS_OPEN); break; case IDM_COM_EXIT: Tip.LoadString(IDS_EXIT); break; case ID_FILE: Tip.LoadString(IDS_FILE); break; case ID_CLEAR: Tip.LoadString(IDS_CLEAR); break; } strcpy(tip-> szText,(LPCSTR)Tip); break; } return CDialog::OnNotify(wParam, lParam, pResult); } void CComElvesDlg::OnSelchangeComrmod() { // TODO: Add your control notification handler code here UpdateData(true); SaveRMod(); m_rMod = !m_rMod; if(m_rMod) { m_DRData = m_rMod1; } else { m_DRData = m_rMod2; } UpdateData(false); } void CComElvesDlg::SaveRMod() { if(m_rMod) { m_rMod1 = m_DRData; } else { m_rMod2 = m_DRData; } } void CComElvesDlg::OnSelchangeComsmod() { // TODO: Add your control notification handler code here UpdateData(true); SaveSMod(); m_sMod = !m_sMod; if(m_sMod) { m_sData = m_sMod1; } else { m_sData = m_sMod2; } UpdateData(false); } void CComElvesDlg::SaveSMod() { if(m_sMod) { m_sMod1 = m_sData; } else { m_sMod2 = m_sData; } } void CComElvesDlg::OnFile() { // TODO: Add your command handler code here CFileDialog dlg(FALSE, "txt", ".txt",OFN_HIDEREADONLY| OFN_OVERWRITEPROMPT,"Aes Files(*.txt)|*.txt"); if ( dlg.DoModal()!=IDOK ) return; //获取文件的绝对路径 CString strPath=dlg.GetPathName(); UpdateData(TRUE); int nLength; nLength = strPath.GetLength(); CFile m_rFile; LPCSTR lpszPath =strPath; SetCurrentDirectory( lpszPath ); if(!m_rFile.Open(lpszPath,CFile::modeCreate | CFile::modeWrite )) { AfxMessageBox( "创建记录文件失败!"); return; } CTime t = CTime::GetCurrentTime(); CString str=t.Format("%Y年%m月%d日%H时%M分%S秒\r\n"); m_rFile.Write((LPCTSTR)str,str.GetLength()); m_rFile.Write((LPCTSTR)m_DRData,m_DRData.GetLength()); m_rFile.Flush(); m_rFile.Close(); } void CComElvesDlg::OnOptAuto() { // TODO: Add your command handler code here OnCheckauto(); UpdateData(false); } void CComElvesDlg::OnOptDisplay() { // TODO: Add your command handler code here OnCheckshow(); UpdateData(false); } void CComElvesDlg::OnOptClearSend() { // TODO: Add your command handler code here OnSclearn(); } void CComElvesDlg::OnOptClearRecv() { // TODO: Add your command handler code here OnRclearn(); }