⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainfrm.cpp

📁 一个很好的串口监视程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
// 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 + -