Files
envi-code/SourceCode/Code2026/tg_shs/shs_annotate/MutiRowTextDlg.cpp
T
2026-09-28 15:28:50 +08:00

327 lines
8.8 KiB
C++

// MutiRowTextDlg.cpp : implementation file
//
#include "stdafx.h"
#include "MutiRowTextDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CMutiRowTextDlg dialog
static CString g_strLineSpace = _T("0.4");
static CString g_strPageWidth = _T("200");
static double g_nHeight_muti = 3.5;
static int g_nAlignIndex_muti = 0;
static CString g_strOldText = _T("");
// add by xly on 101222初始化多行文字中的转角的变量
CString CMutiRowTextDlg::m_strRotation = _T("0");
static XExplodeDraw::TextAlignment
g_AlignList_muti[] = { XExplodeDraw::kLeft, XExplodeDraw::kRight ,
XExplodeDraw::kCenter, XExplodeDraw::kTextFit,};
IMPLEMENT_DYNAMIC(CMutiRowTextDlg, CCharToolbarDlg)
CMutiRowTextDlg::CMutiRowTextDlg(BOOL bEdit, CWnd* pParent /*=NULL*/)
: CCharToolbarDlg(CMutiRowTextDlg::IDD, pParent),m_bEditObj(bEdit)
{
//{{AFX_DATA_INIT(CMutiRowTextDlg)
m_strInputText = _T("");
m_strHeight = _T("");
m_strPageWidth = _T("");
//m_strRotation = _T("");// delete by xly on 101222多行文字中的转角的变量变为静态变量
m_strLineSpace = _T("");
//}}AFX_DATA_INIT
//m_uTimerID = 0;
m_bInit = FALSE;
m_nOldSizeX=495;
m_nOldSizeY=224;
m_bNeedSingleLineText = FALSE; // sg add 090324
}
void CMutiRowTextDlg::DoDataExchange(CDataExchange* pDX)
{
CCharToolbarDlg::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMutiRowTextDlg)
DDX_Control(pDX, IDOK, m_ctrlOk);
DDX_Control(pDX, IDCANCEL, m_ctrlCancel);
DDX_Control(pDX, IDC_INPUT_TEXT, m_editInputText);
DDX_Control(pDX, IDC_COMBO_FONGSTYLE, m_comboFontStyle);
DDX_Control(pDX, IDC_COMBO_ALIGNMENT, m_comboAlign);
DDX_Text(pDX, IDC_INPUT_TEXT, m_strInputText);
DDX_CBString(pDX, IDC_COMBO_HEIGHT, m_strHeight);
DDX_Text(pDX, IDC_PAGE_WIDTH, m_strPageWidth);
DDX_Text(pDX, IDC_ROTATION, m_strRotation);
DDX_Text(pDX, IDC_ROWDIST, m_strLineSpace);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CMutiRowTextDlg, CCharToolbarDlg)
//{{AFX_MSG_MAP(CMutiRowTextDlg)
ON_BN_CLICKED(IDC_BUTTON_PAGEWIDTH, OnButtonPagewidth)
ON_BN_CLICKED(IDC_BUTTON_TEXT_HEIGHT, OnButtonTextHeight)
ON_WM_SIZE()
ON_WM_CREATE()
//}}AFX_MSG_MAP
//ON_COMMAND_RANGE(ID_SPECIAL_CHAR, ID_ONE_STEEL, OnChar)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMutiRowTextDlg message handlers
BOOL CMutiRowTextDlg::OnInitDialog()
{
CCharToolbarDlg::OnInitDialog();
m_bInit = TRUE;
CRect rectDlg;
GetClientRect(rectDlg);
sizeDlg.cx = rectDlg.Width();
sizeDlg.cy = rectDlg.Height();
ResetSize();
LoadTextStyle();
if(m_strInputText == _T(""))
m_strInputText = g_strOldText;
m_comboAlign.SetCurSel(g_nAlignIndex_muti);
if(fabs(g_nHeight_muti) < 1.0E-3)
g_nHeight_muti = 3.5;
if(!m_bEditObj)//add by whl
m_strHeight.Format(_T("%.1f"), g_nHeight_muti);
m_ctrlInputText = GetDlgItem(IDC_INPUT_TEXT);
m_strLineSpace = g_strLineSpace;
m_strPageWidth = g_strPageWidth;
m_comboFontStyle.SetCurSel(m_comboFontStyle.FindStringExact(0, m_strStyle));
UpdateData(FALSE);
//toolbar
m_editInputText.SetFocus();
return FALSE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CMutiRowTextDlg::ResetSize()
{
CRect rectEdit, rectCancel, rectOk;
m_editInputText.GetWindowRect(rectEdit);
ScreenToClient(rectEdit);
m_ctrlCancel.GetWindowRect(rectCancel);
ScreenToClient(rectCancel);
m_ctrlOk.GetWindowRect(rectOk);
ScreenToClient(rectOk);
long nIncY = sizeDlg.cy - m_nOldSizeY; // 对话框绝对尺寸
long nIncX = sizeDlg.cx - m_nOldSizeX;
m_editInputText.MoveWindow(rectEdit.left, rectEdit.top,
rectEdit.Width() + nIncX, rectEdit.Height() + nIncY);
m_ctrlCancel.MoveWindow(rectCancel.left + nIncX, rectCancel.top,
rectCancel.Width(), rectCancel.Height());
m_ctrlOk.MoveWindow(rectOk.left + nIncX, rectOk.top,
rectOk.Width(), rectOk.Height());
}
void CMutiRowTextDlg::LoadTextStyle()
{
AcDbDatabase *pCurDwg=acdbCurDwg();
AcDbTextStyleTable* pTT;
VERIFY(pCurDwg->getSymbolTable(pTT, AcDb::kForRead)==Acad::eOk);
AcDbTextStyleTableIterator* pIter = NULL;
VERIFY(pTT->newIterator(pIter)==Acad::eOk);
pTT->close();
for (pIter->start(); !pIter->done(); pIter->step())
{
AcDbTextStyleTableRecord* pTTR;
if (pIter->getRecord(pTTR, AcDb::kForRead) != Acad::eOk)
continue;
const TCHAR* pName = NULL;
if (pTTR->getName(pName) == Acad::eOk && pName != NULL)
{
if(m_lstStyle.Index(pName) < 0 ) // 如果没有重复
m_lstStyle.Append(tstrnew(pName)); // 读字体风格
}
pTTR->close();
}
delete pIter;
for (int m =0; m < m_lstStyle.Length(); m++)
m_comboFontStyle.AddString(m_lstStyle[m]);
UpdateData(false);
return;
}
void CMutiRowTextDlg::Obj2Dlg(TDbMText *pText)
{
m_strHeight.Format(_T("%.1f"), pText->GetHeight());
m_strRotation = (const TCHAR *)Angle2Str(pText->GetRotation() * 180.0 / PI);
AcDbObjectId idTextStyle = pText->GetStyleId();
OPENOBJ_BEGIN(idTextStyle, AcDb::kForRead, AcDbTextStyleTableRecord, pStyle);
ASSERT(pStyle);
const TCHAR* pName = NULL;
if (pStyle->getName(pName) == Acad::eOk && pName != NULL)
m_strStyle = pName;
else
AfxMessageBox(_T("文字风格已删除!"));
OPENOBJ_END();
m_strInputText = pText->GetText();
XExplodeDraw::TextAlignment Align = pText->GetAlignment();
for(int i = 0; i < 4; i++)
{
if(Align == g_AlignList_muti[i])
g_nAlignIndex_muti = i;
}
g_strLineSpace.Format(_T("%.2f"), (pText->GetLineSpace() / pText->GetHeight()));
g_strPageWidth.Format(_T("%.1f"), pText->GetPageWidth());
}
void CMutiRowTextDlg::Dlg2Obj(TDbMText *pText)
{
XString sTextStyle = m_strStyle;
//xg_setvar(_T("TEXTSTYLE"), sTextStyle);
g_strOldText = m_strInputText;
AcDbObjectId idTextStyle = GetTextStyleId(sTextStyle);
if(!idTextStyle)
return;
pText->SetStyleId(idTextStyle);
g_nHeight_muti = _tstof(m_strHeight);
g_strPageWidth = m_strPageWidth;
g_strLineSpace = m_strLineSpace;
pText->SetHeight(g_nHeight_muti);
double nRotation = _tstof(m_strRotation);
pText->SetRotation(nRotation * PI / 180.0);
pText->SetText(m_strInputText);
pText->SetAlignment(g_AlignList_muti[g_nAlignIndex_muti]);
pText->SetLineSpace(_tstof(m_strLineSpace) * g_nHeight_muti);
pText->SetPageWidth(_tstof(m_strPageWidth), TRUE); // 对话框指定
}
void CMutiRowTextDlg::OnOK()
{
g_nAlignIndex_muti = m_comboAlign.GetCurSel();
if(g_nAlignIndex_muti < 0)
g_nAlignIndex_muti = 0;
if(m_comboFontStyle.GetCurSel()>=0)
m_comboFontStyle.GetLBText(m_comboFontStyle.GetCurSel(), m_strStyle);
CCharToolbarDlg::OnOK();
if(!m_bEditObj) // ZJQ modify on 2004/3/5
xg_setvar(_T("TEXTSTYLE"), m_strStyle);
}
void CMutiRowTextDlg::OnCancel()
{
CCharToolbarDlg::OnCancel();
}
void CMutiRowTextDlg::OnButtonPagewidth()
{
UpdateData(TRUE);
double nPageWidth = _tstof(m_strPageWidth)*DocGetPScale();
BeginEditorCommand();
LAB_REINPUT:
if(GetDist(_T("\n定义上华多行文字行宽"), nPageWidth, RSG_NOZERO|RSG_NONEG) == RTCAN) {
goto LAB_REINPUT;
} else {
CompleteEditorCommand();
nPageWidth /= DocGetPScale();
m_strPageWidth.Format(_T("%.1f"), nPageWidth);
UpdateData(FALSE);
}
}
void CMutiRowTextDlg::OnButtonTextHeight()
{
UpdateData(TRUE);
double nHeight = _tstof(m_strHeight)*DocGetPScale();
BeginEditorCommand();
LAB_REINPUT:
if(GetDist(_T("\n字高"), nHeight, RSG_NOZERO|RSG_NONEG) == RTCAN) {
goto LAB_REINPUT;
} else {
CompleteEditorCommand();
nHeight /= DocGetPScale();
m_strHeight.Format(_T("%.1f"), nHeight);
UpdateData(FALSE);
}
}
void CMutiRowTextDlg::OnSize(UINT nType, int cx, int cy)
{
//CCharToolbarDlg::OnSize(nType, cx, cy); // 不调用
if(m_bInit == TRUE && !nType ) {
CRect rectEdit;
m_editInputText.GetWindowRect(rectEdit);
ScreenToClient(rectEdit);
CRect rectCancel, rectOk;
m_ctrlCancel.GetWindowRect(rectCancel);
ScreenToClient(rectCancel);
m_ctrlOk.GetWindowRect(rectOk);
ScreenToClient(rectOk);
CSize sizeOld = sizeDlg;
sizeDlg.cx = cx;
sizeDlg.cy = cy;
long nIncY = sizeDlg.cy - sizeOld.cy;
long nIncX = sizeDlg.cx - sizeOld.cx;
m_editInputText.MoveWindow(rectEdit.left, rectEdit.top,
rectEdit.Width() + nIncX, rectEdit.Height() + nIncY);
m_ctrlCancel.MoveWindow(rectCancel.left + nIncX, rectCancel.top,
rectCancel.Width(), rectCancel.Height());
m_ctrlOk.MoveWindow(rectOk.left + nIncX, rectOk.top,
rectOk.Width(), rectOk.Height());
}
}
int CMutiRowTextDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CCharToolbarDlg::OnCreate(lpCreateStruct) == -1)
return -1;
CRect rect;
GetClientRect(rect);
m_nOldSizeX=rect.Width();
m_nOldSizeY=rect.Height();
return 0;
}