📄 miniwordview.cpp
字号:
// MiniwordView.cpp : implementation of the CMiniwordView class
//
#include "stdafx.h"
#include "Miniword.h"
#include "MiniwordDoc.h"
#include "MiniwordView.h"
#include "StructWord.h"//添加自定义的头文件
#include"Search.h"
#include"REPLACE.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
CString Chosen;
CString Copyed;
int MouseDown=0;
/////////////////////////////////////////////////////////////////////////////
// CMiniwordView
IMPLEMENT_DYNCREATE(CMiniwordView, CScrollView)
BEGIN_MESSAGE_MAP(CMiniwordView, CScrollView)
//{{AFX_MSG_MAP(CMiniwordView)
ON_WM_CREATE()
ON_WM_CHAR()
ON_WM_LBUTTONDOWN()
ON_WM_CANCELMODE()
ON_WM_KEYUP()
ON_WM_LBUTTONUP()
ON_WM_CAPTURECHANGED()
ON_COMMAND(IDM_SEARCH, OnSearch)
ON_COMMAND(ID_FILE_NEW, OnFileNew)
ON_COMMAND(IDM_REPLACE, OnReplace)
ON_WM_MOUSEMOVE()
ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
ON_COMMAND(ID_EDIT_CUT, OnEditCut)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMiniwordView construction/destruction
CMiniwordView::CMiniwordView()
{
// TODO: add construction code here
m_ptOrigin=0;
First=new word;
First->downlink=NULL;
First->words.Empty();
current=First;
buffer1.Empty();
}
CMiniwordView::~CMiniwordView()
{
}
BOOL CMiniwordView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CScrollView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CMiniwordView drawing
void CMiniwordView::OnDraw(CDC* pDC)
{
CMiniwordDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
CClientDC dc(this);
TEXTMETRIC tc;
dc.GetTextMetrics(&tc);
OnPrepareDC(&dc);
word* temp;
temp=First;
int x=0,y=0;
while(temp!=NULL){//重绘
for(x=0;x<=temp->words.GetLength()-1;x++)
dc.TextOut(x*tc.tmMaxCharWidth,y*tc.tmHeight,temp->words.GetAt(x));
y++;
temp=temp->downlink;
}
CreateSolidCaret(tc.tmAveCharWidth/8,tc.tmHeight);
ShowCaret();
}
/////////////////////////////////////////////////////////////////////////////
// CMiniwordView printing
BOOL CMiniwordView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CMiniwordView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CMiniwordView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CMiniwordView diagnostics
#ifdef _DEBUG
void CMiniwordView::AssertValid() const
{
CScrollView::AssertValid();
}
void CMiniwordView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CMiniwordDoc* CMiniwordView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMiniwordDoc)));
return (CMiniwordDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CMiniwordView message handlers
int CMiniwordView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CScrollView::OnCreate(lpCreateStruct) == -1)
return -1;
CClientDC dc(this);
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
// TODO: Add your specialized creation code here
CreateSolidCaret(tm.tmAveCharWidth/8,tm.tmHeight);//创建插入符
ShowCaret();//显示插入符
return 0;
}
void CMiniwordView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
SetCaretPos(m_ptOrigin);//将插入符放到m_ptOrigin位置处
CClientDC dc(this);
TEXTMETRIC tb;
dc.GetTextMetrics(&tb);
OnPrepareDC(&dc);
if(0x0d==nChar){//响应回车键(应该分成四种情况:是否本行末尾和是否尾行)
if(current->downlink==NULL&&(m_ptOrigin.x%tb.tmMaxCharWidth)>current->words.GetLength()){//尾行末尾
word* temp=new word;//创建新行并加到尾行后
temp->words.Empty();
temp->downlink=NULL;
current->downlink=temp;
current=temp;
m_ptOrigin.x=0;
m_ptOrigin.y+=tb.tmHeight;//插入符位置换行
SetCaretPos(m_ptOrigin);
}
else if(current->downlink==NULL&&(m_ptOrigin.x%tb.tmMaxCharWidth)<=current->words.GetLength()){//尾行非末尾
word* temp=new word;
int i;
temp->words.Empty();//建立新行
temp->words=buffer1;//将buffer1中缓存的数据给新行
temp->downlink=NULL;
current->downlink=temp;
current=temp;
buffer1.Empty();//缓冲清零
COLORREF clr=dc.SetTextColor(dc.GetBkColor());//设置字体色为背景色
for(i=0;i<=current->words.GetLength();i++){
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y," "); //用空格覆盖原字符
m_ptOrigin.x+=tb.tmMaxCharWidth;
}
dc.SetTextColor(clr);//回复字体色
m_ptOrigin.x=0;
m_ptOrigin.y+=tb.tmHeight;//插入符换行
for(i=0;i<=temp->words.GetLength()-1;i++){//在新行输出换行前插入符之后的字符
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y,temp->words.GetAt(i));
m_ptOrigin.x+=tb.tmMaxCharWidth;
}
m_ptOrigin.x=0;
SetCaretPos(m_ptOrigin);
}
else {//非尾行
word* temp4=new word;
int i,w=1;
temp4->downlink=current->downlink;
current->downlink=temp4;
for(i=0;i<=buffer1.GetLength()-1;i++)//将回车时所在行光标后的字符抹掉
dc.TextOut(m_ptOrigin.x+i*tb.tmMaxCharWidth,m_ptOrigin.y," ");
temp4->words=buffer1;
current=temp4;
buffer1.Empty();
m_ptOrigin.x=0;
m_ptOrigin.y+=tb.tmHeight;
for(i=0;i<=temp4->downlink->words.GetLength();i++)//将回车后光标所在行全部字符抹掉
dc.TextOut(m_ptOrigin.x+(i-1)*tb.tmMaxCharWidth,m_ptOrigin.y," ");
for(i=1;i<=temp4->words.GetLength();i++)//在回车后光标所在行输出buffer1
dc.TextOut(m_ptOrigin.x+(i-1)*tb.tmMaxCharWidth,m_ptOrigin.y,temp4->words.GetAt(i-1));
while(temp4->downlink!=NULL){//输出下移的各行
for(i=0;i<=1024;i++)
dc.TextOut(m_ptOrigin.x+(i-1)*tb.tmMaxCharWidth,m_ptOrigin.y+w*tb.tmHeight," ");
for(i=0;i<=temp4->downlink->words.GetLength()-1;i++)//输出下移的各行
dc.TextOut(m_ptOrigin.x+(i-1)*tb.tmMaxCharWidth,m_ptOrigin.y+w*tb.tmHeight,temp4->downlink->words.GetAt(i));
w++;
temp4=temp4->downlink;
}
SetCaretPos(m_ptOrigin);
}
buffer1=current->words;//将插入符之后内容赋值给缓存器buffer1
BufferSignal1=1;//缓存标识符置为1
}
else if(0x08==nChar){//响应backspace
SetCaretPos(m_ptOrigin);
COLORREF clr=dc.SetTextColor(dc.GetBkColor());//设置字体色为背景色
HideCaret();//隐藏光标,以免留下光标的痕迹
m_ptOrigin.x=m_ptOrigin.x-tb.tmMaxCharWidth;//存储光标的数据减小
if(m_ptOrigin.x>=0&&buffer1.IsEmpty()){//如果当前光标位置为本行末尾
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y," ");//输出空格覆盖要删的字符
current->words=current->words.Left(current->words.GetLength()-1);//从存储结构中删去字符
dc.SetTextColor(clr);//回复字体色
}
else if(m_ptOrigin.x>=0&&!buffer1.IsEmpty()){//如果光标位置为某行中间位置
int q;
for(q=1;q<=buffer1.GetLength()+1;q++){//覆盖光标后的位置
dc.TextOut(m_ptOrigin.x,m_ptOrigin.y," ");
m_ptOrigin.x+=tb.tmMaxCharWidth;
}
m_ptOrigin.x-=tb.tmMaxCharWidth*(buffer1.GetLength()+1);
dc.SetTextColor(clr);//回复字体色
for(q=0;q<=buffer1.GetLength()-1;q++){//输出buffer1中的字符
dc.TextOut(m_ptOrigin.x+q*tb.tmMaxCharWidth,m_ptOrigin.y,buffer1.GetAt(q));
}
current->words=current->words.Left(current->words.GetLength()-1);
}
else if(m_ptOrigin.x<0&&m_ptOrigin.y!=0&&!buffer1.IsEmpty()){//当buffer1不为空且删除至某行开头时(buffer1)
word* storer;//定义一个暂存器存储current的位置
m_ptOrigin.y-=tb.tmHeight;
word* temp14;
temp14=First;
int p,i=1;
for(p=0;p<m_ptOrigin.y/tb.tmHeight;p++){
temp14=temp14->downlink;//将current遍历到插入符所在位置
}
current=temp14;
m_ptOrigin.x=tb.tmMaxCharWidth*current->words.GetLength();
SetCaretPos(m_ptOrigin);//改变m_ptOrigin存储的插入符位置
dc.SetTextColor(clr);//回复字体色
for(p=0;p<=buffer1.GetLength()-1;p++)
dc.TextOut(m_ptOrigin.x+(p*tb.tmMaxCharWidth),m_ptOrigin.y,buffer1.GetAt(p));//输出退行前插入符后面的内容
storer=current;//存储current位置
current=current->downlink;
while(current->downlink!=NULL){//将后面各行退行
for(p=0;p<=1024;p++)
dc.TextOut(p*tb.tmMaxCharWidth,m_ptOrigin.y+i*tb.tmHeight," ");//先输出空格覆盖
current=current->downlink;
for(p=0;p<=current->words.GetLength()-1;p++)//在输出字符
dc.TextOut(p*tb.tmMaxCharWidth,m_ptOrigin.y+i*tb.tmHeight,current->words.GetAt(p));
i++;
}
for(p=0;p<=1024;p++)//用空格覆盖最后一行字符
dc.TextOut(p*tb.tmMaxCharWidth,m_ptOrigin.y+i*tb.tmHeight," ");
word* temp6;
temp6=First;
while(temp6->downlink!=current)
temp6=temp6->downlink;
temp6->downlink=NULL;//遍历将最后一行置为空
current=storer;//将current恢复为已存储的那行
BufferSignal1=1;//缓存标识符置为1
}
else if(m_ptOrigin.x<0&&m_ptOrigin.y!=0&&buffer1.IsEmpty()){//如果buffer1为空且到达某行的开头则退行
word* storer1;
m_ptOrigin.y-=tb.tmHeight;
int j,p;
word* temp2;
temp2=First;
SetCaretPos(m_ptOrigin);
dc.SetTextColor(clr);//回复字体色
for(j=0;j<m_ptOrigin.y/tb.tmHeight;j++)//遍历到要退行的位置
temp2=temp2->downlink;
if(temp2->downlink->downlink!=NULL)//将该行删去
temp2->downlink=temp2->downlink->downlink;
current=temp2;
storer1=current;
j=1;
while(current->downlink!=NULL){//将后面各行退行
for(p=0;p<=1024;p++)//还是先输出空格覆盖
dc.TextOut(p*tb.tmMaxCharWidth,m_ptOrigin.y+j*tb.tmHeight," ");
current=current->downlink;
for(p=0;p<=current->words.GetLength()-1;p++)//再输出字符
dc.TextOut(p*tb.tmMaxCharWidth,m_ptOrigin.y+j*tb.tmHeight,current->words.GetAt(p));
j++;
}
for(p=0;p<=1024;p++)//用空格覆盖最后一行
dc.TextOut(p*tb.tmMaxCharWidth,m_ptOrigin.y+j*tb.tmHeight," ");
j=temp2->words.GetLength();
m_ptOrigin.x=tb.tmMaxCharWidth*j;
current=storer1;
}
if(m_ptOrigin.x<=0&&m_ptOrigin.y==0){//当删除至坐标(0,0)时
m_ptOrigin.x=0;
m_ptOrigin.y=0;
First->words.Empty();//清空第一行内容
}
ShowCaret();//显示光标
SetCaretPos(m_ptOrigin);//将光标前移
}
else{//响应普通字符输入
COLORREF clr;//设置字体色为背景色
if(BufferSignal1==1&&!buffer1.IsEmpty())
current->words.Insert(0,nChar);//将输入字符加到字符串前面
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -