📄 mainfrm.cpp
字号:
// MainFrm.cpp : implementation of the CMainFrame class
//
#include "stdafx.h"
#include "SCC.h"
#include "MainFrm.h"
#include "Transmit.h"
#include "DlgAutoSave.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
#define _countof(array) (sizeof(array)/sizeof(array[0]))
static UINT Toolbars[] = {IDR_MAINFRAME,IDR_SCC_TOOL,IDR_TOOLBAR_SHELL};
#define WM_ALWAYSONTOP WM_USER + 5
/////////////////////////////////////////////////////////////////////////////
// CMainFrame
IMPLEMENT_DYNCREATE(CMainFrame, CGuiFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame, CGuiFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_WM_TIMER()
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_COMMAND(ID_FILE_XSAVE, OnFileXsave)
ON_UPDATE_COMMAND_UI(ID_FILE_XSAVE, OnUpdateFileXsave)
ON_WM_MENUSELECT()
ON_WM_ACTIVATE()
//}}AFX_MSG_MAP
ON_CBN_SELENDOK(ID_SCC_SET_COM, OnSCCComboComSelok)
ON_COMMAND_EX(IDR_SCC_TOOL, OnBarCheck)
ON_UPDATE_COMMAND_UI(IDR_SCC_TOOL, OnUpdateControlBarMenu)
ON_COMMAND_EX(ID_VIEW_SFWND, OnBarCheck)
ON_UPDATE_COMMAND_UI(ID_VIEW_SFWND, OnUpdateControlBarMenu)
ON_COMMAND_EX(ID_VIEW_TOOLBAR, OnBarCheck)
ON_UPDATE_COMMAND_UI(ID_VIEW_TOOLBAR, OnUpdateControlBarMenu)
ON_COMMAND_RANGE(ID_SCC_SET_OPTION,ID_SCC_ADDECHO,OnSCCCommon)
ON_UPDATE_COMMAND_UI_RANGE(ID_SCC_SET_OPTION,ID_SCC_ADDECHO,OnUpdateSCCCommon)
ON_COMMAND_RANGE(ID_CS_ADDSUM,ID_CS_7,OnSCCCS)
ON_UPDATE_COMMAND_UI_RANGE(ID_CS_ADDSUM,ID_CS_7,OnUpdateSCCCS)
ON_COMMAND_RANGE(ID_FILE_MRU_FILE1,ID_FILE_MRU_FILE16,OnSCCMRU)
ON_COMMAND_RANGE(ID_VIEW_CENTER,ID_FILE_SAVESEND,OnSCCView)
ON_UPDATE_COMMAND_UI_RANGE(ID_VIEW_CENTER,ID_FILE_SAVESEND,OnUpdateSCCView)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTA, 0, 0xFFFF, OnToolTipText)
ON_NOTIFY_EX_RANGE(TTN_NEEDTEXTW, 0, 0xFFFF, OnToolTipText)
SCC_MSG_MAP
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
/////////////////////////////////////////////////////////////////////////////
// CMainFrame construction/destruction
SCC_MSG_MAP_X(CMainFrame,RecvSCCMsg)
CMainFrame::CMainFrame()
{
// TODO: add member initialization code here
m_nCurCOM=0;
m_bSPort=1,m_bSSend=0,m_bSTime=0;
m_bAscRecv=0,m_bAscSend=0;
m_bAddEnter=0,m_bAddStx=0,m_bAddEtx=0;
m_bAddEcho=0;
m_bPauseDis=0;
m_nToolBtns=0;
m_bToNext=0;
m_unCycTimer=0;
m_dwMs=::GetTickCount();
m_unMulti=0;
m_bTrigger=0;
m_btTrigger=0;
m_btTriggerCOM=0;
Trasmt.bCOM=0;
m_bFilter=0;
AutoSave.bSave=0;
AutoSave.bClear=0;
AutoSave.nTime=1;
AutoSave.strPath="";
m_bAutoMenuEnable = FALSE;
}
CMainFrame::~CMainFrame()
{
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CGuiFrameWnd::OnCreate(lpCreateStruct) == -1)
return -1;
InitMenu(IDR_MAINFRAME);
InitToolBar(ID_VIEW_TOOLBAR,IDR_MAINFRAME);
InitStatusBar(indicators,sizeof(indicators)/sizeof(UINT));
//============================
if (!m_wndSCCTool.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP
| CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC,CRect(0,0,0,0),IDR_SCC_TOOL) ||
!m_wndSCCTool.LoadToolBar(IDR_SCC_TOOL))
{
TRACE0("Failed to create toolbar\n");
return -1; // fail to create
}
CreateSCCTool();
UINT uHis=AfxGetApp()->GetProfileInt("Settings","COMHis",0);
m_comboCOM.SetCurSel(uHis);
CSerialPort *psp=new CSerialPort;
psp->m_nCOMNo=uHis;
if(CSCCTools::RWReg(psp)) SetCOMParam(psp,1);
delete psp;
psp=NULL;
CreateImagelist();
//============================
// TODO: Delete these three lines if you don't want the toolbar to
// be dockable
// CMenu*pSysMenu=GetSystemMenu(FALSE);
// pSysMenu->InsertMenu(5,MF_BYPOSITION,MF_SEPARATOR);
// pSysMenu->InsertMenu(6,MF_BYPOSITION, ID_ALWAYSONTOP,"总在最上面(&A)");
// pSysMenu->AppendMenu(MF_SEPARATOR);
// pSysMenu->AppendMenu(MF_STRING, WM_ALWAYSONTOP,"总在最上面(&A)");
//======================================
if(!m_wndSF.CreateX(_T("发报窗"),this,ID_VIEW_SFWND)) return -1;
EnableDocking(CBRS_ALIGN_ANY);
m_wndMenuBar.EnableDocking(CBRS_ALIGN_ANY);
m_wndSCCTool.EnableDocking(CBRS_ALIGN_ANY);
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
m_wndSF.EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndMenuBar);
DockControlBar(&m_wndSCCTool);
DockControlBar(&m_wndToolBar);
DockControlBar(&m_wndSF,AFX_IDW_DOCKBAR_LEFT);
sProfile = _T("MFW");
LoadBars();
m_dlgSend.Create(IDD_DIALOG_SEND,this);
m_dlgFilter.Create(IDD_DIALOG_FILTER,this);
//========================
DWORD dwConfig=AfxGetApp()->GetProfileInt("Settings","Common",1);
m_bSPort=dwConfig&0x01;m_bSSend=(dwConfig&0x02)>>1;m_bSTime=(dwConfig&0x04)>>2;
m_bAscRecv=(dwConfig&0x08)>>3;m_bAscSend=(dwConfig&0x10)>>4;
m_bAddEnter=(dwConfig&0x20)>>5;m_bAddStx=(dwConfig&0x40)>>6;
m_bAddEtx=(dwConfig&0x80)>>7;
if(dwConfig&0x100) SetWindowPos(&wndTopMost,0, 0, 0, 0,SWP_NOSIZE|SWP_NOMOVE);
AutoSave.strPath=AfxGetApp()->GetProfileString("Settings","AutoSave");
if(AutoSave.strPath.IsEmpty())
{
AutoSave.strPath=AfxGetApp()->m_pszAppName;
int position=AutoSave.strPath.ReverseFind('\\');
if(position!=-1) AutoSave.strPath=AutoSave.strPath.Left(position+1);
else AutoSave.strPath="c:\\";
}
dwConfig=AfxGetApp()->GetProfileInt("Settings","ASTime",0x00010001);
AutoSave.nTime=dwConfig;
// AutoSave.nTime=HIWORD(dwConfig);
// AutoSave.bClear=(BOOL)(LOWORD(dwConfig));
//======================
m_wndCool.LoadToolbars(Toolbars, _countof(Toolbars));
EnableToolTips();
return 0;
}
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CGuiFrameWnd::PreCreateWindow(cs) )
return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.style &=~FWS_ADDTOTITLE ;
cs.lpszName=_T("SCC-串口监视工具");
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
// CMainFrame diagnostics
#ifdef _DEBUG
void CMainFrame::AssertValid() const
{
CGuiFrameWnd::AssertValid();
}
void CMainFrame::Dump(CDumpContext& dc) const
{
CGuiFrameWnd::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
void CMainFrame::CreateSCCTool()
{
CString str;
m_wndSCCTool.CreateCombo(&m_comboCOM,ID_SCC_SET_COM,60,WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST |WS_VSCROLL | WS_TABSTOP);
for(int i=0;i<256;i++)
{
str.Format("COM%d",i+1);
m_comboCOM.AddString(str);
}
m_comboCOM.SetCurSel(0);
m_wndSCCTool.CreateCombo(&m_comboBaud,ID_SCC_SET_BAUD,60,WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST |WS_VSCROLL | WS_TABSTOP);
for(i=0;i<23;i++)
m_comboBaud.AddString(CSCCTools::GetParStr(i,0,1));
m_comboBaud.SetCurSel(4);
m_wndSCCTool.CreateCombo(&m_comboParity,ID_SCC_SET_PARITY,60,WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST |WS_VSCROLL | WS_TABSTOP);
m_comboParity.AddString("无校验");
m_comboParity.AddString("奇校验");
m_comboParity.AddString("偶校验");
m_comboParity.AddString("Mark");
m_comboParity.AddString("Space");
m_comboParity.SetCurSel(0);
m_wndSCCTool.CreateCombo(&m_comboData,ID_SCC_SET_DATA,30,WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST |WS_VSCROLL | WS_TABSTOP);
m_comboData.AddString("8");
m_comboData.AddString("7");
m_comboData.AddString("6");
m_comboData.AddString("5");
m_comboData.AddString("4");
m_comboData.SetCurSel(0);
m_wndSCCTool.CreateCombo(&m_comboStop,ID_SCC_SET_STOP,30,WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST |WS_VSCROLL | WS_TABSTOP);
m_comboStop.AddString("1");
m_comboStop.AddString("1.5");
m_comboStop.AddString("2");
m_comboStop.SetCurSel(0);
m_wndSCCTool.CreateCombo(&m_comboRTO,ID_SCC_SET_RTO,40,WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST |WS_VSCROLL | WS_TABSTOP);
for(i=0;i<15;i++)
{
str.Format("%d",(i+1)*20);
m_comboRTO.AddString(str);
}
m_comboRTO.SetCurSel(0);
m_wndSCCTool.CreateCombo(&m_comboFC,ID_SCC_SET_FLOW,40,WS_CHILD|WS_VISIBLE|CBS_DROPDOWNLIST |WS_VSCROLL | WS_TABSTOP);
m_comboFC.AddString("无");
m_comboFC.AddString("RTS/CTS");
m_comboFC.AddString("XON/XOFF");
m_comboFC.AddString("DTR/CTS");
m_comboFC.AddString("RTS/DSR");
m_comboFC.AddString("DTR/DSR");
m_comboFC.SetCurSel(0);
m_comboFC.EnableWindow(0);
str.Empty();
}
void CMainFrame::OnSCCComboComSelok()
{
m_nCurCOM=m_comboCOM.GetCurSel();
int nCurSelIndex=m_ascc.GetCOMIndex(m_nCurCOM) ;
if(nCurSelIndex!=-1)
{
SetCOMParam(m_ascc.GetCOM(nCurSelIndex),1);
EnableSCCBtn(!m_ascc.IsCOMOpen(m_nCurCOM));
// m_wndSendFrame.EnableButton(0,(m_scc.IsCOMOpen(m_nCurCOM)==1));
}
else
{
EnableSCCBtn();
// m_wndSendFrame.EnableButton(0,0);
CSerialPort *psp=new CSerialPort;
psp->m_nCOMNo=m_nCurCOM;
if(CSCCTools::RWReg(psp)) SetCOMParam(psp,1);
else SetCOMParam(NULL,2);
delete psp;
psp=NULL;
}
ReplaceBtnIcon(ID_SCC_OPEN,IsCOMOpen()?m_nToolBtns+1:2);
}
void CMainFrame::EnableSCCBtn(BOOL bEnable)
{
m_comboBaud.EnableWindow(bEnable);
m_comboParity.EnableWindow(bEnable);
m_comboData.EnableWindow(bEnable);
m_comboStop.EnableWindow(bEnable);
m_comboRTO.EnableWindow(bEnable);
}
void CMainFrame::SetCOMParam(CSerialPort *psp, int nSet)
{
if(nSet==0) //以当前组合框值设置当前所选串口
{
psp->m_nBaudRate=CSCCTools::GetParams(m_comboBaud.GetCurSel(),0);
psp->m_nParityBit=CSCCTools::GetParams(m_comboParity.GetCurSel(),1);
psp->m_nDataBit=CSCCTools::GetParams(m_comboData.GetCurSel(),2);
psp->m_nStopBit=CSCCTools::GetParams(m_comboStop.GetCurSel(),3);
psp->m_nRTO=(m_comboRTO.GetCurSel()+1)*20;
}
else if(nSet==1)//设置当前所选串口
{
m_comboBaud.SetCurSel(CSCCTools::GetParIndex(psp->m_nBaudRate,0));
m_comboParity.SetCurSel(CSCCTools::GetParIndex(psp->m_nParityBit,1));
m_comboData.SetCurSel(CSCCTools::GetParIndex(psp->m_nDataBit,2));
m_comboStop.SetCurSel(CSCCTools::GetParIndex(psp->m_nStopBit,3));
m_comboRTO.SetCurSel((psp->m_nRTO>=20)?(psp->m_nRTO/20-1):0);
}
else if(nSet==2)//设置组合框
{
m_comboBaud.SetCurSel(CSCCTools::GetParIndex(9600,0));
m_comboParity.SetCurSel(CSCCTools::GetParIndex(NOPARITY,1));
m_comboData.SetCurSel(CSCCTools::GetParIndex(8,2));
m_comboStop.SetCurSel(CSCCTools::GetParIndex(ONESTOPBIT,3));
m_comboRTO.SetCurSel(0);
}
else//设置当前所选串口
{
psp->m_nBaudRate=9600;
psp->m_nParityBit=NOPARITY;
psp->m_nDataBit=8;
psp->m_nStopBit=ONESTOPBIT;
psp->m_nRTO=20;
}
}
BOOL CMainFrame::DestroyWindow()
{
// TODO: Add your specialized code here and/or call the base class
m_ascc.SaveConfig();
AfxGetApp()->WriteProfileInt("Settings","COMHis",m_nCurCOM);
DWORD dwConfig=m_bSPort|(m_bSSend<<1)|(m_bSTime<<2)|
(m_bAscRecv<<3)|(m_bAscSend<<4)|
(m_bAddEnter<<5)|(m_bAddStx<<6)|(m_bAddEtx<<7);
DWORD dwTmp=AfxGetApp()->GetProfileInt("Settings","Common",1);
dwConfig|=dwTmp&0x100;
AfxGetApp()->WriteProfileInt("Settings","Common",dwConfig);
AfxGetApp()->WriteProfileString("Settings","AutoSave",AutoSave.strPath);
// AfxGetApp()->WriteProfileInt("Settings","ASTime",MAKELPARAM(AutoSave.bClear,AutoSave.nTime));
AfxGetApp()->WriteProfileInt("Settings","ASTime",AutoSave.nTime);
m_wndSF.SaveConfig();
if(m_dlgSend.m_hWnd) m_dlgSend.DestroyWindow();
if(m_dlgFilter.m_hWnd) m_dlgFilter.DestroyWindow();
if(m_unCycTimer!=0) KillTimer(m_unCycTimer);
return CGuiFrameWnd::DestroyWindow();
}
void CMainFrame::OnSCCCommon(UINT nID)
{
if(nID==ID_VIEW_WRAP) GetView()->SetWrap(!GetView()->GetWrapMode());
else if(nID==ID_VIEW_SCC_PORT) m_bSPort=!m_bSPort;
else if(nID==ID_VIEW_SCC_SEND) m_bSSend=!m_bSSend;
else if(nID==ID_VIEW_SCC_TIME) m_bSTime=!m_bSTime;
else if(nID==ID_SCC_ASCRECV) m_bAscRecv=!m_bAscRecv;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -