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

📄 ctext.cpp

📁 绘图软件
💻 CPP
字号:
#include"stdafx.h"
#include"CText.h"
#include "EastDrawView.h"
#include"TextEdit.h"
IMPLEMENT_SERIAL(CText,CUnit,1)
CText::CText()
{
 CUnit::Initial();
 m_Font=new CFont;
 m_Font->CreatePointFont (100,_T("Arial"));
 m_pTextEdit = new CTextEdit;
 m_HaveFinish=false;
}
CText::~CText()
{
delete m_Font;
delete m_pTextEdit;
}
void CText::Serialize(CArchive &ar)
{
	CUnit::Serialize(ar);
  
    LOGFONT m_lf; 
  
 	
if(ar.IsStoring())
   {
     m_Font->GetLogFont(&m_lf);

    ar<<m_Hight<<m_Width<<m_PositionPoint<<m_String;
	    ar<<m_lf.lfCharSet;
		ar<<m_lf.lfClipPrecision;
		ar<<m_lf.lfEscapement;
		ar<<m_lf.lfHeight;
		ar<<m_lf.lfItalic;
		ar<<m_lf.lfOrientation;
		ar<<m_lf.lfOutPrecision;
		ar<<m_lf.lfPitchAndFamily;
		ar<<m_lf.lfQuality;	
	    ar<<m_lf.lfWidth;
		ar<<m_lf.lfWeight;
		ar<<m_lf.lfUnderline;
		ar<<m_lf.lfStrikeOut;
        CString str=m_lf.lfFaceName;
        ar<<str;
   }
else
   {
       m_HaveFinish=true;
       ar>>m_Hight>>m_Width>>m_PositionPoint>>m_String;

	    ar>>m_lf.lfCharSet;
		ar>>m_lf.lfClipPrecision;
		ar>>m_lf.lfEscapement;
		ar>>m_lf.lfHeight;
		ar>>m_lf.lfItalic;
		ar>>m_lf.lfOrientation;
		ar>>m_lf.lfOutPrecision;
		ar>>m_lf.lfPitchAndFamily;
		ar>>m_lf.lfQuality;	
	    ar>>m_lf.lfWidth;
		ar>>m_lf.lfWeight;
		ar>>m_lf.lfUnderline;
		ar>>m_lf.lfStrikeOut;
		CString str;
		ar>>str;
		::lstrcpy(m_lf.lfFaceName,str);
		m_Font->DeleteObject();
		m_Font->CreateFontIndirect(&m_lf);

		m_bHaveCreat=false;
   }
}

void CText::OnLButtonDown(CDC *pDC, CEastDrawView *pView, CPoint point)
{
 if(pView->m_CurrentDrawStatus==Draw_Status)
 {
   if(pView->m_LBDownTimes==1&&!m_pTextEdit->m_IsMoving)
   {
	CPoint point1(10,10);
	CPoint point2(200,200);
	m_pTextEdit->Create(WS_VSCROLL|WS_HSCROLL|ES_MULTILINE | ES_WANTRETURN | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER,
    CRect(point1,point2), pView, 1);
	this->SetTextEditPosition(pDC,pView,point);
	m_pTextEdit->ShowWindow(true);
	pView->ShowFontBar(true);
	pView->SetBoxFont();
	
   }

  if(pView->m_LBDownTimes==2&&!m_pTextEdit->m_IsMoving)
  {
   pView->ShowFontBar(false);
   m_pTextEdit->UpdateData();
   m_pTextEdit->ShowWindow(false);
   m_HaveFinish=true; 
   m_pTextEdit->GetWindowText(m_String);
   pView->m_LBDownTimes=0;
   pView->ExchangeSave();
   
   
  if(this->m_DrawStatus==Change_Status)
   {
    this->m_DrawStatus=Draw_Status;
	pView->m_CurrentDrawStatus=Select_Status;
   }
   
   int nLineCount = m_pTextEdit->GetLineCount();
   CString strText;
   CFont *pOldFond=pDC->SelectObject(m_Font);
   int pOldBkMode=pDC->SetBkMode(this->m_BkMode);
   COLORREF oldBKColor=pDC->SetBkColor(this->m_BackgroundColor);
   COLORREF oldPenColor=pDC->SetTextColor(this->m_PenColor);
   CBrush brush;
   LOGBRUSH brushlog;
   brushlog.lbColor=m_BrushColor;
   brushlog.lbHatch=m_BrushHatch;
   brushlog.lbStyle=m_BrushStyle;
   brush.CreateBrushIndirect(&brushlog);
   CBrush*pOldBrush=pDC->SelectObject(&brush);
   TEXTMETRIC tm;
   pDC->GetTextMetrics(&tm);
   int maxLength=0;
   int maxLineLong;
   
  for(int i=0;i<nLineCount;i++)
  {
   maxLength=maxLength>m_pTextEdit->LineLength(m_pTextEdit->LineIndex(i))?maxLength:m_pTextEdit->LineLength(m_pTextEdit->LineIndex(i));
   m_pTextEdit->GetLine(0,strText.GetBuffer(m_pTextEdit->LineLength(m_pTextEdit->LineIndex(i))),m_pTextEdit->LineLength(m_pTextEdit->LineIndex(i)));
   
   strText.ReleaseBuffer();
   pDC->TextOut(m_PositionPoint.x,m_PositionPoint.y+i*(tm.tmHeight+tm.tmExternalLeading),strText.Left(m_pTextEdit->LineLength(m_pTextEdit->LineIndex(i))));
   
   strText.Empty();
   
  }
  
  this->m_Width=maxLength*(tm.tmMaxCharWidth);
  this->m_Hight=(nLineCount+1)*(tm.tmHeight+tm.tmExternalLeading);
  CRect rect;
  m_pTextEdit->GetWindowRect(&rect);
  m_Width=m_Width>rect.Width()?m_Width:rect.Width();
  m_Hight=m_Hight>rect.Height()?m_Hight:rect.Height();
   
   pDC->SetBkMode(pOldBkMode);
   pDC->SelectObject(pOldFond);
   pDC->SetBkColor(oldBKColor);
   pDC->SetTextColor(oldPenColor);
   pDC->SelectObject(pOldBrush);
  }
 if(pView->m_LBDownTimes==2&&m_pTextEdit->m_IsMoving)
 {
	pView->ShowFontBar(true);
	pView->m_LBDownTimes=1;

	pView->ExchangeSave();
    

	m_PositionPoint=point;
	m_pTextEdit->m_PositionPoint=point;
	CRect rect;
    m_pTextEdit->GetWindowRect(&rect);
    pDC->DPtoLP(&rect);
	pDC->DrawFocusRect(CRect(m_PositionPoint.x+1,m_PositionPoint.y+1,m_PositionPoint.x+rect.Width()-1,m_PositionPoint.y+rect.Height()-1));
	this->SetTextEditPosition(pDC,pView,m_PositionPoint);
	this->m_pTextEdit->m_IsMoving=false;
 }
 
}

 if(pView->m_CurrentDrawStatus==Change_Status)
 {
    pView->m_CurrentDrawStatus=Draw_Status;
	pView->m_LBDownTimes=1;
	
 }//********if(pView->m_CurrentDrawStatus==Exchange_Status)

 if(pView->m_CurrentDrawStatus==Select_Status)
 {
   if(IsOnMarginPoint(point))
   {
    if(m_HaveFindFirst)
    {
	 pView->ShowFontBar(true);
     this->m_HaveFindFirst=false;
	 pView->m_bHaveFindSecond=true;
     this->ShowSelectPoint(pDC);
	 CPoint point=m_PositionPoint;
	 pDC->LPtoDP(&point);
	 
      CRect rect;
      m_pTextEdit->GetWindowRect(&rect);
      m_Width=m_Width>rect.Width()?m_Width:rect.Width();
      m_Hight=m_Hight>rect.Height()?m_Hight:rect.Height();
	 this->m_pTextEdit->MoveWindow(point.x,point.y,m_Width,m_Hight);
     this->m_pTextEdit->ShowWindow(true);
	 this->m_pTextEdit->SetFont(m_Font);
	 pView->m_CurrentDrawTool=Text_Tool;
	 pView->m_CurrentDrawStatus=Change_Status;
	 pView->m_pCurrentUnit=this;
	 pView->m_LBDownTimes=0;
	 m_HaveFinish=false;
	 this->m_DrawStatus=Change_Status;
	 }
   }
    if(!pView->m_bHaveFindSecond&&IsInRgn(point))
	 
	{
	 if(!m_HaveFindFirst)
	 {
		 m_HaveFindFirst=true;
	     pView->m_bHaveFindFirst=true;
	     ShowSelectPoint(pDC);
	 }
	else
	{
	     m_HaveFindFirst=false;
	     pView->m_bHaveFindFirst=true;
	     ShowSelectPoint(pDC);
	}
	
	}
  }//******if(pView->m_CurrentDrawStatus==Select_Status)
 }


void CText::SetTextEditPosition(CDC *pDC, CEastDrawView *pView, CPoint point)
{
  CRect rect;
  m_pTextEdit->GetWindowRect(&rect);
  
 
 
  m_PositionPoint=point;
  m_pTextEdit->m_PositionPoint=point;
  this->m_Width=rect.Width();
  this->m_Hight=rect.Height();
  pDC->LPtoDP(&point);
  m_pTextEdit->m_PositionPoint=point;
  m_pTextEdit->MoveWindow(point.x,point.y,rect.Width(),rect.Height());
}

void CText::SetFont(ENUMLOGFONT *lpelf)
{
 m_pTextEdit->SetMyFont(m_Font);
}

void CText::ChangeFont(ENUMLOGFONT *lpelf)
{
 
 m_Font->DeleteObject();
 m_Font->CreateFontIndirect(&lpelf->elfLogFont);
 SetFont(lpelf);
}

void CText::ChangeFontSize(ENUMLOGFONT *lpelf)
{
 m_Font->DeleteObject();
 m_Font->CreateFontIndirect(&lpelf->elfLogFont);
 SetFont(lpelf);
}

void CText::DrawStatic(CDC *pDC)
{
 if(this->m_HaveFinish)
 {
  CMDIChildWnd*pChild=((CMDIFrameWnd*)AfxGetMainWnd())->MDIGetActive();
  CEastDrawView*pView=(CEastDrawView*)pChild->GetActiveView();
  if(!m_bHaveCreat)
  {
   m_pTextEdit->DestroyWindow();
   m_pTextEdit->Create(WS_VSCROLL|WS_HSCROLL|ES_MULTILINE | ES_WANTRETURN | WS_CHILD |WS_TABSTOP | WS_BORDER,
   CRect(m_PositionPoint,CPoint(m_PositionPoint.x+m_Width,m_PositionPoint.y+m_Hight)), pView, 1);
   m_bHaveCreat=true;
  }
 m_pTextEdit->SetWindowText(m_String);
 int nLineCount = m_pTextEdit->GetLineCount();
 CString strText;
 CFont *pOldFond=pDC->SelectObject(m_Font);
 int pOldBkMode=pDC->SetBkMode(this->m_BkMode);
 COLORREF oldBKColor=pDC->SetBkColor(this->m_BackgroundColor);
 COLORREF oldPenColor=pDC->SetTextColor(this->m_PenColor);
 CBrush brush;
 LOGBRUSH brushlog;
 brushlog.lbColor=m_BrushColor;
 brushlog.lbHatch=m_BrushHatch;
 brushlog.lbStyle=m_BrushStyle;
 brush.CreateBrushIndirect(&brushlog);
 CBrush*pOldBrush=pDC->SelectObject(&brush);

 TEXTMETRIC tm;
 pDC->GetTextMetrics(&tm);
 
 for(int i=0;i<nLineCount;i++)
  {
  m_pTextEdit->GetLine(i,strText.GetBuffer(m_pTextEdit->LineLength(m_pTextEdit->LineIndex(i))),m_pTextEdit->LineLength(m_pTextEdit->LineIndex(i)));
  strText.ReleaseBuffer();
  pDC->TextOut(m_PositionPoint.x,m_PositionPoint.y+i*(tm.tmHeight+tm.tmExternalLeading),strText.Left(m_pTextEdit->LineLength(m_pTextEdit->LineIndex(i))));
  strText.Empty();
  }
  pDC->SetBkMode(pOldBkMode);
  pDC->SelectObject(pOldFond);
  pDC->SetBkColor(oldBKColor);
  pDC->SetTextColor(oldPenColor);
  pDC->SelectObject(pOldBrush);
 }
 
}

void CText::OnMouseMove(CDC *pDC, CEastDrawView *pView, CPoint point)
{
  CRect rect;
  m_pTextEdit->GetWindowRect(&rect);
  pDC->DPtoLP(&rect);
  CPen pen;
  pen.CreatePen(PS_SOLID,2,RGB(255,0,0));
  CPen*pOldPen=pDC->SelectObject(&pen);
  if(m_pTextEdit->m_IsMoving)
  {
    //this->SetTextEditPosition(pDC,pView,point);
    //pDC->Rectangle(m_PositionPoint.x+1,m_PositionPoint.y+1,m_PositionPoint.x+rect.Width()-1,m_PositionPoint.y+rect.Height()-1);
    pDC->DrawFocusRect(CRect(m_PositionPoint.x+1,m_PositionPoint.y+1,m_PositionPoint.x+rect.Width()-1,m_PositionPoint.y+rect.Height()-1));
	  m_PositionPoint=point;
//	pDC->Rectangle(m_PositionPoint.x+1,m_PositionPoint.y+1,m_PositionPoint.x+rect.Width()-1,m_PositionPoint.y+rect.Height()-1);
   pDC->DrawFocusRect(CRect(m_PositionPoint.x+1,m_PositionPoint.y+1,m_PositionPoint.x+rect.Width()-1,m_PositionPoint.y+rect.Height()-1));
  }
  pDC->SelectObject(pOldPen);
}

void CText::OnMenuitemOk(CDC *pDC, CEastDrawView *pView)
{
  if(m_pTextEdit->m_IsMoving)
  {
    CRect rect;
    m_pTextEdit->GetWindowRect(&rect);
    pDC->DPtoLP(&rect);
	pDC->DrawFocusRect(CRect(m_PositionPoint.x+1,m_PositionPoint.y+1,m_PositionPoint.x+rect.Width()-1,m_PositionPoint.y+rect.Height()-1));
	SetTextEditPosition(pDC,pView,m_PositionPoint);
	m_pTextEdit->m_IsMoving=false;
  }

}

BOOL CText::IsInRgn(CPoint point)
{
CRect rect1;
CRect rect2;
rect1.SetRect(m_PositionPoint.x-5,m_PositionPoint.y-5,m_PositionPoint.x+m_Width+5,m_PositionPoint.y+m_Hight+5);
rect2.SetRect(m_PositionPoint.x+10,m_PositionPoint.y+10,m_PositionPoint.x+m_Width-10,m_PositionPoint.y+m_Hight-10);
return rect1.PtInRect(point)&&!rect2.PtInRect(point);
}

int CText::IsOnMarginPoint(CPoint point)
{
CRect rect1;
CRect rect2;
rect1.SetRect(m_PositionPoint.x-3,m_PositionPoint.y-3,m_PositionPoint.x+m_Width+3,m_PositionPoint.y+m_Hight+3);
rect2.SetRect(m_PositionPoint.x+3,m_PositionPoint.y+3,m_PositionPoint.x+m_Width-3,m_PositionPoint.y+m_Hight-3);
if(rect1.PtInRect(point)&&!rect2.PtInRect(point))
return 1;
return 0;

}

void CText::ShowSelectPoint(CDC *pDC)
{

CPen m_pen;
m_pen.CreatePen(PS_SOLID,1,RGB(0,0,255));
CPen *OldPen=pDC->SelectObject(&m_pen);
int oldBkMode=pDC->SetBkMode(TRANSPARENT);
int OldRop=pDC->SetROP2(R2_NOTXORPEN);   

CRect rect;
rect.SetRect(m_PositionPoint.x,m_PositionPoint.y,m_PositionPoint.x+m_Width,m_PositionPoint.y+m_Hight);

pDC->Rectangle(rect);
pDC->SelectObject(OldPen);
pDC->SetBkMode(oldBkMode);
pDC->SetROP2(OldRop);

}

⌨️ 快捷键说明

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