📄 hoteditview.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 + -