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

📄 ccrystaltextview.cpp

📁 一个完整的编辑器的代码(很值得参考
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	}
	else
		DrawScreenLine(
		pdc, origin, rc,
		pBuf, nBlocks, nActualItem,
		crText, crBkgnd, bDrawWhitespace,
		pszChars, 0, nLength, CPoint(0, nLineIndex));

	//	Draw whitespaces to the left of the text
	//BEGIN SW
	// Drawing is now realized by DrawScreenLine()
	/*ORIGINAL
	CRect frect = rc;
	if (origin.x > frect.left)
		frect.left = origin.x;
	if (frect.right > frect.left)
	{
		if ((m_bFocused || m_bShowInactiveSelection) && IsInsideSelBlock(CPoint(nLength, nLineIndex)))
		{
			pdc->FillSolidRect(frect.left, frect.top, GetCharWidth(), frect.Height(),
												GetColor(COLORINDEX_SELBKGND));
			frect.left += GetCharWidth();
		}
		if (frect.right > frect.left)
			pdc->FillSolidRect(frect, bDrawWhitespace ? crBkgnd : GetColor(COLORINDEX_WHITESPACE));
	}
	*/
	//END SW
}

COLORREF CCrystalTextView::
GetColor (int nColorIndex)
{
  switch (nColorIndex)
    {
    case COLORINDEX_WHITESPACE :
    case COLORINDEX_BKGND:
      return::GetSysColor (COLOR_WINDOW);
    case COLORINDEX_NORMALTEXT:
      return::GetSysColor (COLOR_WINDOWTEXT);
    case COLORINDEX_SELMARGIN:
      return::GetSysColor (COLOR_SCROLLBAR);
    case COLORINDEX_PREPROCESSOR:
      return RGB (0, 128, 192);
    case COLORINDEX_COMMENT:
      //      return RGB(128, 128, 128);
      return RGB (0, 128, 0);
      //  [JRT]: Enabled Support For Numbers...
    case COLORINDEX_NUMBER:
      //      return RGB(0x80, 0x00, 0x00);
      return RGB (0xff, 0x00, 0x00);
      //  [JRT]: Support For C/C++ Operators
    case COLORINDEX_OPERATOR:
      //      return RGB(0x00, 0x00, 0x00);
      return RGB (96, 96, 96);
    case COLORINDEX_KEYWORD:
      return RGB (0, 0, 255);
    case COLORINDEX_FUNCNAME:
      return RGB (128, 0, 128);
    case COLORINDEX_USER1:
      return RGB (0, 0, 128);
    case COLORINDEX_USER2:
      return RGB (0, 128, 192);
    case COLORINDEX_SELBKGND:
      return RGB (0, 0, 0);
    case COLORINDEX_SELTEXT:
      return RGB (255, 255, 255);
    }
  //  return RGB(255, 0, 0);
  return RGB (128, 0, 0);
}

DWORD CCrystalTextView::
GetLineFlags (int nLineIndex)
{
  if (m_pTextBuffer == NULL)
    return 0;
  return m_pTextBuffer->GetLineFlags (nLineIndex);
}

void CCrystalTextView::
DrawMargin (CDC * pdc, const CRect & rect, int nLineIndex)
{
  if (!m_bSelMargin)
    {
      pdc->FillSolidRect (rect, GetColor (COLORINDEX_BKGND));
      return;
    }

  pdc->FillSolidRect (rect, GetColor (COLORINDEX_SELMARGIN));

  int nImageIndex = -1;
  if (nLineIndex >= 0)
    {
      DWORD dwLineFlags = GetLineFlags (nLineIndex);
      static const DWORD adwFlags[] =
        {
          LF_EXECUTION,
          LF_BREAKPOINT,
          LF_COMPILATION_ERROR,
          LF_BOOKMARK (1),
          LF_BOOKMARK (2),
          LF_BOOKMARK (3),
          LF_BOOKMARK (4),
          LF_BOOKMARK (5),
          LF_BOOKMARK (6),
          LF_BOOKMARK (7),
          LF_BOOKMARK (8),
          LF_BOOKMARK (9),
          LF_BOOKMARK (0),
          LF_BOOKMARKS,
          LF_INVALID_BREAKPOINT
        };
      for (int I = 0; I <= sizeof (adwFlags) / sizeof (adwFlags[0]); I++)
        {
          if ((dwLineFlags & adwFlags[I]) != 0)
            {
              nImageIndex = I;
              break;
            }
        }
    }

  if (nImageIndex >= 0)
    {
      if (m_pIcons == NULL)
        {
          m_pIcons = new CImageList;
          VERIFY (m_pIcons->Create (IDR_MARGIN_ICONS, 16, 16, RGB (255, 255, 255)));
        }
		//BEGIN SW
		CPoint pt(rect.left + 2, rect.top + (GetLineHeight() - 16) / 2);
		/*ORIGINAL
		CPoint pt(rect.left + 2, rect.top + (rect.Height() - 16) / 2);
		*///END SW
		VERIFY(m_pIcons->Draw(pdc, nImageIndex, pt, ILD_TRANSPARENT));
      VERIFY (m_pIcons->Draw (pdc, nImageIndex, pt, ILD_TRANSPARENT));
    }
}

BOOL CCrystalTextView::
IsInsideSelBlock (CPoint ptTextPos)
{
  ASSERT_VALIDTEXTPOS (ptTextPos);
  if (ptTextPos.y < m_ptDrawSelStart.y)
    return FALSE;
  if (ptTextPos.y > m_ptDrawSelEnd.y)
    return FALSE;
  if (ptTextPos.y < m_ptDrawSelEnd.y && ptTextPos.y > m_ptDrawSelStart.y)
    return TRUE;
  if (m_ptDrawSelStart.y < m_ptDrawSelEnd.y)
    {
      if (ptTextPos.y == m_ptDrawSelEnd.y)
        return ptTextPos.x < m_ptDrawSelEnd.x;
      ASSERT (ptTextPos.y == m_ptDrawSelStart.y);
      return ptTextPos.x >= m_ptDrawSelStart.x;
    }
  ASSERT (m_ptDrawSelStart.y == m_ptDrawSelEnd.y);
  return ptTextPos.x >= m_ptDrawSelStart.x && ptTextPos.x < m_ptDrawSelEnd.x;
}

BOOL CCrystalTextView::
IsInsideSelection (const CPoint & ptTextPos)
{
  PrepareSelBounds ();
  return IsInsideSelBlock (ptTextPos);
}

void CCrystalTextView::
PrepareSelBounds ()
{
  if (m_ptSelStart.y < m_ptSelEnd.y ||
        (m_ptSelStart.y == m_ptSelEnd.y && m_ptSelStart.x < m_ptSelEnd.x))
    {
      m_ptDrawSelStart = m_ptSelStart;
      m_ptDrawSelEnd = m_ptSelEnd;
    }
  else
    {
      m_ptDrawSelStart = m_ptSelEnd;
      m_ptDrawSelEnd = m_ptSelStart;
    }
}

void CCrystalTextView::
OnDraw (CDC * pdc)
{
  CRect rcClient;
  GetClientRect (rcClient);

  int nLineCount = GetLineCount ();
  int nLineHeight = GetLineHeight ();
  PrepareSelBounds ();

  CDC cacheDC;
  VERIFY (cacheDC.CreateCompatibleDC (pdc));
  if (m_pCacheBitmap == NULL)
    {
      m_pCacheBitmap = new CBitmap;
		//BEGIN SW
		VERIFY(m_pCacheBitmap->CreateCompatibleBitmap(pdc, rcClient.Width(), rcClient.Height()));
		/*ORIGINAL
		VERIFY(m_pCacheBitmap->CreateCompatibleBitmap(pdc, rcClient.Width(), nLineHeight));
		*/
		//END SW
    }
  CBitmap *pOldBitmap = cacheDC.SelectObject (m_pCacheBitmap);

  CRect rcLine;
  rcLine = rcClient;
  rcLine.bottom = rcLine.top + nLineHeight;
  CRect rcCacheMargin (0, 0, GetMarginWidth (), nLineHeight);
  CRect rcCacheLine (GetMarginWidth (), 0, rcLine.Width (), nLineHeight);
	//BEGIN SW
	// initialize rects
	int		nSubLineOffset = GetSubLineIndex( m_nTopLine ) - m_nTopSubLine;
	if( nSubLineOffset < 0 )
	{
		rcCacheMargin.OffsetRect( 0, nSubLineOffset * nLineHeight );
		rcCacheLine.OffsetRect( 0, nSubLineOffset * nLineHeight );
	}

	int		nBreaks;
	int		nMaxLineChars = GetScreenChars();
	//END SW

  int nCurrentLine = m_nTopLine;
  while (rcLine.top < rcClient.bottom)
    {
		//BEGIN SW
		nBreaks = 0;
		if( nCurrentLine < nLineCount /*&& GetLineLength( nCurrentLine ) > nMaxLineChars*/ )
			WrapLineCached( nCurrentLine, nMaxLineChars, NULL, nBreaks );

		rcLine.bottom = rcLine.top + (nBreaks + 1) * nLineHeight;
		rcCacheLine.bottom = rcCacheLine.top + rcLine.Height();
		rcCacheMargin.bottom = rcCacheMargin.top + rcLine.Height();

		if( rcCacheLine.top < 0 )
			rcLine.bottom+= rcCacheLine.top;
		//END SW
      if (nCurrentLine < nLineCount)
        {
          DrawMargin (&cacheDC, rcCacheMargin, nCurrentLine);
          DrawSingleLine (&cacheDC, rcCacheLine, nCurrentLine);
        }
      else
        {
          DrawMargin (&cacheDC, rcCacheMargin, -1);
          DrawSingleLine (&cacheDC, rcCacheLine, -1);
        }

      VERIFY (pdc->BitBlt (rcLine.left, rcLine.top, rcLine.Width (), rcLine.Height (), &cacheDC, 0, 0, SRCCOPY));

      nCurrentLine++;
		//BEGIN SW
		rcLine.top = rcLine.bottom;
		rcCacheLine.top = 0;
		rcCacheMargin.top = 0;
		/*ORIGINAL
		rcLine.OffsetRect(0, nLineHeight);
		*/
		//END SW
    }

  cacheDC.SelectObject (pOldBitmap);
  cacheDC.DeleteDC ();
}

void CCrystalTextView::
ResetView ()
{
  // m_bWordWrap = FALSE;
  m_nTopLine = 0;
  m_nOffsetChar = 0;
  m_nLineHeight = -1;
  m_nCharWidth = -1;
  m_nTabSize = 4;
  m_nMaxLineLength = -1;
  m_nScreenLines = -1;
  m_nScreenChars = -1;
  m_nIdealCharPos = -1;
  m_ptAnchor.x = 0;
  m_ptAnchor.y = 0;
  if (m_pIcons != NULL)
    {
      delete m_pIcons;
      m_pIcons = NULL;
    }
  for (int I = 0; I < 4; I++)
    {
      if (m_apFonts[I] != NULL)
        {
          m_apFonts[I]->DeleteObject ();
          delete m_apFonts[I];
          m_apFonts[I] = NULL;
        }
    }
  if (m_pdwParseCookies != NULL)
    {
      delete m_pdwParseCookies;
      m_pdwParseCookies = NULL;
    }
  if (m_pnActualLineLength != NULL)
    {
      delete m_pnActualLineLength;
      m_pnActualLineLength = NULL;
    }
  m_nParseArraySize = 0;
  m_nActualLengthArraySize = 0;
  m_ptCursorPos.x = 0;
  m_ptCursorPos.y = 0;
  m_ptSelStart = m_ptSelEnd = m_ptCursorPos;
  m_bDragSelection = FALSE;
  m_bVertScrollBarLocked = FALSE;
  m_bHorzScrollBarLocked = FALSE;
  if (::IsWindow (m_hWnd))
    UpdateCaret ();
  m_bLastSearch = FALSE;
  m_bShowInactiveSelection = TRUE; // FP: reverted because I like it
  m_bPrintHeader = FALSE;
  m_bPrintFooter = TRUE;

  m_bBookmarkExist = FALSE;     // More bookmarks

  m_bMultipleSearch = FALSE;    // More search

}

void CCrystalTextView::
UpdateCaret ()
{
  ASSERT_VALIDTEXTPOS (m_ptCursorPos);
  if (m_bFocused && !m_bCursorHidden &&
        CalculateActualOffset (m_ptCursorPos.y, m_ptCursorPos.x) >= m_nOffsetChar)
    {
      CreateSolidCaret (2, GetLineHeight ());
      SetCaretPos (TextToClient (m_ptCursorPos));
      ShowCaret ();
    }
  else
    {
      HideCaret ();
    }
}

int CCrystalTextView::
GetCRLFMode ()
{
  if (m_pTextBuffer)
    {
      return m_pTextBuffer->GetCRLFMode ();
    }
  return -1;
}

void CCrystalTextView::
SetCRLFMode (int nCRLFMode)
{
  if (m_pTextBuffer)
    {
      m_pTextBuffer->SetCRLFMode (nCRLFMode);
    }
}

int CCrystalTextView::
GetTabSize ()
{
  ASSERT (m_nTabSize >= 0 && m_nTabSize <= 64);
  return m_nTabSize;
}

void CCrystalTextView::
SetTabSize (int nTabSize)
{
  ASSERT (nTabSize >= 0 && nTabSize <= 64);
  if (m_nTabSize != nTabSize)
    {
      m_nTabSize = nTabSize;
      if (m_pnActualLineLength != NULL)
        {
          delete m_pnActualLineLength;
          m_pnActualLineLength = NULL;
        }
      m_nActualLengthArraySize = 0;
      m_nMaxLineLength = -1;
      RecalcHorzScrollBar ();
      Invalidate ();
      UpdateCaret ();
    }
}

CFont *CCrystalTextView::
GetFont (BOOL bItalic /*= FALSE*/ , BOOL bBold /*= FALSE*/ )
{
  int nIndex = 0;
  if (bBold)
    nIndex |= 1;
  if (bItalic)
    nIndex |= 2;

  if (m_apFonts[nIndex] == NULL)
    {
      m_apFonts[nIndex] = new CFont;
      if (!m_lfBaseFont.lfHeight)
        {
          CClientDC dc (GetDesktopWindow ());
          m_lfBaseFont.lfHeight = -MulDiv (11, dc.GetDeviceCaps (LOGPIXELSY), 72);
        }
      m_lfBaseFont.lfWeight = bBold && !_tcsnicmp (m_lfBaseFont.lfFaceName, _T ("Courier"), 7) ? FW_BOLD : FW_NORMAL;
      m_lfBaseFont.lfItalic = (BYTE) (bItalic && !_tcsnicmp (m_lfBaseFont.lfFaceName, _T ("Courier"), 7));
      if (!m_apFonts[nIndex]->CreateFontIndirect (&m_lfBaseFont))
        {
          delete m_apFonts[nIndex];
          m_apFonts[nIndex] = NULL;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -