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

📄 twscriptedit.cpp

📁 模拟了tec2000的所有功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		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 + -