📄 simpleeditview.cpp
字号:
// SimpleEditView.cpp : implementation of the CSimpleEditView class
//
#include "stdafx.h"
#include "SimpleEdit.h"
#include "SimpleEditDoc.h"
#include "SimpleEditView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSimpleEditView
IMPLEMENT_DYNCREATE(CSimpleEditView, CEditView)
BEGIN_MESSAGE_MAP(CSimpleEditView, CEditView)
//{{AFX_MSG_MAP(CSimpleEditView)
ON_COMMAND(ID_FILE_SAVE, OnFileSave)
ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
ON_COMMAND(ID_FORMAT_FONT, OnFormatFont)
ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
ON_WM_TIMER()
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_CHAR()
ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
//}}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()
/////////////////////////////////////////////////////////////////////////////
// CSimpleEditView construction/destruction
CSimpleEditView::CSimpleEditView()
{
// TODO: add construction code here
}
CSimpleEditView::~CSimpleEditView()
{
}
BOOL CSimpleEditView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
BOOL bPreCreated = CEditView::PreCreateWindow(cs);
cs.style &= ~(ES_AUTOHSCROLL|WS_HSCROLL); // Enable word-wrapping
return bPreCreated;
}
/////////////////////////////////////////////////////////////////////////////
// CSimpleEditView drawing
void CSimpleEditView::OnDraw(CDC* pDC)
{
CSimpleEditDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
}
/////////////////////////////////////////////////////////////////////////////
// CSimpleEditView printing
BOOL CSimpleEditView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default CEditView preparation
return CEditView::OnPreparePrinting(pInfo);
}
void CSimpleEditView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
// Default CEditView begin printing.
CEditView::OnBeginPrinting(pDC, pInfo);
}
void CSimpleEditView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)
{
// Default CEditView end printing
CEditView::OnEndPrinting(pDC, pInfo);
}
/////////////////////////////////////////////////////////////////////////////
// CSimpleEditView diagnostics
#ifdef _DEBUG
void CSimpleEditView::AssertValid() const
{
CEditView::AssertValid();
}
void CSimpleEditView::Dump(CDumpContext& dc) const
{
CEditView::Dump(dc);
}
CSimpleEditDoc* CSimpleEditView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSimpleEditDoc)));
return (CSimpleEditDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CSimpleEditView message handlers
void CSimpleEditView::OnFileSave()
{
CDocument * pDoc = GetDocument();
//如果文档没有被保存过,弹出保存对话框
if (pDoc->GetPathName() == "")
{
//定义打开对话框支持的扩展名
char szFilters[]= "Text Files (*.wzy)|*.wzy|All Files (*.*)|*.*||";
//初始化打开对话框
CFileDialog fileDlg (FALSE, "wzy", NULL, OFN_FILEMUSTEXIST| OFN_OVERWRITEPROMPT, szFilters, this);
//显示打开对话框,如果用户点击了确定按钮,打开文档
if( fileDlg.DoModal()==IDOK )
{
//设置文档的路径
pDoc->SetPathName(fileDlg.GetFileName());
//使用保存对话框中得到的文件名进行保存
pDoc->OnSaveDocument(fileDlg.GetFileName());
}
}
else
{
//使用文档路径进行保存
pDoc->OnSaveDocument(pDoc->GetPathName());
}
}
void CSimpleEditView::OnFileSaveAs()
{
CDocument * pDoc = GetDocument();
//定义打开对话框支持的扩展名
char szFilters[]= "Text Files (*.wzy)|*.wzy|All Files (*.*)|*.*||";
//初始化打开对话框
CFileDialog fileDlg (FALSE, "wzy", NULL, OFN_FILEMUSTEXIST| OFN_OVERWRITEPROMPT, szFilters, this);
//显示打开对话框,如果用户点击了确定按钮,打开文档
if( fileDlg.DoModal()==IDOK )
{
//设置文档的路径
pDoc->SetPathName(fileDlg.GetFileName());
//使用保存对话框中得到的文件名进行保存
pDoc->OnSaveDocument(fileDlg.GetFileName());
}
}
void CSimpleEditView::OnFormatFont()
{
LOGFONT lf;
//得到当前使用的字体
CFont *font = GetEditCtrl().GetFont();
//当前无字体,创建默认的字体
if(font==NULL)
{
font =new CFont;
font->CreatePointFont(120,"Fixedsys");
font->GetLogFont(&lf);
delete font;
}
else
{
font->GetLogFont(&lf);
}
//记录修改前的字体
LOGFONT lf_Temp;
lf_Temp.lfHeight = lf.lfHeight;
lf_Temp.lfWidth = lf.lfWidth;
lf_Temp.lfEscapement = lf.lfEscapement;
lf_Temp.lfOrientation = lf.lfOrientation;
lf_Temp.lfWeight = lf.lfWeight;
lf_Temp.lfItalic = lf.lfItalic;
lf_Temp.lfUnderline = lf.lfUnderline;
lf_Temp.lfStrikeOut = lf.lfStrikeOut;
lf_Temp.lfCharSet = lf.lfCharSet;
lf_Temp.lfOutPrecision = lf.lfOutPrecision;
lf_Temp.lfClipPrecision = lf.lfClipPrecision;
lf_Temp.lfQuality = lf.lfQuality;
lf_Temp.lfPitchAndFamily = lf.lfPitchAndFamily;
strcpy(lf_Temp.lfFaceName, lf.lfFaceName);
CUndoItem ui;
ui.LB = 1;
ui.lpData = &lf_Temp;
//使用当前字体初始化字体对话框
CFontDialog cf(&lf);
//如果用户点击了确定,则根据用户输入的字体设置当前字体。
if(cf.DoModal()==IDOK)
{
m_Font.DeleteObject();
m_Font.CreateFontIndirect(&lf);
SetFont(&m_Font);
//将修改前的字体压栈。
m_UndoStack.Push(&ui);
}
}
void CSimpleEditView::OnFileOpen()
{
//得到文档指针
CDocument * pDoc = GetDocument();
//定义打开对话框支持的扩展名
char szFilters[]= "Text Files (*.wzy)|*.wzy|All Files (*.*)|*.*||";
//初始化打开对话框
CFileDialog fileDlg (TRUE, "wzy", NULL, OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, szFilters, this);
//显示打开对话框,如果用户点击了确定按钮,打开文档
if( fileDlg.DoModal()==IDOK )
{
//打开之后需重设文档路径
pDoc->SetPathName(fileDlg.GetFileName());
//打开
pDoc->OnOpenDocument(fileDlg.GetFileName());
//清空m_UndoStack
m_UndoStack.Clear();
//重置m_PreText
GetWindowText(m_PreText);
}
}
void CSimpleEditView::OnEditUndo()
{
CUndoItem ui;
ui.lpData = NULL;
if (m_UndoStack.Pop(&ui))
{
//恢复文本
if (ui.LB == 0)
{
SetWindowText(LPTSTR(ui.lpData));
}
//恢复字体
else if (ui.LB == 1)
{
m_Font.DeleteObject();
m_Font.CreateFontIndirect((LOGFONT *)(ui.lpData));
SetFont(&m_Font);
delete ui.lpData;
}
if (m_UndoStack.IsEmpty())
GetWindowText(m_PreText);
}
}
void CSimpleEditView::OnTimer(UINT nIDEvent)
{
//只用m_IsChanged为true,即有改变发生才执行压栈
if ((nIDEvent == ID_TIMER_PUSHUNDO) && m_IsChanged)
{
//将m_PreText中的字符串压入堆栈。
CUndoItem ui;
ui.LB = 0;
ui.lpData = m_PreText.GetBuffer(m_PreText.GetLength());
m_UndoStack.Push(&ui);
m_PreText.ReleaseBuffer();
//重置m_PreText和m_IsChanged
GetWindowText(m_PreText);
m_IsChanged = false;
}
CEditView::OnTimer(nIDEvent);
}
int CSimpleEditView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CEditView::OnCreate(lpCreateStruct) == -1)
return -1;
SetTimer(ID_TIMER_PUSHUNDO, 500, NULL);
m_IsChanged = false;
m_PreText = "";
return 0;
}
void CSimpleEditView::OnDestroy()
{
CEditView::OnDestroy();
KillTimer(ID_TIMER_PUSHUNDO);
}
void CSimpleEditView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
m_IsChanged = true;
CEditView::OnChar(nChar, nRepCnt, nFlags);
}
void CSimpleEditView::OnUpdateEditUndo(CCmdUI* pCmdUI)
{
if (m_UndoStack.IsEmpty())
pCmdUI->Enable(FALSE);
else
pCmdUI->Enable(TRUE);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -