1void CTWScriptEdit::FormatTextRange(int nStart, int nEnd) 2{ 3 if (nStart >= nEnd) 4 return; 5 6 m_bInForcedChange = TRUE; 7 8 CHARRANGE crOldSel; 9 10 GetSel(crOldSel); 11 LockWindowUpdate(); 12 HideSelection(TRUE, FALSE); 13 14 TCHAR *pBuffer = NULL; 15 try { 16 SetSel(nStart, nEnd); 17 pBuffer = new TCHAR[nEnd - nStart + 1]; 18 long nLen = GetSelText(pBuffer); 19 20 ASSERT(nLen <= nEnd - nStart); 21 22 pBuffer[nLen] = 0; 23 24 TCHAR *pStart, *pPtr; 25 pStart = pPtr = pBuffer; 26 27 TCHAR* pSymbolStart = NULL; 28 SymbolColor ic; 29 30 while (*pPtr != 0) { 31 TCHAR ch = *pPtr; 32 33 if (ch == m_chComment && (m_chComment2 == 0 || pPtr[1] == m_chComment2)) { 34 pSymbolStart = pPtr; 35 do { 36 ch = *(++pPtr); 37 } while (ch != 0 && ch != '/r'); 38 ic = m_icComment; 39 } else if (IsStringQuote(ch)) { // Process strings 40 pSymbolStart = pPtr; 41 TCHAR ch1 = ch; 42 do { 43 ch = *(++pPtr); 44 } while (ch != 0 && ch != ch1 && ch != '/r'); 45 if (ch == ch1) pPtr++; 46 ic = m_icString; 47 } else if (_istdigit(ch)) { // Process numbers 48 pSymbolStart = pPtr; 49 _tcstod(pSymbolStart, &pPtr); 50 ic = m_icNumber; 51 } else if (_istalpha(ch) || ch == '_') { // Process keywords 52 pSymbolStart = pPtr; 53 do { 54 ch = *(++pPtr); 55 } while (_istalnum(ch) || ch == '_'); 56 *pPtr = 0; 57 int nPos = IsKeyword(pSymbolStart); 58 if (nPos >= 0) { 59 ChangeCase(nStart + pSymbolStart - pBuffer, nStart + pPtr - pBuffer, 60 m_strKeywords.Mid(nPos+1, pPtr - pSymbolStart)); 61 if (_tcsicmp(m_strComment, pSymbolStart) == 0) { 62 *pPtr = ch; 63 *pSymbolStart = m_chComment; 64 if (pSymbolStart[1] != 0 && m_chComment2 != 0) 65 pSymbolStart[1] = m_chComment2; 66 pPtr = pSymbolStart; 67 pSymbolStart = NULL; 68 continue; 69 } 70 ic = m_icKeyword; 71 } else { 72 nPos = IsConstant(pSymbolStart); 73 if (nPos >= 0) { 74 ChangeCase(nStart + pSymbolStart - pBuffer, nStart + pPtr - pBuffer, 75 m_strConstants.Mid(nPos+1, pPtr - pSymbolStart)); 76 ic = m_icConstant; 77 } else { 78 pSymbolStart = NULL; 79 } 80 } 81 *pPtr = ch; 82 } else { 83 pPtr++; 84 } 85 86 if (pSymbolStart != NULL) { 87 ASSERT(pSymbolStart < pPtr); 88 SetFormatRange(nStart + pStart - pBuffer, nStart + pSymbolStart - pBuffer, FALSE, RGB(0,0,0)); 89 SetFormatRange(nStart + pSymbolStart - pBuffer, nStart + pPtr - pBuffer, ic.bBold, ic.clrColor); 90 pStart = pPtr; 91 pSymbolStart = 0; 92 } else if (*pPtr == 0) 93 SetFormatRange(nStart + pStart - pBuffer, nStart + pPtr - pBuffer, FALSE, RGB(0,0,0)); 94 } 95 96 } catch(...){} 97 98 delete [] pBuffer; 99 100 SetSel(crOldSel); 101 HideSelection(FALSE, FALSE); 102 UnlockWindowUpdate(); 103 104 m_bInForcedChange = FALSE; 105}
CRichEditCtrl for Syntax HighLighting
最新推荐文章于 2021-12-20 20:34:56 发布