You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
448 lines
11 KiB
C++
448 lines
11 KiB
C++
#include "StdAfx.h"
|
|
#include "itemtext.h"
|
|
#include "SigmaDoc.h"
|
|
#include "SigmaView.h"
|
|
#include "DCHelp.h"
|
|
//#include ".\actionmodifieditem.h"
|
|
//#include "CustomItemButton.h"
|
|
|
|
CItemText::CItemText(CSigmaDoc * ppDoc)
|
|
: CItem(ppDoc)
|
|
, m_pText(NULL)
|
|
, m_bAlone(FALSE)
|
|
, m_nAlignsH(0)
|
|
, m_nAlignsV(0)
|
|
, m_nFrame(0)
|
|
, m_textColor(0)
|
|
, m_bIsDlgEdit(FALSE)
|
|
{
|
|
SetType(ITEM_TEXT);
|
|
Reset();
|
|
}
|
|
|
|
CItemText::~CItemText(void)
|
|
{
|
|
if(m_pText)
|
|
delete m_pText;
|
|
|
|
m_pText=NULL;
|
|
}
|
|
|
|
void CItemText::OnDraw(CXyDC* pDC)
|
|
{
|
|
if(m_pText==NULL)
|
|
return;
|
|
|
|
pDC->Draw(*m_pText,m_textColor);
|
|
}
|
|
|
|
void NItem::CItemText::OnDraw(CXyDC* pXyDC, CDC* pDC)
|
|
{
|
|
OnDraw(pXyDC);
|
|
}
|
|
|
|
void CItemText::OnDrawScreen(CXyDC* pXyDC, CDC* pScreenDC)
|
|
{
|
|
if (m_pText == NULL)
|
|
return;
|
|
|
|
DCHelp::ClearDC(pScreenDC, m_BackColor);
|
|
pScreenDC->BitBlt(0, 0, m_client.Width(), m_client.Height(), m_pBackGroundDC, 0, 0, SRCCOPY);
|
|
//pXyDC->Create(pScreenDC);
|
|
//pXyDC->Draw(*m_pText, m_textColor);
|
|
}
|
|
|
|
void CItemText::OnLButtonDown(CDC* pDC, UINT nFlags, CPoint point, int vk)
|
|
{
|
|
if(m_pText==NULL) return;
|
|
//GetDC()->Draw(*m_pText, GetDC()->GetDC()->GetBkColor());
|
|
|
|
CPoint2D pt=GetDC()->GetReal(point);
|
|
m_pText->x0=pt.x0;
|
|
m_pText->y0=pt.y0;
|
|
OnDrawScreen(GetDC(), pDC);
|
|
//TextDlg.GetText(m_pText);
|
|
//m_textColor=TextDlg.color;
|
|
//GetDC()->Draw(*m_pText,m_textColor);
|
|
//GetDoc()->Invalidate();
|
|
}
|
|
|
|
void CItemText::Create()
|
|
{
|
|
//备份文字信息,以备下次进入时使用
|
|
//if(GetDoc()->ItemState.m_pBkText==NULL)
|
|
// GetDoc()->ItemState.m_pBkText=new CText;
|
|
|
|
//*(GetDoc()->ItemState.m_pBkText)=*m_pText;
|
|
CText* pText = new CText;
|
|
*pText = *m_pText;
|
|
POSITION pos = this->AddElement(pText, DOUBLEFOX_TEXT, false);
|
|
GetDoc()->GetDraw()->SetElementColor(pos, m_textColor);
|
|
|
|
}
|
|
|
|
void CItemText::Create(CText* pText, COLORREF color)
|
|
{
|
|
*m_pText = *pText;
|
|
CText* pTextNew = new CText;
|
|
*pTextNew = *pText;
|
|
this->m_textColor = color;
|
|
POSITION pos = this->AddElement(pTextNew, DOUBLEFOX_TEXT, false);
|
|
GetDoc()->GetDraw()->SetElementColor(pos, m_textColor);
|
|
}
|
|
|
|
void CItemText::EditText(COne* pOne)
|
|
{
|
|
if(m_pText)delete m_pText;
|
|
m_pText=new CText;
|
|
if(pOne)
|
|
{
|
|
*m_pText=*(CText*)pOne->GetValue();
|
|
m_textColor=pOne->color;
|
|
//TextDlg.EditOne(pOne);
|
|
}
|
|
else
|
|
{
|
|
//恢复备份参数
|
|
//if(GetDoc()->ItemState.m_pBkText)
|
|
{
|
|
//*m_pText=*(GetDoc()->ItemState.m_pBkText);
|
|
//TextDlg.SetText(m_pText);
|
|
}
|
|
//else
|
|
{
|
|
//自动根据单位设置文字大小
|
|
//double scale=GetDoc()->GetCurrentUnitScale();
|
|
//TextDlg.m_height *= scale;
|
|
//TextDlg.m_width *= scale;
|
|
}
|
|
}
|
|
//TextDlg.m_pItem=this;
|
|
//TextDlg.Create(this->GetView());
|
|
m_bIsDlgEdit=TRUE;
|
|
}
|
|
|
|
void CItemText::EndEdit(int nReturn)
|
|
{
|
|
if(nReturn==IDOK)
|
|
{
|
|
//备份文字信息,以备下次进入时使用
|
|
//if(GetDoc()->ItemState.m_pBkText==NULL)
|
|
//GetDoc()->ItemState.m_pBkText=new CText;
|
|
//*(GetDoc()->ItemState.m_pBkText)=*m_pText;
|
|
|
|
if(IsEditState())
|
|
{
|
|
COne* pOne=(COne*)GetDoc()->GetDraw()->GetAt(GetPos());
|
|
|
|
//为UNDO做准备
|
|
//CActionModifiedItem* pAction=new CActionModifiedItem(GetDoc(), IDS_STRING_TOOLBAR_EDIT);
|
|
//pAction->AddCloneItem(GetPos(), pOne);
|
|
//GetDoc()->SetActionItem(pAction);
|
|
|
|
CText* pText=(CText*)pOne->GetValue();
|
|
*pText=*m_pText;
|
|
pOne->color=m_textColor;
|
|
}
|
|
else
|
|
{
|
|
POSITION pos=this->AddElement(m_pText,DOUBLEFOX_TEXT,false);
|
|
CItem::SetPos(pos);
|
|
GetDoc()->GetDraw()->SetElementColor(pos,m_textColor);
|
|
m_pText=NULL;
|
|
}
|
|
}
|
|
m_bIsDlgEdit=FALSE;
|
|
GetDoc()->Invalidate();
|
|
//GetDoc()->EnableDefaultTool();
|
|
}
|
|
|
|
void CItemText::SetTextInfo(CString & text, double textHeight
|
|
, double textWidth, double angle, LOGFONT * font
|
|
, int r, int g, int b, BOOL bScript)
|
|
{
|
|
SetText(text);
|
|
SetTextHeight(textHeight);
|
|
SetTextWidth(textWidth);
|
|
SetAngle(angle);
|
|
if (font != nullptr)
|
|
{
|
|
SetFont(font);
|
|
}
|
|
SetColor(r, g, b);
|
|
SetScript(bScript);
|
|
|
|
//DCHelp::ClearDC(m_pScreenDC);
|
|
//m_pScreenDC->BitBlt(0, 0, m_client.Width(), m_client.Height(), m_pBackGroundDC, 0, 0, SRCCOPY);
|
|
//GetDC()->Create(m_pScreenDC);
|
|
//GetDC()->Draw(*m_pText, m_textColor);
|
|
}
|
|
|
|
void CItemText::GetTextInfo(CString & text, double & textHeight
|
|
, double & textWidth, double & angle, LOGFONT * font
|
|
, int & r, int & g, int & b, BOOL & bScript)
|
|
{
|
|
text = m_pText->GetName();
|
|
textHeight = m_pText->m_size.cy;
|
|
textWidth = m_pText->m_size.cx;
|
|
angle = m_pText->angle;
|
|
|
|
if (font != 0)
|
|
{
|
|
CopyFont(font);
|
|
}
|
|
|
|
r = GetRValue(m_textColor);
|
|
g = GetGValue(m_textColor);
|
|
b = GetBValue(m_textColor);
|
|
|
|
bScript = m_pText->m_bScript;
|
|
}
|
|
|
|
void CItemText::SetText(CString & text)
|
|
{
|
|
m_pText->SetName(text);
|
|
}
|
|
|
|
void CItemText::SetTextHeight(double textHeight)
|
|
{
|
|
m_pText->m_size.cy = textHeight;
|
|
}
|
|
void CItemText::SetTextWidth(double textWidth)
|
|
{
|
|
m_pText->m_size.cx = textWidth;
|
|
}
|
|
void CItemText::SetAngle(double angle)
|
|
{
|
|
m_pText->angle = angle;
|
|
}
|
|
|
|
void CItemText::SetFont(LOGFONT * font)
|
|
{
|
|
m_font = *font;
|
|
memcpy(m_font.lfFaceName, font->lfFaceName, sizeof(m_font.lfFaceName));
|
|
|
|
m_pText->m_logFont = m_font;
|
|
memcpy(m_pText->m_logFont.lfFaceName, m_font.lfFaceName, 32);
|
|
}
|
|
|
|
void CItemText::CopyFont(LOGFONT * font)
|
|
{
|
|
*font = m_font;
|
|
memcpy(font->lfFaceName, m_font.lfFaceName, sizeof(font->lfFaceName));
|
|
}
|
|
|
|
void CItemText::SetColor(int r, int g, int b)
|
|
{
|
|
m_textColor = RGB(r, g, b);
|
|
}
|
|
|
|
//是否开启文字的上下标
|
|
void CItemText::SetScript(BOOL bScript)
|
|
{
|
|
m_pText->m_bScript = bScript;
|
|
}
|
|
/*
|
|
void CItemText::OnInplaceButtonDown(CXTPPropertyGridItem* pItem)
|
|
{
|
|
if(pItem == NULL) return;
|
|
if(pItem->GetID() != IDS_STRING_NAME) return;
|
|
|
|
COne* pOne=(COne*)GetDoc()->GetDraw()->GetAt(GetPos());
|
|
EditText(pOne);
|
|
}
|
|
|
|
BOOL CItemText::InitPropertyGrid(CXTPPropertyGrid& grid)
|
|
{
|
|
if(!IsEditState()) return FALSE;
|
|
if(m_bIsDlgEdit) return FALSE;
|
|
CPropertyGridItemAdd ItemAdd;
|
|
ItemAdd = NULL;
|
|
CXTPPropertyGridItem* pItem=grid.AddCategory(IDS_STRING_Text);
|
|
ItemAdd.SetItem(pItem); pItem->Expand();
|
|
|
|
COne* pOne=(COne*)GetDoc()->GetDraw()->GetAt(GetPos());
|
|
CText* pValue=(CText*)pOne->GetValue();
|
|
|
|
pItem = new CCustomItemButton(IDS_STRING_NAME, GetOwner(), pValue->GetName());
|
|
pItem->SetFlags(xtpGridItemHasExpandButton|xtpGridItemHasEdit);//pItem->SetReadOnly(TRUE);
|
|
ItemAdd.AddItem(pItem);
|
|
|
|
return IniPublicGrid(grid, ItemAdd);
|
|
}
|
|
|
|
BOOL CItemText::IniPublicGrid(CXTPPropertyGrid& grid, CPropertyGridItemAdd &ItemAdd)
|
|
{
|
|
if(!IsEditState()) return FALSE;
|
|
if(m_bIsDlgEdit) return FALSE;
|
|
|
|
COne* pOne=(COne*)GetDoc()->GetDraw()->GetAt(GetPos());
|
|
CText* pValue=(CText*)pOne->GetValue();
|
|
m_point.SetPoint(pValue->x0,pValue->y0);
|
|
ItemAdd.AddItemPoint(IDS_GI_COORDINATE,m_point,&m_point);
|
|
|
|
CString strFormat=GetFloatFormatString();
|
|
|
|
m_szText = GetUnitMode().toPrintUnit(pValue->m_size);
|
|
ItemAdd.AddItemUnitDouble(IDS_STRING_TEXT_HEIGHT, GetUnit(), m_szText.cy, strFormat, &m_szText.cy);
|
|
ItemAdd.AddItemUnitDouble(IDS_STRING_TEXT_WIDTH, GetUnit(), m_szText.cx, strFormat, &m_szText.cx);
|
|
|
|
ItemAdd.AddItemBool(IDS_GI_TEXT_HEIGHT_AND_WIDTH, m_bAlone, &m_bAlone);
|
|
ItemAdd.AddItemDouble(IDS_STRING_ANGLE, pValue->angle, strFormat, NULL);
|
|
|
|
color=pOne->color;
|
|
ItemAdd.AddItemColor(IDS_GI_COLOR, color,&color);
|
|
ItemAdd.AddItemFont(IDS_STRING_FONT, pValue->m_logFont);
|
|
|
|
CXTPPropertyGridItem* pi=ItemAdd.GetItem();
|
|
CXTPPropertyGridItem* pItem=grid.AddCategory(IDS_GI_TEXT_ALIGNS);
|
|
ItemAdd.SetItem(pItem); pItem->Expand();
|
|
SetMode(pValue);
|
|
ItemAdd.AddItemCombo(IDS_GI_TEXT_ALIGNS_H, IDS_GI_TEXT_ALIGNS_H_IDEA, m_nAlignsH, &m_nAlignsH);
|
|
ItemAdd.AddItemCombo(IDS_GI_TEXT_ALIGNS_V, IDS_GI_TEXT_ALIGNS_V_IDEA, m_nAlignsV, &m_nAlignsV);
|
|
ItemAdd.AddItemCombo(IDS_STRING_Frame, IDS_GI_TEXT_FRAME, m_nFrame, &m_nFrame);
|
|
ItemAdd.SetItem(pi);
|
|
|
|
CItem::InitPropertyGrid(grid);
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CItemText::OnGridItemChangeValue(CXTPPropertyGridItem* pItem)
|
|
{
|
|
if(!IsEditState()) return FALSE;
|
|
|
|
COne* pOne=(COne*)GetDoc()->GetDraw()->GetAt(GetPos());
|
|
CText* pValue=(CText*)pOne->GetValue();
|
|
//CXTPPropertyGridItem* pFind;
|
|
CString str;
|
|
|
|
BOOL bUpdate=FALSE;
|
|
switch(pItem->GetID())
|
|
{
|
|
case IDS_STRING_NAME:
|
|
pValue->SetName(pItem->GetValue());
|
|
bUpdate=TRUE;
|
|
break;
|
|
case IDS_STRING_ANGLE:
|
|
pValue->angle=((CXTPPropertyGridItemDouble*)pItem)->GetDouble();
|
|
bUpdate=TRUE;
|
|
break;
|
|
case IDS_GI_TEXT_ALIGNS_H: //左对齐|水平居中|右对齐
|
|
case IDS_GI_TEXT_ALIGNS_V: //上对齐|垂直居中|下对齐
|
|
case IDS_STRING_Frame: //空|矩形|圆
|
|
GetMode(pValue);
|
|
bUpdate=TRUE;
|
|
break;
|
|
case IDS_GI_COORDINATE:
|
|
pValue->x0=m_point.x0;
|
|
pValue->y0=m_point.y0;
|
|
bUpdate=TRUE;
|
|
break;
|
|
case IDS_STRING_TEXT_WIDTH:
|
|
bUpdate=TRUE;
|
|
pValue->m_size.cx = GetUnitMode().toRealUnit(m_szText.cx);
|
|
if(m_bAlone) break;
|
|
pValue->m_size.cy=pValue->m_size.cx/0.4;
|
|
//pf.FloatToString(str,pValue->m_size.cy);pFind=FindItem(pItem, IDS_STRING_TEXT_HEIGHT);if(pFind) pFind->SetValue(str);
|
|
break;
|
|
case IDS_STRING_TEXT_HEIGHT:
|
|
bUpdate=TRUE;
|
|
pValue->m_size.cy = GetUnitMode().toRealUnit(m_szText.cy);
|
|
if(m_bAlone) break;
|
|
pValue->m_size.cx=pValue->m_size.cy*0.4;
|
|
//pf.FloatToString(str,pValue->m_size.cx);pFind=FindItem(pItem, IDS_STRING_TEXT_WIDTH);if(pFind) pFind->SetValue(str);
|
|
break;
|
|
case IDS_GI_COLOR:
|
|
pOne->color=color;
|
|
bUpdate=TRUE;
|
|
break;
|
|
case IDS_STRING_FONT:
|
|
((CXTPPropertyGridItemFont*)pItem)->GetFont(&pValue->m_logFont);
|
|
bUpdate=TRUE;
|
|
break;
|
|
}
|
|
|
|
return bUpdate | CItem::OnGridItemChangeValue(pItem);
|
|
}
|
|
*/
|
|
|
|
//左对齐|水平居中|右对齐
|
|
//上对齐|垂直居中|下对齐
|
|
//空|矩形|圆
|
|
void CItemText::SetMode(CText* pValue)
|
|
{
|
|
UINT md;
|
|
|
|
m_nAlignsH=2;
|
|
md=pValue->GetAlignsH();
|
|
if(md & CTextFlags::alignLeft) m_nAlignsH=0;
|
|
else if(md & CTextFlags::alignCenterH) m_nAlignsH=1;
|
|
else if(md & CTextFlags::alignRight) m_nAlignsH=2;
|
|
|
|
m_nAlignsV=2;
|
|
md=pValue->GetAlignsV();
|
|
if(md & CTextFlags::alignTop) m_nAlignsV=0;
|
|
else if(md & CTextFlags::alignCenterV) m_nAlignsV=1;
|
|
else if(md & CTextFlags::alignBottom) m_nAlignsV=2;
|
|
|
|
m_nFrame=0;
|
|
md=pValue->GetFrameMode();
|
|
if(md & CTextFlags::frameNull) m_nFrame=0;
|
|
else if(md & CTextFlags::frameRect) m_nFrame=1;
|
|
else if(md & CTextFlags::frameCircle) m_nFrame=2;
|
|
else if(md & CTextFlags::frameEllipse) m_nFrame=3;
|
|
}
|
|
|
|
void CItemText::GetMode(CText* pValue)
|
|
{
|
|
switch(m_nAlignsH)
|
|
{
|
|
case 0: pValue->SetAlignsH(CTextFlags::alignLeft); break;
|
|
case 1: pValue->SetAlignsH(CTextFlags::alignCenterH); break;
|
|
case 2: pValue->SetAlignsH(CTextFlags::alignRight); break;
|
|
}
|
|
switch(m_nAlignsV)
|
|
{
|
|
case 0: pValue->SetAlignsV(CTextFlags::alignTop); break;
|
|
case 1: pValue->SetAlignsV(CTextFlags::alignCenterV); break;
|
|
case 2: pValue->SetAlignsV(CTextFlags::alignBottom); break;
|
|
}
|
|
switch(m_nFrame)
|
|
{
|
|
case 0: pValue->SetFrameMode(CTextFlags::frameNull); break;
|
|
case 1: pValue->SetFrameMode(CTextFlags::frameRect); break;
|
|
case 2: pValue->SetFrameMode(CTextFlags::frameCircle); break;
|
|
case 3: pValue->SetFrameMode(CTextFlags::frameEllipse); break;
|
|
}
|
|
}
|
|
|
|
void CItemText::SetPosition(double x, double y)
|
|
{
|
|
m_pText->x0 = x;
|
|
m_pText->y0 = y;
|
|
}
|
|
|
|
void CItemText::Reset()
|
|
{
|
|
m_font.lfWidth = 5;
|
|
m_font.lfHeight = m_font.lfWidth * 2;
|
|
m_font.lfEscapement = 0;
|
|
m_font.lfOrientation = 0;
|
|
m_font.lfWeight = FW_NORMAL;
|
|
m_font.lfItalic = 0;
|
|
m_font.lfUnderline = 0;
|
|
m_font.lfStrikeOut = 0;
|
|
m_font.lfCharSet = DEFAULT_CHARSET;
|
|
m_font.lfOutPrecision = OUT_DEFAULT_PRECIS;
|
|
m_font.lfClipPrecision = CLIP_LH_ANGLES;
|
|
m_font.lfQuality = DEFAULT_QUALITY;
|
|
m_font.lfPitchAndFamily = DEFAULT_PITCH;
|
|
sprintf(m_font.lfFaceName, "Times New Roman");
|
|
|
|
delete m_pText;
|
|
m_pText = new CText();
|
|
m_pText->m_logFont = m_font;
|
|
memcpy(m_pText->m_logFont.lfFaceName, m_font.lfFaceName, 32);
|
|
|
|
m_textColor = RGB(0, 0, 0);
|
|
} |