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

📄 terminalview.cpp

📁 一个操纵RS232端口的程序
💻 CPP
字号:
// TerminalView.cpp : implementation of the CTerminalView class
//

#include "stdafx.h"
#include "Terminal.h"

#include "TerminalDoc.h"
#include "TerminalView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CTerminalView

IMPLEMENT_DYNCREATE(CTerminalView, CEditView)

BEGIN_MESSAGE_MAP(CTerminalView, CEditView)
	//{{AFX_MSG_MAP(CTerminalView)
	ON_MESSAGE(WM_COMMNOTIFY, OnCommNotify)
	ON_WM_CHAR()
	ON_COMMAND(IDM_VIEW_CATE, OnViewCate)
	ON_UPDATE_COMMAND_UI(IDM_VIEW_CATE, OnUpdateViewCate)
	ON_COMMAND(IDM_VIEW_FULL, OnViewFull)
	ON_UPDATE_COMMAND_UI(IDM_VIEW_FULL, OnUpdateViewFull)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CEditView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CEditView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CEditView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTerminalView construction/destruction

CTerminalView::CTerminalView()
{
	// TODO: add construction code here
	m_iViewMode = 0; // 0:全显示 1:按要求显示
}

CTerminalView::~CTerminalView()
{
}

BOOL CTerminalView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	BOOL bPreCreated = CEditView::PreCreateWindow(cs);
	cs.style &= ~(ES_AUTOHSCROLL|WS_HSCROLL);	// Enable word-wrapping

	return bPreCreated;
}

/////////////////////////////////////////////////////////////////////////////
// CTerminalView drawing

void CTerminalView::OnDraw(CDC* pDC)
{
	CTerminalDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CTerminalView printing

BOOL CTerminalView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default CEditView preparation
	return CEditView::OnPreparePrinting(pInfo);
}

void CTerminalView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
	// Default CEditView begin printing.
	CEditView::OnBeginPrinting(pDC, pInfo);
}

void CTerminalView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)
{
	// Default CEditView end printing
	CEditView::OnEndPrinting(pDC, pInfo);
}

/////////////////////////////////////////////////////////////////////////////
// CTerminalView diagnostics

#ifdef _DEBUG
void CTerminalView::AssertValid() const
{
	CEditView::AssertValid();
}

void CTerminalView::Dump(CDumpContext& dc) const
{
	CEditView::Dump(dc);
}

CTerminalDoc* CTerminalView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTerminalDoc)));
	return (CTerminalDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CTerminalView message handlers


LRESULT CTerminalView::OnCommNotify(WPARAM wParam, LPARAM lParam)
{
	char buf[MAXBLOCK/4];
	CString str = "";
	CString strC1 = "", strC2 = "", strC3 = "", strC4 = "";
	int nLength, nTextLength;
	CTerminalDoc *pDoc=GetDocument();
	CEdit &edit = GetEditCtrl();
	
	if(!pDoc->m_bConnected || (wParam & EV_RXCHAR) != EV_RXCHAR) // 是否是EV_RXCHAR事件?
	{
		SetEvent(pDoc->m_hPostMsgEvent); // 允许发送下一个WM_COMMNOTIFY消息
		return 0L;
	}
	
	nLength = pDoc->ReadComm(buf, 100);
	//////////////////////////////////////////////////////////////////////////
	char cPath[_MAX_PATH];
	CString strPath = "";
	GetModuleFileName(GetModuleHandle("Terminal.exe"),cPath,_MAX_PATH);
 	strPath = cPath;
 	strPath = strPath.Left(strPath.GetLength()-12) + CString(_T("SourceData.txt"));
	CFile WriteFile;
	CFileException	fileException;
	if( !WriteFile.Open( strPath, CFile::modeRead | CFile::modeWrite, &fileException) )
	{
		WriteFile.SeekToEnd();
		WriteFile.Write(buf, nLength);
	}
	WriteFile.Close();
	

	CString strTemp = buf;
	if(nLength && m_iViewMode == 1)
	{
		int iPos = strTemp.Find("C1");
		if(iPos != -1)
			strC1 = strTemp.GetAt(iPos + 1) + strTemp.GetAt(iPos + 1) + strTemp.GetAt(iPos + 1) + strTemp.GetAt(iPos + 1);
		iPos = strTemp.Find("C2");
		if(iPos != -1)
			strC2 = strTemp.GetAt(iPos + 1) + strTemp.GetAt(iPos + 1) + strTemp.GetAt(iPos + 1) + strTemp.GetAt(iPos + 1);
		iPos = strTemp.Find("C3");
		if(iPos != -1)
			strC3 = strTemp.GetAt(iPos + 1) + strTemp.GetAt(iPos + 1) + strTemp.GetAt(iPos + 1) + strTemp.GetAt(iPos + 1);
		iPos = strTemp.Find("C4");
		if(iPos != -1)
			strC4 = strTemp.GetAt(iPos + 1) + strTemp.GetAt(iPos + 1) + strTemp.GetAt(iPos + 1) + strTemp.GetAt(iPos + 1);
		strTemp.Format("C1: %s\n, C2: %s\n, C3: %s\n, C4: %s\n", strC1, strC2, strC3, strC4);
		if(!strC1.IsEmpty() || !strC2.IsEmpty() || !strC3.IsEmpty() || !strC4.IsEmpty())
		{
			edit.SetSel(-1, 0);
			edit.ReplaceSel(strTemp);
			//AfxMessageBox(strTemp);
			SetEvent(pDoc->m_hPostMsgEvent);
			return 0L;
		}
	}	
	//////////////////////////////////////////////////////////////////////////


	
	if(nLength && m_iViewMode == 0)
	{
		nTextLength = edit.GetWindowTextLength();
		edit.SetSel(nTextLength, nTextLength); //移动插入光标到正文末尾
		for(int i = 0; i < nLength; i++)
		{
			switch(buf[i])
			{
			case '\r': // 回车
				if(!pDoc->m_bNewLine)
					break;
			case '\n': // 换行
				str += "\r\n";
				break;
			case '\b': // 退格
				edit.SetSel(-1, 0);
				edit.ReplaceSel(str);
				nTextLength = edit.GetWindowTextLength();
				edit.SetSel(nTextLength - 1, nTextLength);
				edit.ReplaceSel(""); //回退一个字符
				str = "";
				break;
			case '\a': // 振铃
				MessageBeep((UINT)-1);
				break;
			default :
				str += buf[i];
			}
		}
		
		edit.SetSel(-1, 0);
		edit.ReplaceSel(str); // 向编辑视图中插入收到的字符
	}
	SetEvent(pDoc->m_hPostMsgEvent); // 允许发送下一个WM_COMMNOTIFY消息
	
	return 0L;
}

void CTerminalView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	CTerminalDoc* pDoc=GetDocument();	
	char c=(char)nChar;

	if(!pDoc->m_bConnected)
		return;

	pDoc->WriteComm(&c, 1);
	if(pDoc->m_bEcho)
		CEditView::OnChar(nChar, nRepCnt, nFlags); // 本地回显
	
//	CEditView::OnChar(nChar, nRepCnt, nFlags);
}

void CTerminalView::OnViewCate() 
{
	// TODO: Add your command handler code here
	
}

void CTerminalView::OnUpdateViewCate(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	
}

void CTerminalView::OnViewFull() 
{
	// TODO: Add your command handler code here
	
}

void CTerminalView::OnUpdateViewFull(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	
}

⌨️ 快捷键说明

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