📄 xricheditctrl.cpp
字号:
// 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 + -