📄 syneditview.cpp
字号:
CPen *OldPen = cacheDC->SelectObject(&NewPen);
cacheDC->MoveTo( rtSrc.left, rtSrc.bottom-1);
cacheDC->LineTo( rtSrc.right, rtSrc.bottom-1);
cacheDC->SelectObject(OldPen);
}
cacheDC->SelectObject(pOldFont);
}
void CSynEditView::SetWrapMode(int nWrapMode)
{
ShowWindow(SW_HIDE);
//m_nCurrentLine = 0;
//m_nParseArraySize = 0;//改变后需要重新计算
m_nWrapMode = nWrapMode;
CSynEditView::m_nWordWrap = m_nWrapMode;
CSynEditView::WrapChanged();
ResetParseCookie();
ShowWindow(SW_SHOW);
if(m_nWrapMode == WrapNone)
GetRichEditCtrl().ShowScrollBar(SB_HORZ, TRUE);
else
GetRichEditCtrl().ShowScrollBar(SB_HORZ, FALSE);
WriteSettings();
CWinApp *app = AfxGetApp();
app->WriteProfileInt(_T("icrEdit_Values"), _T("m_nWrapMode"), m_nWrapMode);
}
int CSynEditView::GetWrapMode()
{
return m_nWrapMode;
}
void CSynEditView::SetLeftMargin()
{
if(m_bShowLineNumber)
m_nLeftMargin = m_nLineNumberCharNumber * m_nCharNumberWidth + m_nDefaultLeftMargin + 4;
else
m_nLeftMargin = m_nDefaultLeftMargin;
GetClientRect(&m_rcClient);
CRect rect(m_rcClient);
rect.left = m_nLeftMargin;
int nRightMargin;
if(m_bShowReturnLineToken && GetWrapMode()==CSynEditView::WrapToWindow)
nRightMargin = 12; //为行末标志留出空间
else
nRightMargin= 0;
rect.right -= nRightMargin;
GetRichEditCtrl().SetRect(&rect);
if(GetWrapMode()==CSynEditView::WrapToWindow) {
ResetParseCookie();
}
}
int CSynEditView::GetLinesTop(int nline)
{
CRichEditCtrl &SynCtrl = GetRichEditCtrl();
if( nline > SynCtrl.GetLineCount()-1 ) {
int nOffset = SynCtrl.LineIndex( nline-1 );
CPoint p = SynCtrl.GetCharPos( nOffset );
return p.y+m_nLineHeight;
}
int nOffset = SynCtrl.LineIndex( nline );
CPoint p = SynCtrl.GetCharPos( nOffset );
return p.y;
}
void CSynEditView::SetLineHeight()
{
CRichEditCtrl &SynCtrl = GetRichEditCtrl();
SynCtrl.SetWindowText(_T("\n "));
CPoint ps, pe;
ps = SynCtrl.GetCharPos(0);
pe = SynCtrl.GetCharPos(3);
m_nLineHeight = pe.y - ps.y;
}
void CSynEditView::SetCharWidth()
{
CPoint p1, p2;
CRichEditCtrl &SynCtrl = GetRichEditCtrl();
SynCtrl.SetWindowText(_T("8")); //数字宽度
p1 = SynCtrl.GetCharPos(0);
p2 = SynCtrl.GetCharPos(1);
m_nCharNumberWidth = p2.x - p1.x;
m_nDefaultLeftMargin = 15; //设为15主要是为书签留出空间
SynCtrl.SetWindowText(_T(" ")); //空格宽度
p1 = SynCtrl.GetCharPos(0);
p2 = SynCtrl.GetCharPos(1);
m_nCharSpaceWidth = p2.x - p1.x;
}
void CSynEditView::SelectLanguage(int nLanguage)
{
CWinApp *app = AfxGetApp();
app->WriteProfileInt(_T("icrEdit_Values"), _T("m_nLanguage"), nLanguage);
m_nLanguage = nLanguage;
SetCurLanguage(nLanguage);
ReadColorInfo( m_nLanguage );
LoadSynWord( m_strArrayKeyWords, m_nLanguage );
ResetParseCookie();
SendMessage( WM_PAINT, 0, 0 );
}
void CSynEditView::DrawLineNumber(CDC *cacheDC, int nline, CRect rect)
{
int nHalfHeight = rect.top + rect.Height()/2;
int nLeft;
if(m_bShowLineNumber)
{
nLeft = rect.right+1;
}
else
{
nLeft = rect.left-1;
}
//*
//画书签
for(int i=0; i<m_nBookMarksCount; i++)
{
if(nline+1 == anBookMarks[i])
{
int j;
for(j=0; j<6; j++)
cacheDC->SetPixel(nLeft+7+j, nHalfHeight-j, m_clrCurLinNumber);
for(j=0; j<6; j++)
cacheDC->SetPixel(nLeft+7-j, nHalfHeight+j, m_clrCurLinNumber);
for(j=0; j<5; j++)
cacheDC->SetPixel(nLeft+8, nHalfHeight+j, m_clrCurLinNumber);
for(j=-1; j<6; j++)
cacheDC->SetPixel(nLeft+9, nHalfHeight+j, m_clrCurLinNumber);
for(j=-2; j<7; j++)
cacheDC->SetPixel(nLeft+10, nHalfHeight+j, m_clrCurLinNumber);
for(j=-3; j<7; j++)
cacheDC->SetPixel(nLeft+11, nHalfHeight+j, m_clrCurLinNumber);
for(j=-2; j<7; j++)
cacheDC->SetPixel(nLeft+12, nHalfHeight+j, m_clrCurLinNumber);
for(j=1; j<6; j++)
cacheDC->SetPixel(nLeft+13, nHalfHeight+j, m_clrCurLinNumber);
for(j=2; j<4; j++)
cacheDC->SetPixel(nLeft+14, nHalfHeight+j, m_clrCurLinNumber);
}
}
//*/
if(!m_bShowLineNumber)
return;
CFont newFont;
newFont.CreateFontIndirect(&m_lf);
CFont *pOldFont = cacheDC->SelectObject(&newFont);
CString str, str1;
str1.Format(_T("%%0%d"), m_nLineNumberCharNumber);
str.Format(str1+_T("d"), nline+1);
CSize size = cacheDC->GetTextExtent(str);
int nOffsetY = (rect.Height()-size.cy)/2;
CRichEditCtrl &SynCtrl = GetRichEditCtrl();
if( (nline == m_nCurrentLine) && (m_ptStart == m_ptEnd) ) {
cacheDC->SetTextColor(m_clrCurLinNumber);
cacheDC->TextOut(rect.left, rect.top+nOffsetY, str);
}
else {
cacheDC->SetTextColor(m_clrLinNumberNormal);
cacheDC->TextOut(rect.left, rect.top+nOffsetY, str);
}
cacheDC->SelectObject(pOldFont);
}
int CSynEditView::GetCurrentLine()
{
CRichEditCtrl &SynCtrl=GetRichEditCtrl();
CHARRANGE cr;
SynCtrl.GetSel(cr);
if( cr.cpMin == cr.cpMax )
return SynCtrl.LineFromChar( cr.cpMax );
else
return m_nCurrentLine;
}
DWORD CSynEditView::GetParseCookie(int nLineIndex)
{
CRichEditCtrl &SynCtrl=GetRichEditCtrl();
if (m_pdwParseCookies == NULL)
{
m_nParseArraySize = m_nLineCount;
m_pdwParseCookies = new DWORD[m_nLineCount];
memset(m_pdwParseCookies, 0xff, m_nLineCount * sizeof(DWORD));
}
if (nLineIndex < 0)
return 0;
if (m_pdwParseCookies[nLineIndex] != (DWORD) -1)
return m_pdwParseCookies[nLineIndex];
register int L = nLineIndex;
while (L >= 0 && m_pdwParseCookies[L] == (DWORD) -1)
L --;
L ++;
int nBlocks = 0;
CString strLine;
BOOL bRealReturn = m_bRealReturn;
while (L <= nLineIndex)
{
DWORD dwCookie = 0;
if (L > 0) {
dwCookie = m_pdwParseCookies[L - 1];
if(bRealReturn && m_nLanguage != _HTML && m_nLanguage != _XML)
dwCookie &= COOKIE_EXT_COMMENT;
}
ASSERT(dwCookie != (DWORD) -1);
bRealReturn = GetLineString(L, strLine);
m_pdwParseCookies[L] = ParseLine(m_strArrayKeyWords, dwCookie, strLine, NULL, nBlocks);
ASSERT(m_pdwParseCookies[L] != (DWORD) -1);
L ++;
}
return m_pdwParseCookies[nLineIndex];
}
void CSynEditView::ShowUnderLine(BOOL bShowUnderLine)
{
m_bShowUnderLine = bShowUnderLine;
WriteSettings();
}
void CSynEditView::ShowReturnLineToken(BOOL bShowReturnLineToken)
{
ShowWindow(SW_HIDE);
m_bShowReturnLineToken = bShowReturnLineToken;
if(GetWrapMode()==WrapToWindow) {
SetLeftMargin();
ResetParseCookie();
}
WriteSettings();
ShowWindow(SW_SHOW);
SetFocus();
}
void CSynEditView::ShowSelectLine(BOOL bShowSelectLine)
{
m_bShowSelectLine = bShowSelectLine;
WriteSettings();
}
//*
BOOL CSynEditView::GetLineString(int nLine, CString &strLine)
{
strLine = _T("");
CRichEditCtrl &SynCtrl=GetRichEditCtrl();
if(nLine > m_nLineCount - 1 || nLine < 0)
return TRUE;
int nTemp = SynCtrl.LineIndex(nLine);
nTemp = SynCtrl.LineLength(nTemp)*16+32; //缓冲区必须足够大,否则读取中文时可能会有乱码
TCHAR *achLine = new TCHAR[nTemp];
int nLen = SynCtrl.GetLine(nLine, achLine, nTemp);
//检查实际读出的字符数,一个中文应换算成两个字符
int i = 0;
nTemp = 0;
while(nTemp != nLen)
{
if(IsDBCSLeadByte(achLine[i++]))
i++;
++nTemp;
}
/////////////////////////////////////////////////
BOOL bRealReturn;
achLine[i] = 0;
//检查是不是真的换行
if(0xd == achLine[i-1])
{
achLine[--i] = 0;
bRealReturn=TRUE;
}
else
{
achLine[i] = 0;
bRealReturn=FALSE;
}
////////////////////
//尾部加一个空格,以送给语法解析器
lstrcat(achLine, _T(" "));
strLine = achLine;
if(achLine)
delete achLine;
return bRealReturn;
}
//*/
/*
BOOL CSynEditView::GetLineString(int nLine, CString &strLine)
{
strLine = _T("");
CRichEditCtrl &SynCtrl=GetRichEditCtrl();
if(nLine > m_nLineCount - 1 || nLine < 0)
return TRUE;
int nTemp = SynCtrl.LineIndex(nLine);
nTemp = SynCtrl.LineLength(nTemp) * sizeof(WCHAR);
if(nTemp<=1) {
strLine=_T(" ");
return TRUE;
}
nTemp += 4 * sizeof(WCHAR);
int nLen = SynCtrl.GetLine(nLine, strLine.GetBuffer(nTemp), nTemp);
strLine.ReleaseBuffer();
BOOL bRealReturn;
if(nLen > strLine.GetLength())
nLen = strLine.GetLength();
if(nLen>=1 && strLine[nLen-1]==0xd ) {
strLine = strLine.Left(--nLen);
bRealReturn=TRUE;
}
else {
strLine = strLine.Left(nLen);
bRealReturn=FALSE;
}
strLine += _T(" ");
return bRealReturn;
}
//*/
void CSynEditView::ResetParseCookie()
{
m_nParseArraySize = 0;
m_nHorzPos = 0;
if(m_pdwParseCookies != NULL) {
delete m_pdwParseCookies;
m_pdwParseCookies = NULL;
}
if(m_pCacheBitmap!=NULL) {
delete m_pCacheBitmap;
m_pCacheBitmap = NULL;
}
return;
}
void CSynEditView::GotoLine(int nLine)
{
CRichEditCtrl &SynCtrl=GetRichEditCtrl();
m_nLineCount = SynCtrl.GetLineCount();
if(nLine>m_nLineCount)
nLine = m_nLineCount;
--nLine;
int nFirstLine = SynCtrl.GetFirstVisibleLine();
if( nLine < 1)
nLine = 0;
int nLineCount = GetVisibleLineCount();
if(nLine >= nFirstLine && nLine < nFirstLine + nLineCount ) {
int nLineIndex = SynCtrl.LineIndex(nLine);
SynCtrl.SetSel(nLineIndex, nLineIndex);
PostMessage(WM_PAINT, 0, 0); //可能要重画行号和光标
return; //如果当前行在视界内则返回
}
int nTemp = nLine;
if(nTemp > m_nLineCount - nLineCount)
nTemp = m_nLineCount - nLineCount;
int nScrollLines = nTemp - nFirstLine;
SynCtrl.LineScroll(nScrollLines, 0);
SetFocus();
}
void CSynEditView::ShowLineNumber(BOOL bShow)
{
ShowWindow(SW_HIDE);
m_bShowLineNumber = bShow;
SetLeftMargin();
CRichEditCtrl &SynCtrl = GetRichEditCtrl();
if(bShow)
SynCtrl.SetBackgroundColor(FALSE, m_clrLinNumberBkColor);
else
SynCtrl.SetBackgroundColor(FALSE, m_clrBkColor);
if(GetWrapMode()==WrapToWindow)
ResetParseCookie();
WriteSettings();
ShowWindow(SW_SHOW);
}
int CSynEditView::OnCreate( LPCREATESTRUCT lpCreateStruct )
{
if (CRichEditView::OnCreate(lpCreateStruct) == -1)
return -1;
GetRichEditCtrl().HideSelection(TRUE, FALSE);
return 0;
}
void CSynEditView::OnDestroy()
{
WriteSettings();
DeleteAllocString();
CRichEditView::OnDestroy();
}
LOGFONT CSynEditView::GetSynEditViewFont()
{
return m_lf;
}
void CSynEditView::ReadSettings()
{
CWinApp *app = AfxGetApp();
m_nWrapMode = app->GetProfileInt(_T("icrEdit_Values"), _T("m_nWrapMode"), WrapNone);
m_bShowLineNumber = app->GetProfileInt(_T("icrEdit_Values"), _T("m_bShowLineNumber"), TRUE);
m_bShowSelectLine = app->GetProfileInt(_T("icrEdit_Values"), _T("m_bShowSelectLine"), FALSE);
m_bShowUnderLine = app->GetProfileInt(_T("icrEdit_Values"), _T("m_bShowUnderLine"), FALSE);
m_bShowReturnLineToken = app->GetProfileInt(_T("icrEdit_Values"), _T("m_bShowReturnLineToken"), FALSE);
m_bShowCross = app->GetProfileInt(_T("icrEdit_Values"), _T("m_bShowCross"), FALSE);
m_bShowTab = app->GetProfileInt(_T("icrEdit_Values"), _T("m_bShowTabSpace"), FALSE);
m_nLanguage = app->GetProfileInt(_T("icrEdit_Values"), _T("m_nLanguage"), _CPP);
m_nTabSize = app->GetProfileInt(_T("icrEdit_Values"), _T("m_nTabSize"), 4);
m_bReadOnly = app->GetProfileInt(_T("icrEdit_Values"), _T("m_bReadOnly"), FALSE);
m_bAutoWordSelect = app->GetProfileInt(_T("icrEdit_Values"), _T("m_bAutoWordSelect"), FALSE);
m_nUndoLimits = app->GetProfileInt(_T("icrEdit_Values"), _T("m_nUndoLimits"), 100);
if(m_nUndoLimits<0)
m_nUndoLimits=0;
ReadColorInfo( m_nLanguage );
//设置icrEditor默认字体
m_lf.lfHeight = 0xfffffff4;
m_lf.lfWidth = 0;
m_lf.lfEscapement = 0;
m_lf.lfOrientation = 0;
m_lf.lfWeight = FW_NORMAL;
m_lf.lfItalic = 0;
m_lf.lfUnderline = 0;
m_lf.lfStrikeOut = 0;
m_lf.lfCharSet = ANSI_CHARSET;
m_lf.lfOutPrecision = 1;
m_lf.lfClipPrecision = 1;
m_lf.lfQuality = 2;
m_lf.lfPitchAndFamily = 0;
strcpy(m_lf.lfFaceName, _T("Courier New"));
m_lf.lfHeight = app->GetProfileInt(_T("icrEdit_Font"), _T("lfHeight"), m_lf.lfHeight);
m_lf.lfWeight = app->GetProfileInt(_T("icrEdit_Font"), _T("lfWeight"), m_lf.lfWeight);
m_lf.lfEscapement = app->GetProfileInt(_T("icrEdit_Font"), _T("lfEscapement"), m_lf.lfEscapement);
m_lf.lfOrientation = app->GetProfileInt(_T("icrEdit_Font"), _T("lfOrientation"), m_lf.lfOrientation);
m_lf.lfWeight = app->GetProfileInt(_T("icrEdit_Font"), _T("lfWeight"), m_lf.lfWeight);
m_lf.lfItalic = app->GetProfileInt(_T("icrEdit_Font"), _T("lfItalic"), m_lf.lfItalic);
m_lf.lfUnderline = app->GetProfileInt(_T("icrEdit_Font"), _T("lfUnderline"), m_lf.lfUnderline);
m_lf.lfStrikeOut = app->GetProfileInt(_T("icrEdit_Font"), _T("lfStrikeOut"), m_lf.lfStrikeOut);
m_lf.lfCharSet = app->GetProfileInt(_T("icrEdit_Font"), _T("lfCharSet"), m_lf.lfCharSet);
m_lf.lfOutPrecision = app->GetProfileInt(_T("icrEdit_Font"), _T("lfOutPrecision"), m_lf.lfOutPrecision);
m_lf.lfClipPrecision = app->GetProfileInt(_T("icrEdit_Font"), _T("lfClipPrecision"), m_lf.lfClipPrecision);
m_lf.lfQuality = app->GetProfileInt(_T("icrEdit_Font"), _T("lfQuality"), m_lf.lfQuality);
m_lf.lfPitchAndFamily = app->GetProfileInt(_T("icrEdit_Font"), _T("lfPitchAndFamily"), m_lf.lfPitchAndFamily);
CString strFaceName = app->GetProfileString(_T("icrEdit_Font"), _T("lfFaceName"), m_lf.lfFaceName);
strcpy(m_lf.lfFaceName, strFaceName);
}
void CSynEditView::WriteSettings()
{
CWinApp *app = AfxGetApp();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -