📄 twscriptedit.cpp
字号:
pthis->strins[pthis->inslength]='\0';
pthis->SetSel(OldlengthAll, OldlengthAll);
pthis->ReplaceSel(CString(ch));
pthis->GetInsFromCmd(ins,pthis->strins);
int lenins=strlen(ins);
char chtemp[10];
pthis->GetFirstCharFromLastLine(chtemp);
//显示动态帮助
pthis->MakeUp(ins,lenins);
if(chtemp[0]=='>'){
pthis->help.MakeCHelp(ins,lenins);
pthis->ShowHelp();
}
else{
pthis->help.MakeIHelp(ins,lenins);
pthis->ShowHelp();
}
}
}
void CTWScriptEdit::GetInsFromCmd(char * ins,char * cmd){
int i=0,j=0;
int length=strlen(cmd);
if(length<1){
ins[0]='\0';
return ;
}
while(cmd[i]==' '){
i++;
}
for(j=0;cmd[i]!=' '&&cmd[i]!='\0';i++,j++)
ins[j]=cmd[i];
ins[j]='\0';
}
void CTWScriptEdit::OnlyC(char * ins){
char temp[100];
strcpy(temp,ins);
int lenins=strlen(ins);
temp[lenins]='\0';
int i=0,j=0;
for(i=0,j=0;temp[i]!='\0';){
if((temp[i]>='a'&&temp[i]<='z')||(temp[i]>='A'&&temp[i]<='Z')){
ins[j]=temp[i];
i++;
j++;
}
else
i++;
}
}
//判断是不是关键字
int CTWScriptEdit::IsKeyword(LPCTSTR lpszSymbol)
{
CString strSymbol;
strSymbol.Format(" %s ", lpszSymbol);
if (!m_bCaseSensitive) //如果不是大小写敏感,则将其全部转化为小写
strSymbol.MakeLower();
return m_strKeywordsLower.Find(strSymbol);
}
//判断是不是常量
int CTWScriptEdit::IsConstant(LPCTSTR lpszSymbol)
{
CString strSymbol; strSymbol.Format(" %s ", lpszSymbol);
if (!m_bCaseSensitive)
strSymbol.MakeLower();
return m_strConstantsLower.Find(strSymbol);
}
//判断是不是字符串
BOOL CTWScriptEdit::IsStringQuote(TCHAR ch)
{
return (m_strStringQuotes.Find(ch) >= 0);
}
//设置一定范围内字符的属性
void CTWScriptEdit::SetFormatRange(int nStart, int nEnd, BOOL bBold, COLORREF clr)
{
if (nStart >= nEnd)
return;
SetSel(nStart, nEnd);//选择这个范围
DWORD dwEffects = bBold?CFE_BOLD:0;
CHARFORMAT cfm;
cfm.cbSize = sizeof(cfm);
GetSelectionCharFormat(cfm); //选中内容中的第一个字符的属性
if ((cfm.dwMask & CFM_COLOR) && cfm.crTextColor == clr &&
(cfm.dwMask & CFM_BOLD) && (cfm.dwEffects & CFE_BOLD) == dwEffects)
return;
cfm.dwEffects = dwEffects;
cfm.crTextColor = clr;
cfm.dwMask = CFM_BOLD | CFM_COLOR;
SetSelectionCharFormat(cfm);//改变所有选中的字符属性
}
//改变选中的文本中字符的大小写,用lpsz代替其中的所有内容
void CTWScriptEdit::ChangeCase(int nStart, int nEnd, LPCTSTR lpsz)
{
ASSERT((nEnd - nStart) == (int)_tcslen(lpsz));
if (!m_bCaseSensitive && m_bChangeCase) {//如果大小写敏感且可以改变大小写
SetSel(nStart, nEnd);
ReplaceSel(lpsz);
}
}
//最主要的函数,改变颜色
void CTWScriptEdit::FormatTextRange(int nStart, int nEnd)
{
if (nStart >= nEnd)
return;
m_bInForcedChange = TRUE;//相当于临界区,互斥访问
CHARRANGE crOldSel;
GetSel(crOldSel);//得到当前选中的内容
LockWindowUpdate();
HideSelection(TRUE, FALSE);
TCHAR *pBuffer = NULL;
try {
SetSel(nStart, nEnd);//设置当前选中的内容
pBuffer = new TCHAR[nEnd - nStart + 1];//末尾要显示加0
long nLen = GetSelText(pBuffer);//得到当前选中的文本内容,送给pBuffer指向的空间
ASSERT(nLen <= nEnd - nStart);
pBuffer[nLen] = 0;//末尾置0
TCHAR *pStart, *pPtr;
pStart = pPtr = pBuffer;
TCHAR* pSymbolStart = NULL;
SymbolColor ic;
while (*pPtr != 0) {
TCHAR ch = *pPtr;
if (ch == m_chComment && (m_chComment2 == 0 || pPtr[1] == m_chComment2)) {
pSymbolStart = pPtr;
do {
ch = *(++pPtr);
} while (ch != 0 && ch != '\r');
ic = m_icComment;//常量的颜色值
} else if (IsStringQuote(ch)) { // Process strings
pSymbolStart = pPtr;
TCHAR ch1 = ch;
do {
ch = *(++pPtr);
} while (ch != 0 && ch != ch1 && ch != '\r');
if (ch == ch1) pPtr++;
//ic = m_icString;//字符串的颜色值
} else if (_istdigit(ch)) { // Process numbers
pSymbolStart = pPtr;
_tcstod(pSymbolStart, &pPtr);
ic = m_icNumber;//数字的颜色值
} else if (_istalpha(ch) || ch == '_') { // Process keywords
pSymbolStart = pPtr;
do {
ch = *(++pPtr);
} while (_istalnum(ch) || ch == '_');
*pPtr = 0;
int nPos = IsKeyword(pSymbolStart);
if (nPos >= 0) {//如果是关键字
ChangeCase(nStart + pSymbolStart - pBuffer, nStart + pPtr - pBuffer,
m_strKeywords.Mid(nPos+1, pPtr - pSymbolStart));
if (_tcsicmp(m_strComment, pSymbolStart) == 0) {
*pPtr = ch;
*pSymbolStart = m_chComment;
if (pSymbolStart[1] != 0 && m_chComment2 != 0)
pSymbolStart[1] = m_chComment2;
pPtr = pSymbolStart;
pSymbolStart = NULL;
continue;
}
ic = m_icKeyword;
} else {//如果不是关键字
nPos = IsConstant(pSymbolStart);
if (nPos >= 0) {//如果是常量
ChangeCase(nStart + pSymbolStart - pBuffer, nStart + pPtr - pBuffer,
m_strConstants.Mid(nPos+1, pPtr - pSymbolStart));
ic = m_icConstant;
} else {
ic=m_icOther;
pSymbolStart = NULL;
}
}
*pPtr = ch;
} else {
ic=m_icOther;
pPtr++;
}
if (pSymbolStart != NULL) {
ASSERT(pSymbolStart < pPtr);
SetFormatRange(nStart + pStart - pBuffer, nStart + pSymbolStart - pBuffer, FALSE, RGB(0,0,0));
SetFormatRange(nStart + pSymbolStart - pBuffer, nStart + pPtr - pBuffer, ic.bBold, ic.clrColor);
pStart = pPtr;
pSymbolStart = 0;
} else if (*pPtr == 0)
SetFormatRange(nStart + pStart - pBuffer, nStart + pPtr - pBuffer, FALSE, RGB(0,0,0));
}
} catch(...){}
delete [] pBuffer;
SetSel(crOldSel);
HideSelection(FALSE, FALSE);
UnlockWindowUpdate();
m_bInForcedChange = FALSE;
}
//改变行之间的文本格式
void CTWScriptEdit::FormatTextLines(int nLineStart, int nLineEnd)
{
long nStart = LineIndex(LineFromChar(nLineStart));
long nEnd = LineIndex(LineFromChar(nLineEnd));
nEnd += LineLength(nLineEnd);
FormatTextRange(nStart, nEnd);
}
//改变所有的文本格式
void CTWScriptEdit::FormatAll()
{
FormatTextRange(0, GetTextLength());
}
LRESULT CTWScriptEdit::OnSetText(WPARAM wParam, LPARAM lParam)
{
LRESULT res = Default();
FormatAll();
return res;
}
void CTWScriptEdit::OnChange()
{
CString temp="\r\n";
int CurrentlengthAll;
int lines=GetLineCount();
this->GetLine(lines-1,buffer,500);
DWORD len=strlen(buffer);
if(len>=90){
CurrentlengthAll=GetWindowTextLength();
SetSel(CurrentlengthAll,CurrentlengthAll);
ReplaceSel(temp);
}
/* if (m_bInForcedChange)
return;
CHARRANGE crCurSel;
GetSel(crCurSel);
if (m_changeType == ctMove && crCurSel.cpMin == crCurSel.cpMax) {
// cut was canceled, so this is paste operation
m_changeType = ctPaste;
}
switch(m_changeType) {
case ctReplSel:// old=(x,y) -> cur=(x+len,x+len)
case ctPaste: // old=(x,y) -> cur=(x+len,x+len)
FormatTextLines(m_crOldSel.cpMin, crCurSel.cpMax);
break;
case ctDelete: // old=(x,y) -> cur=(x,x)
case ctBack: // old=(x,y) -> cur=(x,x), newline del => old=(x,x+1) -> cur=(x-1,x-1)
case ctCut: // old=(x,y) -> cur=(x,x)
FormatTextLines(crCurSel.cpMin, crCurSel.cpMax);
break;
case ctUndo: // old=(?,?) -> cur=(x,y)
FormatTextLines(crCurSel.cpMin, crCurSel.cpMax);
break;
case ctMove: // old=(x,x+len) -> cur=(y-len,y) | cur=(y,y+len)
FormatTextLines(crCurSel.cpMin, crCurSel.cpMax);
if (crCurSel.cpMin > m_crOldSel.cpMin) // move after
FormatTextLines(m_crOldSel.cpMin, m_crOldSel.cpMin);
else // move before
FormatTextLines(m_crOldSel.cpMax, m_crOldSel.cpMax);
break;
default:
// FormatAll();
break;
}
//undo action does not call OnProtected, so make it default
m_changeType = ctUndo;*/
}
void CTWScriptEdit::OnProtected(NMHDR* pNMHDR, LRESULT* pResult)
{
ENPROTECTED* pEP = (ENPROTECTED*)pNMHDR;
// determine type of change will occur
switch (pEP->msg) {
case WM_KEYDOWN:
switch (pEP->wParam) {
case VK_DELETE:
m_changeType = ctDelete;
break;
case VK_BACK:
m_changeType = ctBack;
break;
default:
m_changeType = ctUnknown;
break;
}
break;
case EM_REPLACESEL:
case WM_CHAR:
m_changeType = ctReplSel;
break;
case WM_PASTE:
m_changeType = (m_changeType == ctCut)?ctMove:ctPaste;
break;
case WM_CUT:
m_changeType = ctCut;
break;
default:
m_changeType = ctUnknown;
break;
};
if (pEP->msg != EM_SETCHARFORMAT && m_changeType != ctMove)
m_crOldSel = pEP->chrg;
*pResult = FALSE;
}
void CTWScriptEdit::OnSelChange(NMHDR* pNMHDR, LRESULT* pResult)
{
SELCHANGE* pSC = (SELCHANGE*)pNMHDR;
*pResult = 0;
}
void CTWScriptEdit::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CRichEditCtrl::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CTWScriptEdit::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CRichEditCtrl::OnKeyUp(nChar, nRepCnt, nFlags);
}
void CTWScriptEdit::ChangeColor(){
if (m_bInForcedChange)
return;
CHARRANGE crCurSel;
GetSel(crCurSel);
if (m_changeType == ctMove && crCurSel.cpMin == crCurSel.cpMax) {
// cut was canceled, so this is paste operation
m_changeType = ctPaste;
}
switch(m_changeType) {
case ctReplSel:// old=(x,y) -> cur=(x+len,x+len)
case ctPaste: // old=(x,y) -> cur=(x+len,x+len)
FormatTextLines(m_crOldSel.cpMin, crCurSel.cpMax);
break;
case ctDelete: // old=(x,y) -> cur=(x,x)
case ctBack: // old=(x,y) -> cur=(x,x), newline del => old=(x,x+1) -> cur=(x-1,x-1)
case ctCut: // old=(x,y) -> cur=(x,x)
FormatTextLines(crCurSel.cpMin, crCurSel.cpMax);
break;
case ctUndo: // old=(?,?) -> cur=(x,y)
FormatTextLines(crCurSel.cpMin, crCurSel.cpMax);
break;
case ctMove: // old=(x,x+len) -> cur=(y-len,y) | cur=(y,y+len)
FormatTextLines(crCurSel.cpMin, crCurSel.cpMax);
if (crCurSel.cpMin > m_crOldSel.cpMin) // move after
FormatTextLines(m_crOldSel.cpMin, m_crOldSel.cpMin);
else // move before
FormatTextLines(m_crOldSel.cpMax, m_crOldSel.cpMax);
break;
default:
FormatAll();
break;
}
//undo action does not call OnProtected, so make it default
m_changeType = ctUndo;
}
void CTWScriptEdit::OutConsole1(char ch)
{
// OutConsole(this);
/*
char ins[200]; //用于存放操作码
int OldlengthAll;
OldlengthAll=GetWindowTextLength();
if(asmtemp->signE){
if(ch=='\r'){
strins[inslength++]=ch;
strins[inslength]='\0';
SetEvent(m_hEvent);
return ;
}
if(ch==' '){
strins[inslength++]=ch;
strins[inslength]='\0';
SetEvent(m_hEvent);
return ;
}
}
if(ch=='\r'){
if(inslength>0){
GetInsFromCmd(ins,strins);
SetEvent(m_hEvent);
}
else if(inslength==0){
SetEvent(m_hEvent);
}
GetInsFromCmd(ins,strins);
int lenins=strlen(ins);
char chtemp[10];
GetFirstCharFromLastLine(chtemp);
//显示动态帮助
MakeUp(ins,lenins);
if(chtemp[0]=='>'){
help.MakeCHelp(ins,lenins);
ShowHelp();
}
else{
help.MakeIHelp(ins,lenins);
ShowHelp();
}
}
else if(ch=='\b'){
int templen=inslength;
if(inslength>0)
inslength--;
strins[inslength]='\0';
if(templen>0){
SetSel(OldlengthAll-1,OldlengthAll);
ReplaceSel("");
}
if(inslength<=4){
GetInsFromCmd(ins,strins);
int lenins=strlen(ins);
char chtemp[10];
GetFirstCharFromLastLine(chtemp);
//显示动态帮助
MakeUp(ins,lenins);
if(chtemp[0]=='>'){
help.MakeCHelp(ins,lenins);
ShowHelp();
}
else{
help.MakeIHelp(ins,lenins);
ShowHelp();
}
}
}
else{
strins[inslength++]=ch;
strins[inslength]='\0';
SetSel(OldlengthAll, OldlengthAll);
ReplaceSel(CString(ch));
GetInsFromCmd(ins,strins);
int lenins=strlen(ins);
char chtemp[10];
GetFirstCharFromLastLine(chtemp);
//显示动态帮助
MakeUp(ins,lenins);
if(chtemp[0]=='>'){
help.MakeCHelp(ins,lenins);
ShowHelp();
}
else{
help.MakeIHelp(ins,lenins);
ShowHelp();
}
}*/
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -