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

📄 hoteditview.cpp

📁 wenb ianji
💻 CPP
字号:
// HotEditView.cpp : implementation of the CHotEditView class
//

#include "stdafx.h"
#include "HotEdit.h"
#include "MainFrm.h"
#include "HotEditDoc.h"
#include "HotEditView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CHotEditView

IMPLEMENT_DYNCREATE(CHotEditView, CEditView)

BEGIN_MESSAGE_MAP(CHotEditView, CEditView)
	//{{AFX_MSG_MAP(CHotEditView)
	ON_WM_CREATE()
	ON_COMMAND(ID_CHOOSE_FONT, OnChooseFont)
	ON_COMMAND(ID_HOTEDITFONT, OnChooseFont)
	ON_COMMAND(ID_ZOOMIN, OnZoomIn)
	ON_COMMAND(ID_HOTEDITAMP, OnZoomIn)
	ON_COMMAND(ID_ZOOMOUT, OnZoomOut)
	ON_COMMAND(ID_HOTEDITDEC, OnZoomOut)
	ON_WM_PAINT()
	ON_COMMAND(ID_SHOW_LINENUM, OnShowLinenum)
	ON_COMMAND(ID_HOTEDITCOLUME, OnShowLinenum)
	ON_UPDATE_COMMAND_UI(ID_SHOW_LINENUM, OnUpdateShowLinenum)
	ON_CONTROL_REFLECT(EN_CHANGE, OnEditChange)
	ON_WM_LBUTTONDBLCLK()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_MOUSEMOVE()
	ON_COMMAND(ID_HOTEDITAMP, OnHoteditamp)
	ON_COMMAND(ID_HOTEDITCOLUME, OnHoteditcolume)
	ON_COMMAND(ID_HOTEDITDEC, OnHoteditdec)
	ON_COMMAND(ID_HOTEDITFONT, OnHoteditfont)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CEditView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CEditView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CEditView::OnFilePrintPreview)
END_MESSAGE_MAP()

BOOL CHotEditView::m_bWrapText;
/////////////////////////////////////////////////////////////////////////////
// CHotEditView construction/destruction


CHotEditView::CHotEditView()
{
	m_bShowLinenum=FALSE;
}

CHotEditView::~CHotEditView()
{
}

BOOL CHotEditView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	BOOL bPreCreated = CEditView::PreCreateWindow(cs);
	m_bLButtonDown=FALSE;//左键按下值初始化为0
	if(m_bWrapText)
		cs.style &= ~(ES_AUTOHSCROLL|WS_HSCROLL);	// 使其可自动换行

	return bPreCreated;
}

int CHotEditView::OnCreate(LPCREATESTRUCT lpcs)
{
	if (CEditView::OnCreate(lpcs) != 0)
		return -1;
	LOGFONT lf;
	GetEditCtrl().SetLimitText(10*1024*1024);
	::GetObject(GetStockObject(SYSTEM_FONT), sizeof(LOGFONT), &lf);
	m_font.DeleteObject();
	if (m_font.CreateFontIndirect(&lf))
	{
		CWaitCursor wait;
		SetFont(&m_font);//设字体
	}

	
	TEXTMETRIC tm;
	CDC * pDC=GetWindowDC();
	pDC->SelectObject(&m_font);
	pDC->GetTextMetrics(&tm);
	m_LineHeight=tm.tmHeight;        //行高设为字体高
	m_iNewRectWidth=m_LineHeight+35; //初始化行号背景块宽度
	return 0;
}
/////////////////////////////////////////////////////////////////////////////
// CHotEditView drawing

void CHotEditView::OnDraw(CDC* pDC)
{
	CHotEditDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CHotEditView printing

BOOL CHotEditView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default CEditView preparation
	return CEditView::OnPreparePrinting(pInfo);
}

void CHotEditView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
	// Default CEditView begin printing.
	CEditView::OnBeginPrinting(pDC, pInfo);
}

void CHotEditView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)
{
	// Default CEditView end printing
	CEditView::OnEndPrinting(pDC, pInfo);
}
/////////////////////////////////////////////////////////////////////////////
// CHotEditView diagnostics

#ifdef _DEBUG
void CHotEditView::AssertValid() const
{
	CEditView::AssertValid();
}

void CHotEditView::Dump(CDumpContext& dc) const
{
	CEditView::Dump(dc);
}

CHotEditDoc* CHotEditView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CHotEditDoc)));
	return (CHotEditDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CHotEditView message handlers

//初始时画左边行号背景块
void CHotEditView::OnPaint() 
{
	CEditView::OnPaint();

	if(m_bShowLinenum)//显隐行号控制
		PaintLeft();
}

//选择字体
void CHotEditView::OnChooseFont()
{
   // get current font description
   CFont* pFont = GetFont();
   LOGFONT lf;

   if (pFont != NULL)
	   pFont->GetObject(sizeof(LOGFONT), &lf);
   else
	   ::GetObject(GetStockObject(SYSTEM_FONT), sizeof(LOGFONT), &lf);

	CFontDialog dlg(&lf, CF_SCREENFONTS|CF_INITTOLOGFONTSTRUCT);
	if (dlg.DoModal() == IDOK)
	{
		// switch to new font.
		m_font.DeleteObject();
		if (m_font.CreateFontIndirect(&lf))
		{
			CWaitCursor wait;
			SetFont(&m_font);
			TEXTMETRIC tm;
			CDC * pDC=GetWindowDC();
			pDC->SelectObject(&m_font);
			pDC->GetTextMetrics(&tm);
			m_iNewRectWidth+=tm.tmHeight-m_LineHeight;
			m_LineHeight=tm.tmHeight;
			if(m_bShowLinenum)
				GetEditCtrl().SetMargins(m_iNewRectWidth,0);
		}
	}

}

static void ScaleLogFont(LPLOGFONT plf, const CDC& dcFrom, const CDC& dcTo)
	// helper to scale log font member from one DC to another!
{
	plf->lfHeight = MulDiv(plf->lfHeight,
		dcTo.GetDeviceCaps(LOGPIXELSY), dcFrom.GetDeviceCaps(LOGPIXELSY));
	plf->lfWidth = MulDiv(plf->lfWidth,
		dcTo.GetDeviceCaps(LOGPIXELSX), dcFrom.GetDeviceCaps(LOGPIXELSX));
}


//画左边的显示条等
void CHotEditView::PaintLeft()
{
	CBrush brushb(RGB(245,245,250));//设置背景色
	CDC* hdc = GetWindowDC();
	CRect rect;//定义矩形

	GetClientRect(&rect);
	hdc->FillRect (CRect(rect.left+2 ,rect.top+2 ,rect.left + m_iNewRectWidth + 1,rect.Height ()+2),&brushb);//画底色

	CEdit& theEdit = GetEditCtrl ();
	int nFirstVisible = theEdit.GetFirstVisibleLine();//得到当前显示的最上端的行号							//得到当前显示的最上端的行号

	int CurrentLine = nFirstVisible + 1,CurrentPoint;//初始化当前行值为首行
	CRect leftRect;
	CString strLine;

	hdc->SelectObject(&m_font);
	static BOOL bNeedWider=FALSE;
	static int iLastWiderLine;
	while(1)
	{	
		CurrentPoint = (CurrentLine - nFirstVisible - 1) * m_LineHeight + 2;
		if(CurrentLine > theEdit.GetLineCount())
		{
			if(CurrentLine<iLastWiderLine)
				bNeedWider=FALSE;//加宽命令初置为0
			break;
		}
		if(CurrentPoint <0 || CurrentPoint > (rect.bottom - m_LineHeight+1))
			break;
		leftRect.left = rect.left + 10;
		leftRect.top = CurrentPoint;
		leftRect.bottom = CurrentPoint + m_LineHeight;
		strLine.Format ("%d",CurrentLine);
		hdc->DrawText(strLine,&leftRect,DT_CALCRECT);//定义三个边界
		if(leftRect.right>m_iNewRectWidth || (m_iNewRectWidth>leftRect.right+35 && !bNeedWider))
		{
			if(leftRect.right>m_iNewRectWidth)
			{
				bNeedWider=TRUE;//需要加宽
				iLastWiderLine=CurrentLine;//记录加宽处的行值
			}
			m_iNewRectWidth=leftRect.right+35;
			theEdit.SetMargins(m_iNewRectWidth,0);
			leftRect.right = m_iNewRectWidth;//定义右边界
			hdc->FillRect (CRect(rect.left+2 ,rect.top+2 ,rect.left + m_iNewRectWidth + 1,rect.Height ()+2),&brushb);//画底色
			nFirstVisible = theEdit.GetFirstVisibleLine();
			CurrentLine = nFirstVisible + 1;
			continue;
		}
		leftRect.right = m_iNewRectWidth;
		hdc->SetBkColor(RGB(245,245,250));//设置行号输出块背景色
		hdc->DrawText(strLine,&leftRect,DT_CENTER|DT_NOCLIP);
		CurrentLine ++;//行号自加
	}
}

void CHotEditView::OnShowLinenum() //确定是否显隐行号
{
	m_bShowLinenum=!m_bShowLinenum;
	if(m_bShowLinenum)
		GetEditCtrl().SetMargins(m_iNewRectWidth,0);//正常宽度
	else
		GetEditCtrl().SetMargins(0,0);//宽度为0,即不显示行号
}

void CHotEditView::OnUpdateShowLinenum(CCmdUI* pCmdUI) 
{
	pCmdUI->SetCheck(m_bShowLinenum);
}

void CHotEditView::OnZoomIn()
{
	LOGFONT lf;
	m_font.GetLogFont(&lf);
	m_font.DeleteObject();
	lf.lfHeight+=lf.lfHeight<0?(-2):2;
	if (m_font.CreateFontIndirect(&lf))
	{
		CWaitCursor wait;
		SetFont(&m_font);
		TEXTMETRIC tm;
		CDC * pDC=GetWindowDC();
		pDC->SelectObject(&m_font);
		pDC->GetTextMetrics(&tm);
		m_iNewRectWidth+=tm.tmHeight-m_LineHeight;
		m_LineHeight=tm.tmHeight;
		if(m_bShowLinenum)
			GetEditCtrl().SetMargins(m_iNewRectWidth,0);
	}
}

void CHotEditView::OnZoomOut()
{
	LOGFONT lf;
	m_font.GetLogFont(&lf);
	m_font.DeleteObject();
	lf.lfHeight-=lf.lfHeight<0?(-2):2;
	if (m_font.CreateFontIndirect(&lf))
	{
		CWaitCursor wait;
		SetFont(&m_font);
		TEXTMETRIC tm;
		CDC * pDC=GetWindowDC();
		pDC->SelectObject(&m_font);
		pDC->GetTextMetrics(&tm);
		m_iNewRectWidth+=tm.tmHeight-m_LineHeight;
		m_LineHeight=tm.tmHeight;
		if(m_bShowLinenum)
			GetEditCtrl().SetMargins(m_iNewRectWidth,0);
	}
}


BOOL CHotEditView::OnEditChange() //在编辑窗口改变时重画
{
	if(m_bShowLinenum)//重画行号块
		PaintLeft();
	return CEditView::OnEditChange();
}

void CHotEditView::OnLButtonDblClk(UINT nFlags, CPoint point) // 在鼠标双击时重画
{	
	CEditView::OnLButtonDblClk(nFlags, point);
	if(m_bShowLinenum)
		PaintLeft();
}

void CHotEditView::OnLButtonDown(UINT nFlags, CPoint point) // 在鼠标按下时重画
{	
	CEditView::OnLButtonDown(nFlags, point);
	m_bLButtonDown=TRUE;//左键值置1
	if(m_bShowLinenum)
		PaintLeft();
}

void CHotEditView::OnLButtonUp(UINT nFlags, CPoint point)// 在鼠标弹起时重画 
{
	m_bLButtonDown=FALSE;
	CEditView::OnLButtonUp(nFlags, point);
}

void CHotEditView::OnMouseMove(UINT nFlags, CPoint point) //在鼠标移动时重画
{
	if(m_bLButtonDown && m_bShowLinenum)
		PaintLeft();
	CEditView::OnMouseMove(nFlags, point);
}

void CHotEditView::OnHoteditamp() 
{}

void CHotEditView::OnHoteditcolume() 
{}

void CHotEditView::OnHoteditdec() 
{}

void CHotEditView::OnHoteditfont() 
{}

⌨️ 快捷键说明

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