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

📄 xricheditctrl.cpp

📁 串口的监控程序,提供了固定命令模式和
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// XRichEditCtrl.cpp : implementation file
//

#include "stdafx.h"

#include "XRichEditCtrl.h"

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

#define CHKLINE(nLineIndex)	if((nLineIndex<=-1)||(nLineIndex>=GetLineCount()))\
	nLineIndex=LineFromChar(LineIndex(-1))
#define LN_COL_MSG(lparam)	::PostMessage(GetParent()->m_hWnd,WM_XRICHEDIT_MSG,\
(WPARAM)1,lparam);
/////////////////////////////////////////////////////////////////////////////
// CXRichEditCtrl

//##ModelId=3FFC8F39006E
CXRichEditCtrl::CXRichEditCtrl()
{
	m_bReadOnly=0;
	UINT	uiSize			= sizeof(CHARFORMAT);
	DWORD	dwMask			= CFM_COLOR | CFM_FACE | CFM_SIZE;
	LONG	lHeight			= 180;	// 8 point => 160 * (1/20)
	m_cfText.cbSize			= uiSize;
	m_cfText.dwMask			= dwMask;
	m_cfText.dwEffects		= 0;
	m_cfText.yHeight		= lHeight;
	m_cfText.crTextColor	= RGB(0, 0, 0);
	strcpy(m_cfText.szFaceName,	_T("宋体"));
	m_cfComment.cbSize		= uiSize;
	m_cfComment.dwMask		= dwMask;
	m_cfComment.dwEffects	= 0;
	m_cfComment.yHeight		= lHeight;
	m_cfComment.crTextColor	= RGB(0, 128, 0);
	strcpy(m_cfComment.szFaceName, _T("宋体"));
	m_cfRecv.cbSize			= uiSize;
	m_cfRecv.dwMask			= dwMask;
	m_cfRecv.dwEffects		= 0;
	m_cfRecv.yHeight		= lHeight;
	m_cfRecv.crTextColor	= RGB(0, 0, 200);
	strcpy(m_cfRecv.szFaceName,	_T("宋体"));
	m_cfSend.cbSize		= uiSize;
	m_cfSend.dwMask		= dwMask;
	m_cfSend.dwEffects	= 0;
	m_cfSend.yHeight		= lHeight;
	m_cfSend.crTextColor	= RGB(200, 0, 0);
	strcpy(m_cfSend.szFaceName, _T("宋体"));
	m_cfGray.cbSize		= uiSize;
	m_cfGray.dwMask		= dwMask;
	m_cfGray.dwEffects	= 0;
	m_cfGray.yHeight		= lHeight;
	m_cfGray.crTextColor	= RGB(128, 128, 128);
	strcpy(m_cfGray.szFaceName, _T("宋体"));
	m_cfNumber.cbSize		= uiSize;
	m_cfNumber.dwMask		= dwMask;
	m_cfNumber.dwEffects	= 0;
	m_cfNumber.yHeight		= lHeight;
	m_cfNumber.crTextColor	= RGB(200, 0, 0);
	strcpy(m_cfNumber.szFaceName, _T("宋体"));
}

//##ModelId=3FFC8F390186
CXRichEditCtrl::~CXRichEditCtrl()
{
}


BEGIN_MESSAGE_MAP(CXRichEditCtrl, CRichEditCtrl)
	//{{AFX_MSG_MAP(CXRichEditCtrl)
	ON_WM_CREATE()
	ON_WM_LBUTTONDOWN()
	ON_WM_KEYDOWN()
	ON_CONTROL_REFLECT(EN_CHANGE, OnChange)
	ON_WM_MOUSEMOVE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CXRichEditCtrl message handlers

//##ModelId=3FFC8F390177
BOOL CXRichEditCtrl::CreateX(CWnd *pf, const RECT &rect, UINT unID, DWORD dwStyle)
{
	return Create(dwStyle,rect, pf, unID);
}

//##ModelId=3FFC8F390167
long CXRichEditCtrl::GetLineStart(int nLineIndex)
{
	CHKLINE(nLineIndex);
	return LineIndex(nLineIndex);
}

//##ModelId=3FFC8F390158
long CXRichEditCtrl::GetLineEnd(int nLineIndex)
{
	CHKLINE(nLineIndex);
	return LineIndex(nLineIndex)+LineLength(LineIndex(nLineIndex));
}

//##ModelId=3FFC8F390157
int CXRichEditCtrl::GetCursorCol()
{
	long ns=0,ne=0;
	GetSel(ns,ne);
	if(ns!=ne)
	{
		ns=LineFromChar(ne);
		ns=GetLineStart(ns);
		return ne-ns;
	}
	return ne-LineIndex(-1);
}

//##ModelId=3FFC8F390148
int CXRichEditCtrl::GetLineStr(CString &str, int nLineIndex)
{
	CHKLINE(nLineIndex);
	int nli=LineIndex(nLineIndex);
	long ns,ne;
	GetSel(ns,ne);
	SetSel(nli,nli+LineLength(nli));
	str=GetSelText();
	SetSel(ns,ne);
	return str.GetLength();
}

//##ModelId=3FFC8F390139
CString CXRichEditCtrl::GetLineStr(int nLineIndex)
{
	CHKLINE(nLineIndex);
	int nli=LineIndex(nLineIndex);
	long ns,ne;
	GetSel(ns,ne);
	SetSel(nli,nli+LineLength(nli));
	CString str=GetSelText();
	SetSel(ns,ne);
//	nRead= GetLine(nLineIndex, str.GetBuffer(nLineLength+3),nLineLength + 1);
//	str.ReleaseBuffer(nRead);
	return str;
}

//##ModelId=3FFC8F390138
void CXRichEditCtrl::SetDefaultFont()
{
	CFont FontTmp;
	FontTmp.CreateFont(12,0,0,0,650,FALSE,FALSE,0,
						ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,
						DEFAULT_QUALITY,VARIABLE_PITCH&FF_SWISS,"宋体");
	SetFont(&FontTmp);
	FontTmp.DeleteObject();
}

//##ModelId=3FFC8F390128
void CXRichEditCtrl::ReplaceStr(CString str, int nFlag, int nLineIndex)
{
	CHKLINE(nLineIndex);
	int nli=LineIndex(nLineIndex);
	if((nFlag==4)||(nFlag==5))
	{
		if(GetLineStr(nLineIndex).IsEmpty())	nFlag=0;
	}
	if(nFlag==0)	SetSel(nli,nli+LineLength(nli));//整行覆盖
	else if(nFlag==1)	//当前光标处
	{
		long nStart,nEnd;
		GetSel(nStart,nEnd);
		SetSel(nEnd,nEnd);
	}
	else if((nFlag==2)||(nFlag==5))//
	{
		if(nFlag==5)	str="\n"+str;
		SetSel(nli+LineLength(nli),nli+LineLength(nli));//行尾或下行
	}
	else if((nFlag==3)||(nFlag==4))
	{
		if(nFlag==4)	str+="\n";
		SetSel(nli,nli);	//行首或上行
	}
	ReplaceSel(str,1);
}

//##ModelId=3FFC8F390119
void CXRichEditCtrl::MakeUpperLower(BOOL bUpper,int nLineIndex)
{
	CHKLINE(nLineIndex);
	long lst,lse;
	GetSel(lst,lse);
	CString str;
	if(lst==lse)	
	{	
		GetLineStr(str,nLineIndex);	
		SetSel(GetLineStart(nLineIndex),GetLineEnd(nLineIndex));
	}
	else
	{
		str=GetSelText();
		SetSel(lst,lse);
	}
	if(bUpper)	str.MakeUpper();
	else		str.MakeLower();
	ReplaceSel(str,1);
	str.Empty();
//	SetSel(lst,lse);
}


//##ModelId=3FFC8F3900EE
BOOL CXRichEditCtrl::IsHexFormat(CString str)
{
	int nStrlength=str.GetLength();

	if(nStrlength<2)
		return FALSE;
    if(nStrlength % 2 )
		return FALSE;

	TCHAR chr=' ';
	
	for(int i=0;i<nStrlength;i+=1) //3
	{
		chr=str.GetAt(i);
		BOOL bHex=(((chr>='0')&&(chr<='9'))||((chr>='A')&&(chr<='F'))||((chr>='a')&&(chr<='f')));
		
		if(!bHex)
		{
			return FALSE;
		}
/*
		if(((i+1)==nStrlength))||((i+2)==nStrlength))
		{
			return FALSE;
		}

		if((i+2)!=nStrlength)	
		{
			chr=str.GetAt(i+2);
		}
		
		if(chr!=' ')	
		{
			return FALSE;
		}
		

		for(int j=0;j<2;j++)
		{
			chr=str.GetAt(i+j);
			BOOL bHex=(((chr>='0')&&(chr<='9'))||((chr>='A')&&(chr<='F'))||((chr>='a')&&(chr<='f')));
			
			if(!bHex)
			{
				return FALSE;
			}
		}
		*/
	}
	return TRUE;
}

//##ModelId=3FFC8F39010A
BOOL CXRichEditCtrl::MakeAscHex(CString str, CString &strNew, BOOL bToAsc)
{
	int nRead=str.GetLength();
	if(nRead==0)	return 0;
	if(bToAsc)
	{		
		if(!IsHexFormat(str))	return 0;
		BYTE btTmp[4096];
		for(int i=0;i<nRead;i+=3)	_stscanf(str.Mid(i,2),"%02X",&btTmp[i/3]);
		strNew=btTmp;
	}
	else
	{
		nRead-=1;
		CString strTmp;
		for(int i=0;i<nRead;i++)
		{
			strTmp.Format("%2X ",(BYTE)str.GetAt(i));
			strNew+=strTmp;
		}
		strTmp.Format("%2X",(BYTE)str.GetAt(nRead));
		strNew+=strTmp;	
		strTmp.Empty();
	}
	return 1;
}

//##ModelId=3FFC8F3900FB
void CXRichEditCtrl::MakeAscHex(BOOL bToAsc, int nLineIndex)
{
	CHKLINE(nLineIndex);
	CString str,strNew;
	GetLineStr(str,nLineIndex);
	if(MakeAscHex(str,strNew,bToAsc))	ReplaceStr(strNew,0,nLineIndex);	
	str.Empty();
	strNew.Empty();
}

//##ModelId=3FFC8F3900EA
BOOL CXRichEditCtrl::IsHexFormat(CString str, CString &strError, int &nErrorPos)
{
	int nStrlength=str.GetLength();
	if(nStrlength<2)	
	{
		strError="长度不能小于 1 个字节!";
		nErrorPos=0;
		return 0;
	}
	int i=0;
	BOOL bError=FALSE;
	for(i=0;i<nStrlength;i+=3)
	{
		if((i+1)==nStrlength)
		{
			strError="最后不能为半个字节!";	
			nErrorPos=i+1;
			return 0;
		}
		if((i+3)==nStrlength)
		{
			TCHAR lastchar=str.GetAt(i+2);
			if(isascii(lastchar)==0)	
				strError.Format("最后多出一个非ASCII字符,其16进制为:  %02X H",(BYTE)lastchar);
			else	strError.Format("最后多出一个字符:  \' %c \'",lastchar);
			nErrorPos=i+3;
			return 0;
		}
		TCHAR chr=' ';
		if((i+2)!=nStrlength)	chr=str.GetAt(i+2);
		if(chr!=' ')	
		{
			if(isascii(chr)==0)
				 strError.Format("第 %d 个字节后为非ASCII字符,其16进制为:  %02X H。必须改为  空格",i/3+1,(BYTE)chr);
			else strError.Format("第 %d 个字节后的字符  \' %c \'  必须改为  空格",i/3+1,chr);
			nErrorPos=i+3;
			return 0;
		}
		BOOL bHex=FALSE;
		for(int j=0;j<2;j++)
		{
			chr=str.GetAt(i+j);
			if(chr==' ')	
			{
				if(j==0)	strError.Format("第 %d 个字节的高位不能为  空格,必须是16进制数",i/3+1);
				else		strError.Format("第 %d 个字节的低位不能为  空格,必须是16进制数",i/3+1);
				nErrorPos=i+j+1;
				return 0;
			}
			bHex=(((chr>='0')&&(chr<='9'))||((chr>='A')&&(chr<='F'))||((chr>='a')&&(chr<='f')));
			if(!bHex)
			{
				if(j==0)	
				{
					if(isascii(chr)==0)
						 strError.Format("第 %d 个字节的高位为非ASCII字符,其16进制为:  %02X H。必须是16进制数",i/3+1,(BYTE)chr);
					else strError.Format("第 %d 个字节的高位不能为  \' %c \',必须是16进制数",i/3+1,chr);
				}
				else	

⌨️ 快捷键说明

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