📄 mainfrm.cpp
字号:
else if(nID==ID_SCC_ASCSEND) m_bAscSend=!m_bAscSend;
else if(nID==ID_SCC_ADDENTER) m_bAddEnter=!m_bAddEnter;
else if(nID==ID_SCC_ADDSTX) m_bAddStx=!m_bAddStx;
else if(nID==ID_SCC_ADDETX) m_bAddEtx=!m_bAddEtx;
else if(nID==ID_SCC_ADDECHO) m_bAddEcho=!m_bAddEcho;
else if(nID==ID_SCC_PAUSE) m_bPauseDis=!m_bPauseDis;
else if(nID==ID_SCC_GONEXT) m_bToNext=!m_bToNext;
else if(nID==ID_SCC_READONLY) GetView()->SetReadOnly(!GetView()->GetReadOnly());
else if(nID==ID_SCC_SENDLINE)
{
if(!SendLine(m_nCurCOM)) AfxMessageBox("报文格式不对!组合键Ctrl+Alt+P分析错误!");
}
else if(nID==ID_SCC_SET_OPTION)
{
if(IsCOMOpen()) return;
SetCOMParam(NULL,2);
}
else if(nID==ID_SCC_CLEARDATA)
{
GetView()->ClearDatas();
GetView()->SetMF();
}
else if(nID==ID_SCC_OPEN)
{
int nCOMNo=m_comboCOM.GetCurSel();
if(m_ascc.IsCOMOpen(nCOMNo))
{
if(m_ascc.CloseCOM(nCOMNo)) EnableSCCBtn(1);
}
else
{
int nIndex=m_ascc.GetCOMIndex(nCOMNo);
CSerialPort *psp;
if(nIndex==-1) psp=new CSerialPort;
else psp=m_ascc.GetCOM(nIndex);
SetCOMParam(psp,0);
if(m_ascc.OpenCOM(psp,this,nCOMNo))
{
EnableSCCBtn(0);
m_nCurCOM=nCOMNo;
}
else
{
if(psp!=NULL) delete psp;
psp=NULL;
}
if(nIndex!=-1) psp=NULL;
}
ReplaceBtnIcon(ID_SCC_OPEN,IsCOMOpen(nCOMNo)?m_nToolBtns+1:2);
}
}
void CMainFrame::OnUpdateSCCCommon(CCmdUI* pCmdUI)
{
if(pCmdUI->m_nID ==ID_VIEW_WRAP) pCmdUI->SetCheck(GetView()->GetWrapMode());
else if(pCmdUI->m_nID ==ID_VIEW_SCC_PORT) pCmdUI->SetCheck(m_bSPort);
else if(pCmdUI->m_nID ==ID_VIEW_SCC_SEND) pCmdUI->SetCheck(m_bSSend);
else if(pCmdUI->m_nID ==ID_VIEW_SCC_TIME) pCmdUI->SetCheck(m_bSTime);
else if(pCmdUI->m_nID ==ID_SCC_ASCRECV) pCmdUI->SetCheck(m_bAscRecv);
else if(pCmdUI->m_nID ==ID_SCC_ASCSEND) pCmdUI->SetCheck(m_bAscSend);
else if(pCmdUI->m_nID ==ID_SCC_GONEXT) pCmdUI->SetCheck(m_bToNext);
else if(pCmdUI->m_nID ==ID_SCC_READONLY) pCmdUI->SetCheck(GetView()->GetReadOnly());
else if(pCmdUI->m_nID ==ID_SCC_SENDLINE) pCmdUI->Enable(IsCOMOpen());
else if(pCmdUI->m_nID ==ID_SCC_SET_OPTION) pCmdUI->Enable(!IsCOMOpen());
else if(pCmdUI->m_nID ==ID_SCC_ADDENTER)
{
pCmdUI->Enable(m_bAscSend);
pCmdUI->SetCheck(m_bAddEnter);
}
else if(pCmdUI->m_nID ==ID_SCC_ADDECHO)
{
pCmdUI->Enable(m_bAscSend);
pCmdUI->SetCheck(m_bAddEcho);
}
else if(pCmdUI->m_nID ==ID_SCC_ADDSTX)
{
pCmdUI->Enable(m_bAscSend);
pCmdUI->SetCheck(m_bAddStx);
}
else if(pCmdUI->m_nID ==ID_SCC_ADDETX)
{
pCmdUI->Enable(m_bAscSend);
pCmdUI->SetCheck(m_bAddEtx);
}
else if(pCmdUI->m_nID ==ID_SCC_PAUSE)
{
pCmdUI->SetCheck(m_bPauseDis);
pCmdUI->SetText(m_bPauseDis?"继续报文监视(&P)":"暂停报文监视(&P)");
}
else if(pCmdUI->m_nID ==ID_SCC_OPEN)
{
CString str;
str.Format("COM%d",m_nCurCOM+1);
if(IsCOMOpen()) str="关闭"+str+"(&O)";
else str="打开"+str+"(&O)";
pCmdUI->SetText(str);
str.Empty();
}
}
void CMainFrame::DisplayStr(CString str, int nCOMIndex,BOOL bRecv,BOOL bEnter)
{
if(m_bPauseDis) return;
if(!bRecv&&!m_bSSend) return;
if(m_dlgFilter.m_nFilter==1)
{
if(nCOMIndex!=m_nCurCOM) return;
}
CString strtmp,str1;
CSCCView* pView=GetView();
if(m_bSTime)
{
_strtime( strtmp.GetBuffer(9) );
strtmp.ReleaseBuffer();
// strtmp="["+strtmp+"] ";
str1.Format(" %03.0d",(::GetTickCount()-m_dwMs)%1000);
m_dwMs=::GetTickCount();
strtmp="["+strtmp+str1+"] ";
pView->AddString(strtmp,5);
}
if(m_bSPort)//↑↓
{
pView->AddString("COM",5);
if(bRecv) strtmp.Format("%d",nCOMIndex+1);
else strtmp.Format("%d",nCOMIndex+1);
pView->AddString(strtmp,1);
if(bRecv) pView->AddString("↑",5);
else pView->AddString("↓",5);
}
strtmp.Empty();
str1.Empty();
str+='\n';
pView->AddString(str,bRecv?3:4);
pView=NULL;
}
void CMainFrame::CreateImagelist()
{
CImageList* m_imgList1;
m_imgList1=(m_wndToolBar.GetToolBarCtrl()).GetImageList();
m_nToolBtns=m_imgList1->GetImageCount();
CBitmap cbmp;
BITMAP bmp;
// m_imgList1.Create(IDB_BITMAP1,16,27,RGB (255, 0, 0));
cbmp.LoadBitmap(IDR_TOOLBAR_SHELL);
cbmp.GetBitmap(&bmp);
m_imgList1->Add(&cbmp,RGB (192, 192, 192));
(m_wndToolBar.GetToolBarCtrl()).SetImageList(m_imgList1);
m_imgList1->Detach();
m_imgList1=NULL;
cbmp.DeleteObject();
}
void CMainFrame::ReplaceBtnIcon(UINT unID, int nNew)
{
int nIndex=m_wndToolBar.CommandToIndex(unID);
// m_imgList1=(m_wndToolBar.GetToolBarCtrl()).GetImageList();
// m_imgList1->Replace(0,m_imgList1->ExtractIcon(2));
// m_imgList1->Detach();
// m_wndToolBar.Invalidate();
m_wndToolBar.SetButtonInfo(nIndex,unID,TBBS_BUTTON,nNew);
/*
m_wndToolBar.LoadToolBar(IDR_MAINFRAME);
//调入新的工具栏后,调用Invalidate函数以确保使用新的位图图象重画工具栏;
m_wndToolBar.Invalidate();
CMenu cMenu;
//调用新的以IDR_NEWMENU表示的菜单资源;
cMenu.LoadMenu(IDR_MAINFRAME);
//将cMenu设置为当前菜单;
SetMenu(&cMenu);
//释放菜单句柄 cMenu.Detach();
//重画菜单条;
DrawMenuBar();
//重新绘制窗口区域;
RecalcLayout(TRUE);
*/
}
BOOL CMainFrame::IsCOMOpen(int nCOMIndex)
{
if(nCOMIndex==-1) nCOMIndex=m_nCurCOM;
int nIndex=m_ascc.GetCOMIndex(nCOMIndex);
if(nIndex==-1) return 0;
return m_ascc.GetCOM(nIndex)->IsOpen();
}
CSerialPort* CMainFrame::GetCOM(int nCOMIndex)
{
if(nCOMIndex==-1) nCOMIndex=m_nCurCOM;
int nIndex=m_ascc.GetCOMIndex(nCOMIndex);
if(nIndex==-1) return NULL;
return m_ascc.GetCOM(nIndex);
}
void CMainFrame::RecvSCCMsg(WPARAM wParam, LPARAM lParam)
{
LPBYTE lpbtBuffer = (LPBYTE)::GlobalLock((HGLOBAL)wParam);
WORD lPortNo=LOWORD(lParam);
WORD lLength=HIWORD(lParam);
//======
CString str;
m_bFilter=0;
if(m_bAscRecv)
{
str=((CString)lpbtBuffer).Left (lLength);
m_bFilter=1;
}
else
{
if(IsFilterFrame(lpbtBuffer,lLength))
{
str=CSCCTools::HexToStr(lpbtBuffer,lLength);
m_bFilter=1;
}
}
if(m_bFilter) DisplayStr(str,lPortNo);
Transmits(lPortNo,lpbtBuffer,lLength);
if(m_bTrigger)
{
int nl=IsTriggerLine(str);
if(nl!=-1)
{
if(m_dlgSend.m_unTrigger==0)
SendLine(lPortNo,m_dlgSend.Trigger[nl].unTrigger-1);
else
{
m_btTrigger=nl;
m_btTriggerCOM=(BYTE)lPortNo;
SetTimer(102,m_dlgSend.m_unTrigger,NULL);
}
}
}
str.Empty();
::GlobalUnlock((HGLOBAL)wParam);
}
int CMainFrame::AscSendAdd(CString &str)
{
if(m_bAscSend)
{
if(m_bAddStx) str=(TCHAR)0x02+str;
if(m_bAddEtx) str+=(TCHAR)0x03;
if(m_bAddEnter) str+='\r';//str+=(TCHAR)0x0D;
if(m_bAddEcho) str+='\n';
}
return str.GetLength();
}
BOOL CMainFrame::SendLine(int nCOMIndex, int nLineIndex)
{
if(!IsCOMOpen(nCOMIndex)) return 1;
CString str;
int nlength=m_wndSF.m_xrec.GetLineStr(str,nLineIndex);
if(str.IsEmpty())
{
// AfxMessageBox("空行!");
m_wndSF.m_xrec.SetFocus();
return 0;
}
if(m_bAscSend)
{
AscSendAdd(str);
DisplayStr(str,nCOMIndex,0);
GetCOM(nCOMIndex)->WriteData(str);
if(m_bToNext) m_wndSF.m_xrec.GotoLine(1,nLineIndex);
return 1;
}
if(!m_wndSF.m_xrec.IsHexFormat(str) )
{
// AfxMessageBox("格式不对!组合键Ctrl+Alt+P分析错误!");
m_wndSF.m_xrec.SetFocus();
return 0;
}
BYTE btData[MAX_SCC_SEND_LEN];
int nBytes=m_wndSF.m_xrec.StrToHex(str,btData);
DisplayStr(str,nCOMIndex,0);
GetCOM(nCOMIndex)->WriteData(btData,nBytes);
if(m_bToNext) m_wndSF.m_xrec.GotoLine(1,nLineIndex);
return 1;
}
void CMainFrame::OnSCCCS(UINT nID)
{
if(nID==ID_CS_ADDSUM) m_wndSF.m_xrec.CheckSum(4);
if(nID==ID_CS_ADDSUMWORD) m_wndSF.m_xrec.CheckSum(5);
if(nID==ID_CS_MODBUS) m_wndSF.m_xrec.CheckSum(0);
if(nID==ID_CS_CRC_CCITT16) m_wndSF.m_xrec.CheckSum(1);
if(nID==ID_CS_CRC_CCITT8) m_wndSF.m_xrec.CheckSum(2);
if(nID==ID_CS_CRC_ANSI16) m_wndSF.m_xrec.CheckSum(3);
}
void CMainFrame::OnUpdateSCCCS(CCmdUI* pCmdUI)
{
pCmdUI->Enable(m_wndSF.IsVisible());
}
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
switch(pMsg->message)
{
case WM_KEYDOWN:
if(IsCASDown(4))//ctrl+alt
{
switch (pMsg->wParam)
{
case 'C':
m_comboCOM.SetFocus();
return TRUE;
case 'S':
m_wndSF.m_xrec.SetFocus();
return TRUE;
}
}
break;
}
return CGuiFrameWnd::PreTranslateMessage(pMsg);
}
BOOL CMainFrame::IsCASDown(int nFlag)
{
if(nFlag==0) return (::GetKeyState(VK_CONTROL) < 0);
else if(nFlag==1) return (::GetKeyState(VK_MENU) < 0);
else if(nFlag==2) return (::GetKeyState(VK_SHIFT) < 0);
else if(nFlag==3)
{
return (::GetKeyState(VK_CONTROL) < 0)&&(::GetKeyState(VK_MENU) >= 0)
&&(::GetKeyState(VK_SHIFT) >= 0);
}
else if(nFlag==4)
{
return (::GetKeyState(VK_CONTROL)<0)&&(::GetKeyState(VK_MENU) < 0)
&&(::GetKeyState(VK_SHIFT) >= 0);
}
return 0;
}
void CMainFrame::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
switch(nIDEvent)
{
case 101:
{
int nLine=-1;
if(m_dlgSend.m_nCycMode==0)
{
if(m_dlgSend.m_nCycSel==1) nLine=m_dlgSend.m_unLine-1;
}
else
{
nLine=m_unMulti-1;
m_unMulti++;
if(m_unMulti>m_dlgSend.m_unEnd) m_unMulti=m_dlgSend.m_unStart;
}
if(!SendLine(m_nCurCOM,nLine))
{
KillTimer(m_unCycTimer);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -