📄 xricheditctrl.cpp
字号:
{
if(isascii(chr)==0)
strError.Format("第 %d 个字节的低位为非ASCII字符,其16进制为: %2X H。必须是16进制数",i/3+1,(BYTE)chr);
else strError.Format("第 %d 个字节的低位不能为 \' %c \',必须是16进制数",i/3+1,chr);
}
nErrorPos=i+j+1;
return 0;
}
}
}
return 1;
}
//##ModelId=3FFC8F3900DC
BOOL CXRichEditCtrl::IsHexFormat(int nLineIndex)
{
CHKLINE(nLineIndex);
CString str,strError;
int nErrorPos;
GetLineStr(str,nLineIndex);
if(IsHexFormat(str,strError,nErrorPos))
{
str.Empty();
strError.Empty();
return 1;
}
CString strtmp;
strtmp.Format("第 %d 行 报文格式出错:\n\n",nLineIndex+1);
strtmp+=strError;
strtmp+="\n\n报文格式:";
strtmp+="\n1、每 2 个字节间有一个空格;";
strtmp+="\n2、每个字节必须为16进制数:0~9,a~f,A~F;";
strtmp+="\n3、最后一个字节后不能有任何字符。";
strtmp+="\n\n示例报文(共5个字节):EB 90 02 34 0D";
AfxMessageBox(strtmp);
strtmp.Empty();
str.Empty();
strError.Empty();
SetFocus();
int nError=LineIndex(nLineIndex)+nErrorPos;
SetSel(nError,nError);
return 0;
}
//##ModelId=3FFC8F3900DA
int CXRichEditCtrl::GetLineLength(int nLineIndex)
{
CHKLINE(nLineIndex);
return LineLength(LineIndex(nLineIndex));
}
static DWORD CALLBACK
CXRichEditCtrlStreamOutCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
CFile* pFile = (CFile*) dwCookie;
pFile->Write(pbBuff, cb);
*pcb = cb;
return 0;
}
//##ModelId=3FFC8F3900CD
BOOL CXRichEditCtrl::SaveFile(LPCTSTR str)
{
CFile fld;
if(!fld.Open( str, CFile::modeCreate|CFile::modeWrite))
{
if(!fld.Open( GetFilePath(1), CFile::modeCreate|CFile::modeWrite))
return 0;
}
EDITSTREAM strm;
strm.dwCookie = (DWORD) &fld;
strm.pfnCallback = CXRichEditCtrlStreamOutCallback;
StreamOut(SF_RTF, strm);
SetModify(FALSE);
AfxGetApp()->WriteProfileString("Settings" ,"XREPath", str);
fld.Close();
return 1;
}
static DWORD CALLBACK
CXRichEditCtrlStreamInCallback(DWORD dwCookie, LPBYTE pbBuff, LONG cb, LONG *pcb)
{
CFile* pFile = (CFile*) dwCookie;
*pcb = pFile->Read(pbBuff, cb);
return 0;
}
//##ModelId=3FFC8F3900CB
BOOL CXRichEditCtrl::LoadFile(LPCTSTR str)
{
CFile fld;
if(!fld.Open( str, CFile::modeRead))
{
if(!fld.Open( GetFilePath(1), CFile::modeRead))
return 0;
}
EDITSTREAM strm;
strm.dwCookie = (DWORD) &fld;
strm.pfnCallback = CXRichEditCtrlStreamInCallback;
StreamIn(SF_RTF, strm);
SetModify(FALSE);
fld.Close();
return 1;
}
//##ModelId=3FFC8F3900BC
void CXRichEditCtrl::HexToStr(BYTE *btData, int nLength, CString &strOutput)
{
if((btData==NULL)||(nLength<1)) return;
CString strCvt;
int nl=nLength-1;
for(int i = 0; i < nl; i++)
{
strCvt.Format("%02X ", btData[i]);
strOutput += strCvt;
}
strCvt.Format("%02X", btData[i]);
strOutput+=strCvt;
strCvt.Empty();
}
//##ModelId=3FFC8F3900AE
CString CXRichEditCtrl::HexToStr(BYTE *btData, int nLength)
{
if((btData==NULL)||(nLength<1)) return "";
CString strCvt,strOutput;
int nl=nLength-1;
for(int i = 0; i < nl; i++)
{
strCvt.Format("%02X ", btData[i]);
strOutput += strCvt;
}
strCvt.Format("%02X", btData[i]);
strOutput+=strCvt;
strCvt.Empty();
return strOutput;
}
//##ModelId=3FFC8F3900AB
int CXRichEditCtrl::StrToHex(CString str,BYTE* btData)
{
int nLength=str.GetLength();
if(nLength<2) return 0;
for(int i=0;i<nLength;i+=2)
_stscanf(str.Mid(i,2),"%03X",&btData[i/2]);
return (i+1)/2;
}
//##ModelId=3FFC8F39009F
int CXRichEditCtrl::GetLineIndex(int nLineIndex)
{
CHKLINE(nLineIndex);
return nLineIndex;
}
//##ModelId=3FFC8F390227
int CXRichEditCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (LoadLibraryA(_T("RICHED20.DLL")) == NULL)
{
AfxMessageBox("RICHED20.DLL 未找到", MB_OK|MB_ICONEXCLAMATION);
PostMessage(WM_QUIT,0,0);
return -1;
}
if (CRichEditCtrl::OnCreate(lpCreateStruct) == -1)
return -1;
SetDefaultFont();
SetEventChange();
SetBackgroundColor(FALSE, RGB(240,240,240));
// TODO: Add your specialized creation code here
LoadFile(GetFilePath(0));
return 0;
}
//##ModelId=3FFC8F39009E
DWORD CXRichEditCtrl::SetEventChange()
{
long lMask = GetEventMask();
lMask |= ENM_CHANGE;
return SetEventMask(lMask);
}
//##ModelId=3FFC8F390233
void CXRichEditCtrl::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CRichEditCtrl::OnLButtonDown(nFlags, point);
LN_COL_MSG(MAKELPARAM(GetLineIndex(),GetCursorCol()))
}
//##ModelId=3FFC8F390243
void CXRichEditCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CRichEditCtrl::OnKeyDown(nChar, nRepCnt, nFlags);
LN_COL_MSG(MAKELPARAM(GetLineIndex(),GetCursorCol()))
}
//##ModelId=3FFC8F39007D
BOOL CXRichEditCtrl::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
switch(pMsg->message)
{
case WM_KEYDOWN:
if(IsCASDown(4))//ctrl+alt
{
switch (pMsg->wParam)
{
case 'U':
case 'L':
MakeUpperLower((pMsg->wParam=='U')?1:0);
return TRUE;
case 'H':
case 'A':
MakeAscHex((pMsg->wParam=='A')?1:0);
return TRUE;
case 'P':
IsHexFormat();
return TRUE;
case 'B':
case 'G':
case 'Y':
case 'T':
case 'R':
if(GetSelText().IsEmpty()) SetSel(GetLineStart(),GetLineEnd());
if(pMsg->wParam=='B') SetWordCharFormat(m_cfRecv);
else if(pMsg->wParam=='T') SetWordCharFormat(m_cfText);
else if(pMsg->wParam=='G') SetWordCharFormat(m_cfComment);
else if(pMsg->wParam=='Y') SetWordCharFormat(m_cfGray);
else if(pMsg->wParam=='R') SetWordCharFormat(m_cfSend);
// SetSel(GetLineStart(),GetLineStart());
return TRUE;
case ' ':
ReplaceSel("");
// SetSel(GetLineStart(),GetLineEnd());
if(!GetLineStr().IsEmpty()) ReplaceStr("",5);
SetSel(GetLineStart(),GetLineStart());
SetWordCharFormat(m_cfComment);
ReplaceStr("<<-- -->>",5);
// HideCaret();
// DestroyCaret();
/*
CBitmap* pBitmap = new CBitmap;
pBitmap->LoadBitmap(IDB_BITMAP1);
CreateCaret(pBitmap);
ShowCaret();
*/
return TRUE;
}
}
else if(IsCASDown(3))//ctrl
{
switch (pMsg->wParam)
{
case 'V':
PasteSpecial(CF_TEXT); return TRUE;
case 'C':
Copy(); return TRUE;
case 'X':
Cut(); return TRUE;
case 'A':
SetSel(0,-1); return TRUE;
case 'Z':
Undo(); return TRUE;
case 'R':
m_bReadOnly=!m_bReadOnly;
SetReadOnly(m_bReadOnly);
if(m_bReadOnly) SetBackgroundColor(FALSE,RGB(210,210,210));
else SetBackgroundColor(FALSE,RGB(230,230,230));
return TRUE;
}
}
break;
}
return CRichEditCtrl::PreTranslateMessage(pMsg);
}
//##ModelId=3FFC8F390253
void CXRichEditCtrl::OnChange()
{
// TODO: If this is a RICHEDIT control, the control will not
// send this notification unless you override the CRichEditCtrl::OnInitDialog()
// function and call CRichEditCtrl().SetEventMask()
// with the ENM_CHANGE flag ORed into the mask.
LN_COL_MSG(MAKELPARAM(GetLineIndex(),GetCursorCol()))
// TODO: Add your control notification handler code here
}
//##ModelId=3FFC8F39009C
BOOL CXRichEditCtrl::IsCASDown(int nFlag)
{
if(nFlag==0) return (::GetKeyState(VK_CONTROL) < 0);
else if(nFlag==1) return (::GetKeyState(VK_MENU) < 0);
else if(nFlag==2) return (::GetKeyState(VK_SHIFT) < 0);
else if(nFlag==3)
{
return (::GetKeyState(VK_CONTROL) < 0)&&(::GetKeyState(VK_MENU) >= 0)
&&(::GetKeyState(VK_SHIFT) >= 0);
}
else if(nFlag==4)
{
return (::GetKeyState(VK_CONTROL)<0)&&(::GetKeyState(VK_MENU) < 0)
&&(::GetKeyState(VK_SHIFT) >= 0);
}
return 0;
}
//##ModelId=3FFC8F39008F
CString CXRichEditCtrl::GetFilePath(int nFlag)
{
CString str;
str=AfxGetApp()->GetProfileString("Settings","XREPath");
if(!str.IsEmpty()&&!nFlag) return str;
::GetModuleFileName(NULL,str.GetBufferSetLength(MAX_PATH+1), MAX_PATH);
int position=str.ReverseFind('\\');
str=str.Left(position+1)+AfxGetApp()->m_pszExeName+".pcf";
return str;
}
//##ModelId=3FFC8F39008C
int CXRichEditCtrl::GotoLine(int nFlag, int nLineIndex)
{
CHKLINE(nLineIndex);
if(nFlag==1)
{
nLineIndex+=1;
if(nLineIndex>=GetLineCount()) nLineIndex-=1;
}
else if(nFlag==2)
{
if(nLineIndex>0) nLineIndex-=1;
}
SetSel(LineIndex(nLineIndex),LineIndex(nLineIndex));
return nLineIndex;
}
//##ModelId=3FFC8F390261
void CXRichEditCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CRichEditCtrl::OnMouseMove(nFlags, point);
if(!GetSelText().IsEmpty())
{
long ns=0,ne=0;
GetSel(ns,ne);
if(GetSelText().Right(1)=='\n') ne-=1;
ns=GetLineStart(LineFromChar(ne));
LN_COL_MSG(MAKELPARAM(LineFromChar(ne),ne-ns))
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -