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

📄 miniwordview.cpp

📁 VC实现的简单文本编辑器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -