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

📄 syneditview.cpp

📁 VC++设计语法编辑器
💻 CPP
📖 第 1 页 / 共 4 页
字号:
		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 + -