Files
envi-code/SourceCode/Code2026/tg_shs/shs_public/MutiRowTextDlg.cpp
T

1448 lines
34 KiB
C++
Raw Normal View History

2026-10-04 00:04:20 +08:00
// MutiRowTextDlg.cpp : implementation file
2026-09-28 15:28:50 +08:00
//
#include "stdafx.h"
#include "MutiRowTextDlg.h"
#include "AcEdInputPointMonitorEx.h"
#include "xtext.h"
#include "chardlg.h"
#include <actrans.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
// void NewText2Old(AcDbObjectId idMTextNew)
// {
// AcDbObjectId idStyle;
// double dHeight = 0.0;
// double dLineSpace = 0.0;
// double dPageWidth = 0.0;
// XExplodeDraw::TextAlignment alignType;
// std::vector<std::pair<CString, AcGePoint3d> > vec;
// OPENOBJ_BEGIN(idMTextNew, AcDb::kForRead, TDbMTextNew, pTextNew);
// if(pTextNew != NULL)
// {
// pTextNew->Transform2OldMText(vec);
// idStyle = pTextNew->GetStyleId();
// dHeight = pTextNew->GetHeight();
// dLineSpace = pTextNew->GetLineSpace();
// dPageWidth = pTextNew->GetPageWidth();
// alignType = pTextNew->GetAlignment();
// }
// OPENOBJ_END();
//
// std::vector<std::pair<CString, AcGePoint3d> >::iterator it;
// for (it = vec.begin(); it != vec.end(); it++)
// {
// TDbMText *pMText = new TDbMText;
// pMText->SetText(it->first);
// pMText->SetLocation(it->second);
// pMText->SetStyleId(idStyle);
// pMText->SetHeight(dHeight);
//
// pMText->SetAlignment(alignType);
// pMText->SetLineSpace(dLineSpace);
// pMText->SetPageWidth(dPageWidth,TRUE);
// pMText->AddToCSpace(Adesk::kTrue);
// }
// }
//
// void NewText2Old()
// {
// RBList rbMask(RTDXF0, _T("ATS_MTEXTNEW"), NULL);
// Entity entTextOld;
2026-10-04 00:04:20 +08:00
// if(SelectEntity(_T("\n请选择要转换的多行文字:<退出>"), entTextOld, rbMask) != RTNORM)
2026-09-28 15:28:50 +08:00
// return;
//
// AcDbObjectId id;
// acdbGetObjectId(id, entTextOld);
// NewText2Old(id);
// }
2026-10-04 00:04:20 +08:00
// 希腊字符特殊处理
2026-09-28 15:28:50 +08:00
bool IsGreeceChar(const CString &sWord)
{
2026-10-04 00:04:20 +08:00
char charGreece[][3] = {"Α","Β","Γ","Δ","Ε","Ζ","Η",
"Θ","Ι","Κ","Λ","Μ","Ν","Ξ",
"Ο","Π","Ρ","Σ","Τ","Υ","Φ",
"Χ","Ψ","Ω","α","β","γ","δ",
"ε","ζ","η","θ","ι","κ","λ",
"μ","ν","ξ","ο","π","ρ","σ",
"τ","υ","φ","χ","ψ","ω"};
2026-09-28 15:28:50 +08:00
for (int n = 0; n < 48; n++)
{
if (sWord == charGreece[n])
{
return true;
}
}
return false;
}
2026-10-04 00:04:20 +08:00
// 编辑多行文字
2026-09-28 15:28:50 +08:00
int EditMutiText(AcDbObjectId id)
{
xg_setvar(_T("CMDECHO"), 0);
XPoint ptCur;
AcEdInputPointMonitorEx cMonitor(curDoc());
GetWcsCursor(ptCur);
ptCur = Ucs2Wcs(ptCur);
double nHeight = 0.0, nPageWidth = 0.0;
CMutiRowTextDlg dlg(TRUE, acedGetAcadFrame());
OPENOBJ_BEGIN(id, AcDb::kForRead, TDbMTextNew, pText);
if(!pText)
return RTERROR;
dlg.Obj2Dlg(pText);
dlg.SetCursorPos(ptCur);
dlg.SetCurTextId(id);
OPENOBJ_END();
CTemporaryResourceOverride vTemp;
if(dlg.DoModal() != IDOK)
return RTNONE;
OPENOBJ_BEGIN(id, AcDb::kForRead, TDbMTextNew, pText);
if(!pText)
return RTERROR;
if(pText->upgradeOpen()!=Acad::eOk)
return RTERROR;
pText->assertWriteEnabled();
dlg.Dlg2Obj(pText);
pText->downgradeOpen();
OPENOBJ_END();
return RTNORM;
}
2026-10-04 00:04:20 +08:00
// 多行文字 zxl 2012.10.26
2026-09-28 15:28:50 +08:00
void TextMLine()
{
double nHeight = 0.0,
nRot = 0.0,
nPageWidth = 0.0;
CMutiRowTextDlg dlg(FALSE, acedGetAcadFrame());
static XString sTextStyle;
sTextStyle = DocGetTgSingleTextStyle();
2026-10-04 00:04:20 +08:00
// 检查当前记忆的文字样式是否被PU掉
2026-09-28 15:28:50 +08:00
{
bool bExist = false;
AcDbDatabase *pCurDwg = acdbCurDwg();
AcDbTextStyleTable* pTT = NULL;
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)
{
2026-10-04 00:04:20 +08:00
if (_tcsicmp(pName, sTextStyle) == 0) // 如果存在该样式
2026-09-28 15:28:50 +08:00
{
pTTR->close();
bExist = true;
continue;
}
}
pTTR->close();
}
delete pIter;
if (!bExist)
{
TCHAR sStyle[256]=_T("");
xg_getvar(_T("TEXTSTYLE"), sStyle);
sTextStyle = sStyle;
}
}
2026-10-04 00:04:20 +08:00
// 文字样式不存在
2026-09-28 15:28:50 +08:00
if (sTextStyle == _T(""))
{
TCHAR sStyle[256]=_T("");
xg_getvar(_T("TEXTSTYLE"), sStyle);
sTextStyle = sStyle;
}
AcDbObjectId idTextStyle = GetTextStyleId(sTextStyle);
if (!idTextStyle)
return;
OPENOBJ_BEGIN(idTextStyle, AcDb::kForRead, AcDbTextStyleTableRecord, pStyle);
ASSERT(pStyle);
2026-10-04 00:04:20 +08:00
dlg.m_strHeight.Format(_T("%.1f"), pStyle->textSize()); //读文字风格的字高
2026-09-28 15:28:50 +08:00
OPENOBJ_END();
dlg.m_strStyle = (const TCHAR *)sTextStyle;
{
CTemporaryResourceOverride vTemp;
if(dlg.DoModal() != IDOK || dlg.m_strInputText == _T(""))
return;
}
XPoint ptText, ptRight;
2026-10-04 00:04:20 +08:00
if(XGetPoint(NULL, _T("\n左上角"), ptText)==RTNORM )
2026-09-28 15:28:50 +08:00
{
ptText=Ucs2Wcs(ptText);
TDbMTextNew *pText = new TDbMTextNew;
dlg.Dlg2Obj(pText);
pText->SetLocation(ptText);
InitLayer(LAY_TEXT);
pText->setLayer(LAY_TEXT);
pText->SetRotation(pText->GetRotation()+Ucs2Wcs(0.0));
2026-10-04 00:04:20 +08:00
// 记录文字样式
2026-09-28 15:28:50 +08:00
sTextStyle = dlg.m_strStyle;
2026-10-04 00:04:20 +08:00
// 保存文字样式到图纸中
2026-09-28 15:28:50 +08:00
DocSetTgSingleTextStyle(dlg.m_strStyle);
AddToCurrentSpace(pText, Adesk::kTrue);
}
}
/////////////////////////////////////////////////////////////////////////////
// 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("");
static CString g_strPageHeight = _T("200");
static CString g_strPageDist = _T("7.0");
static int g_nPageStyle = 0;
2026-10-04 00:04:20 +08:00
// add by xly on 101222初始化多行文字中的转角的变量
2026-09-28 15:28:50 +08:00
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_strLineSpace = _T("");
m_strPageHeight = _T("");
m_strPageDist = _T("");
m_nPageStyle = 0;
//}}AFX_DATA_INIT
//m_uTimerID = 0;
m_bInit = FALSE;
m_nOldSizeX=495;
m_nOldSizeY=224;
m_bNeedSingleLineText = FALSE;
2026-10-04 00:04:20 +08:00
// zxl 2013.02.21 add 增加查找替换功能
2026-09-28 15:28:50 +08:00
m_strSearch = _T("");
m_strInstead = _T("");
m_nSearchStart = 0;
m_nSearchNum = 0;
m_nInsteadNum = 0;
m_bFromS = false;
m_nSelPos = 0;
2026-10-04 00:04:20 +08:00
// zxl 2013.02.21 add 增加设定文字字高和颜色的功能
2026-09-28 15:28:50 +08:00
m_nColorIndex = 255;
m_dCurTextHeight = 3.5;
m_nSelPos = 0;
}
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_Control(pDX, IDC_CMB_PAGESTYLE, m_comboPageStyle);
DDX_Text(pDX, IDC_INPUT_TEXT, m_strInputText);
DDX_CBString(pDX, IDC_COMBO_HEIGHT, m_strHeight);
DDX_Text(pDX, IDC_EDIT_PAGEHEIGHT, m_strPageHeight);
DDX_CBString(pDX, IDC_CMB_PAGEDIST, m_strPageDist);
DDX_Text(pDX, IDC_PAGE_WIDTH, m_strPageWidth);
DDX_Text(pDX, IDC_ROTATION, m_strRotation);
DDX_Text(pDX, IDC_ROWDIST, m_strLineSpace);
DDX_Text(pDX, IDC_EDIT_SEARCH, m_strSearch);
DDX_Text(pDX, IDC_EDIT_INSTEAD, m_strInstead);
//}}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_BN_CLICKED(IDC_BTN_PAGEDIST, OnButtonPageDist)
ON_BN_CLICKED(IDC_BTN_PAGEHEIGHT, OnButtonPageHeight)
ON_BN_CLICKED(IDC_BTN_ADDAROW, OnButtonAddArow)
ON_CBN_KILLFOCUS(IDC_COMBO_HEIGHT, OnSetTextHeight)
ON_CBN_SELCHANGE(IDC_COMBO_HEIGHT, OnSetTextHeight)
ON_BN_CLICKED(IDC_BTN_COLOR, OnSetTextColor)
ON_BN_CLICKED(IDC_BUTTON_SEARCH, OnBtnSearch)
ON_BN_CLICKED(IDC_BUTTON_INSTEAD, OnBtnInstead)
ON_WM_SIZE()
ON_WM_CREATE()
ON_COMMAND(ID_COPY, Copy)
ON_COMMAND(ID_CUT, Cut)
ON_COMMAND(ID_UNDO, Undo)
ON_COMMAND(ID_SELECTALLTEXT, SelAll)
ON_COMMAND(ID_PST, Paste)
ON_COMMAND(ID_DELETE, Delete)
//}}AFX_MSG_MAP
//ON_COMMAND_RANGE(ID_SPECIAL_CHAR, ID_ONE_STEEL, OnChar)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMutiRowTextDlg message handlers
void CMutiRowTextDlg::Copy()
{
m_ctrlInputText->Copy();
}
void CMutiRowTextDlg::Cut()
{
m_ctrlInputText->Cut();
}
void CMutiRowTextDlg::Undo()
{
m_ctrlInputText->Undo();
}
void CMutiRowTextDlg::SelAll()
{
m_ctrlInputText->SetSel(0,-1);
}
void CMutiRowTextDlg::Paste()
{
m_ctrlInputText->Paste();
}
void CMutiRowTextDlg::Delete()
{
m_ctrlInputText->ReplaceSel(_T(""));
}
BOOL CMutiRowTextDlg::OnInitDialog()
{
CCharToolbarDlg::OnInitDialog();
m_bInit = TRUE;
CRect rectDlg;
GetClientRect(rectDlg);
sizeDlg.cx = rectDlg.Width();
sizeDlg.cy = rectDlg.Height();
ResetSize();
LoadTextStyle();
2026-10-04 00:04:20 +08:00
// zxl 2013.02.22 add 增加设定文字颜色功能
2026-09-28 15:28:50 +08:00
GetDlgItem(IDC_BTN_COLOR)->ModifyStyle(0,BS_OWNERDRAW,0);
m_btnColor.Attach(IDC_BTN_COLOR, this);
m_btnColor.SetBackgroundColor(RGB(255,255,255));
m_wndToolTip.Create(this);
2026-10-04 00:04:20 +08:00
m_wndToolTip.AddTool( GetDlgItem(IDC_BTN_COLOR), _T("应用于段落文字,改变段落文字颜色"));
2026-09-28 15:28:50 +08:00
m_wndToolTip.SetDelayTime(200);
m_wndToolTip.Activate(TRUE);
XPoint pt = m_ptCur;
TTextPosition pos;
CString csText;
if (!!pt)
{
ads_name name;
acdbGetAdsName(name, m_id);
Entity entSel = name;
OPENOBJ_BEGIN(m_id, AcDb::kForRead, TDbMTextNew, pText);
if(!pText)
return RTERROR;
csText = pText->GetText();
pText->GetCurWordPos(pos, pt);
OPENOBJ_END();
}
if(m_strInputText == _T(""))
m_strInputText = g_strOldText;
m_comboAlign.SetCurSel(g_nAlignIndex_muti);
m_ctrlInputText = (CRichEditCtrl*)GetDlgItem(IDC_INPUT_TEXT);
m_strLineSpace = g_strLineSpace;
m_strPageWidth = g_strPageWidth;
m_strPageHeight = g_strPageHeight;
m_strPageDist = g_strPageDist;
m_nPageStyle = g_nPageStyle;
m_comboFontStyle.SetCurSel(m_comboFontStyle.FindStringExact(0, m_strStyle));
m_comboPageStyle.SetCurSel(m_nPageStyle);
UpdateData(FALSE);
m_editInputText.SetFocus();
2026-10-04 00:04:20 +08:00
m_wndToolTip.AddTool( GetDlgItem(IDC_BTN_ADDAROW), _T("应用于段落开头处,实现段落中文字对齐"));
2026-09-28 15:28:50 +08:00
m_wndToolTip.SetDelayTime(200);
m_wndToolTip.Activate(TRUE);
int nPos = SetCursorPostion(pos.m_nTextPos, csText);
SetDlgTextProp();
m_editInputText.SetSel(nPos, nPos, TRUE);
m_ctrlInputText->SetEventMask(ENM_MOUSEEVENTS);
pDXLoad = new CDataExchange(this, FALSE);
return FALSE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
2026-10-04 00:04:20 +08:00
// zxl 2013.01.28 add 获取字符个数(区分汉字)
2026-09-28 15:28:50 +08:00
int GetTextLength(const XString xsText)
{
int nLen = 0;
int nCount = (int)_tcslen(xsText);
for(int idx = 0; idx < nCount; idx++)
{
TCHAR c=xsText[idx];
2026-10-04 00:04:20 +08:00
if (c < 0 || c > 127)// 汉字
2026-09-28 15:28:50 +08:00
{
nLen++;
}
nLen++;
}
return nLen;
}
2026-10-04 00:04:20 +08:00
// ASCII转化为UNICODE zxl 2013.05.17 add
2026-09-28 15:28:50 +08:00
wstring ANSIToUnicode(CString& str)
{
int len = 0;
len = str.GetLength();
int unicodeLen = ::MultiByteToWideChar( CP_ACP,
0,
(LPCSTR)(LPCTSTR)str,
-1,
NULL,
0 );
wchar_t * pUnicode;
pUnicode = new wchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
::MultiByteToWideChar( CP_ACP,
0,
(LPCSTR)(LPCTSTR)str,
-1,
(LPWSTR)pUnicode,
unicodeLen );
wstring rt;
rt = ( wchar_t* )pUnicode;
delete pUnicode;
return rt;
}
void CMutiRowTextDlg::OnBtnSearch()
{
long hPos = 0l, lPos = 0l;
m_ctrlInputText->GetSel(hPos, lPos);
if (hPos == lPos && hPos == 0l)
{
m_bFromS = false;
m_nSelPos = 0;
}
if (hPos == lPos)
{
m_nSearchStart = lPos;
#if (ADS > 17)
m_ctrlInputText->SetSel(0, lPos);
CString szBuf;
szBuf = m_ctrlInputText->GetSelText();
2026-10-04 00:04:20 +08:00
// 17平台以上 获取到的字符为ASCII,需要转换为UNICODE zxl 2013.05.17 add
2026-09-28 15:28:50 +08:00
wstring strText = ANSIToUnicode(szBuf);
m_nSearchStart = strText.length();
m_nSelPos = m_nSearchStart;
m_ctrlInputText->SetSel(hPos, lPos);
#endif
}
#if (ADS == 17)
m_ctrlInputText->SetSel(0, lPos);
CString sText1 = m_ctrlInputText->GetSelText();
m_nSearchStart = sText1.GetLength();
m_ctrlInputText->SetSel(hPos, lPos);
#endif
CString sText = m_strSearch;
UpdateData(TRUE);
if ((!sText.IsEmpty() && sText.Compare(m_strSearch) != 0) || sText.IsEmpty())
{
m_nSearchNum = 0;
}
if (m_strSearch.IsEmpty())
{
return;
}
2026-10-04 00:04:20 +08:00
// 汉字和字符占用字节不同,查找2次
2026-09-28 15:28:50 +08:00
int nFind = m_strInputText.Find(m_strSearch, m_nSearchStart++);
int nFind2 = m_strInputText.Find(m_strSearch, m_nSearchStart);
if (nFind >= 0 && nFind2 >= 0)
{
nFind = nFind2 > nFind ? nFind : nFind2;
}
2026-10-04 00:04:20 +08:00
// 查找完整篇
2026-09-28 15:28:50 +08:00
if (m_bFromS && nFind >= m_nSelPos)
{
nFind = -1;
}
if (nFind < 0)
{
2026-10-04 00:04:20 +08:00
// 查找到段尾
2026-09-28 15:28:50 +08:00
if (!m_bFromS)
{
m_bFromS = true;
m_nSearchStart = 0;
nFind = m_strInputText.Find(m_strSearch, m_nSearchStart++);
nFind2 = m_strInputText.Find(m_strSearch, m_nSearchStart);
if (nFind >= 0 && nFind2 >= 0)
{
nFind = nFind2 > nFind ? nFind : nFind2;
}
if (nFind >= m_nSelPos)
{
nFind = -1;
OutPutMessageBox();
return;
}
}
else
{
OutPutMessageBox();
return;
}
}
if (nFind >= 0)
{
m_nSearchNum++;
int nFindEnd = 0;
nFindEnd = nFind + m_strSearch.GetLength();
int nFindPos = nFind;
#if (ADS >= 17)
CString sText = m_strInputText.Left(nFind);
nFindPos = GetTextLength(sText);
nFindEnd = nFindPos + GetTextLength(m_strSearch);
#endif
int nStart = 0;
while (nStart < nFind)
{
TCHAR c = m_strInputText[nStart++];
CString sWord = c;
2026-10-04 00:04:20 +08:00
if (c < 0 || c > 127)// 汉字
2026-09-28 15:28:50 +08:00
{
#if (ADS < 17)
sWord += m_strInputText[nStart++];
#endif
2026-10-04 00:04:20 +08:00
if (IsGreeceChar(sWord))// 希腊字符在richedit控件中占一个存储单元,而在字符串中占2个存储单元
2026-09-28 15:28:50 +08:00
{
nFindPos--;
nFindEnd--;
}
}
}
m_ctrlInputText->SetSel(nFindPos, nFindEnd);
char c = m_strSearch[0];
int nNum = 1;
2026-10-04 00:04:20 +08:00
if (c < 0 || c > 127)//汉字
2026-09-28 15:28:50 +08:00
{
nNum = 2;
}
m_nSearchStart = nFind + nNum;
}
else
{
OutPutMessageBox();
}
}
void CMutiRowTextDlg::OutPutMessageBox()
{
CString sSearch, sInstead;
2026-10-04 00:04:20 +08:00
sSearch.Format(_T("\n共找见%d个"), m_nSearchNum);
sInstead.Format(_T("\n共替换%d个"), m_nInsteadNum);
CString sNot = _T("\n搜索完成: ");
2026-09-28 15:28:50 +08:00
sNot += sSearch;
sNot += sInstead;
AfxMessageBox(sNot, MB_OK);
m_nSearchNum = 0;
m_nInsteadNum = 0;
m_ctrlInputText->SetSel(0, 0);
}
void CMutiRowTextDlg::OnBtnInstead()
{
long hPos = 0l, lPos = 0l;
m_ctrlInputText->GetSel(hPos, lPos);
if (hPos == lPos)
{
OnBtnSearch();
return;
}
m_nInsteadNum++;
m_ctrlInputText->ReplaceSel(m_strInstead);
m_ctrlInputText->SetSel(hPos, lPos);
OnBtnSearch();
}
void CMutiRowTextDlg::OnSetTextHeight()
{
long hPos = 0l, lPos = 0l;
m_ctrlInputText->GetSel(hPos, lPos);
UpdateData(TRUE);
CHARFORMAT cf;
ZeroMemory(&cf, sizeof(CHARFORMAT));
CComboBox *pBox = (CComboBox*)GetDlgItem(IDC_COMBO_HEIGHT);
if (pBox != NULL)
{
int nSel = pBox->GetCurSel();
if (nSel != -1)
{
CString sText;
pBox->GetLBText(nSel, sText);
m_strHeight = sText;
pBox->Invalidate();
}
}
double dHeight = _tstof(m_strHeight);
DWORD d = m_ctrlInputText->GetSelectionCharFormat(cf);
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_SIZE;
cf.dwEffects = 0;
cf.yHeight = 50.5 * dHeight;
m_ctrlInputText->SetSel(hPos, lPos);
BOOL bRet = m_ctrlInputText->SetSelectionCharFormat(cf);
m_ctrlInputText->SetFocus();
m_ctrlInputText->SetSel(hPos, lPos);
m_ctrlInputText->Invalidate();
}
int CMutiRowTextDlg::SetCursorPostion(const int nPos,const CString &csText)
{
int nPosCur = nPos;
COLORREF col = GetCurColor(nPosCur);
g_nHeight_muti = m_dCurTextHeight;
m_strHeight.Format(_T("%.1f"), g_nHeight_muti);
UpdateData(FALSE);
int len = csText.GetLength();
int nNumLine = 0;
int nNumWord = 0;
while (nNumWord < nPosCur)
{
nNumWord += m_editInputText.LineLength(m_editInputText.LineIndex(nNumLine));
nNumLine ++;
}
m_editInputText.LineScroll(nNumLine - 5);
m_editInputText.HideCaret();
m_editInputText.CreateSolidCaret(3, 13);
m_editInputText.SetSel(nPosCur, nPosCur, TRUE);
m_editInputText.ShowCaret();
m_btnColor.SetBackgroundColor(col);
return nPosCur;
}
void CMutiRowTextDlg::SetCursorPos(const AcGePoint3d ptCur)
{
m_ptCur = ptCur;
}
void CMutiRowTextDlg::SetCurTextId(const AcDbObjectId id)
{
m_id = id;
}
void CMutiRowTextDlg::OnButtonAddArow()
{
int i = 0;
UpdateData(TRUE);
m_editInputText.SetFocus();
// zxl 2013.03.13 modify
// if(!GetPosition(h, l))
// return;
long h, l;
m_ctrlInputText->GetSel(h, l);
m_ctrlInputText->SetSel(h, l);
2026-10-04 00:04:20 +08:00
m_ctrlInputText->ReplaceSel( _T("↓"));
2026-09-28 15:28:50 +08:00
i=l+1;
CRichEditCtrl *pEdit = NULL;
if(m_ctrlInputText->IsKindOf(RUNTIME_CLASS(CEdit)))
{
pEdit = (CRichEditCtrl*)m_ctrlInputText;
}
if(pEdit)
pEdit->SetSel(i, i);
}
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);
2026-10-04 00:04:20 +08:00
long nIncY = sizeDlg.cy - m_nOldSizeY; // 对话框绝对尺寸
2026-09-28 15:28:50 +08:00
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)
{
2026-10-04 00:04:20 +08:00
if(m_lstStyle.Index(pName) < 0 ) // 如果没有重复
m_lstStyle.Append(tstrnew(pName)); // 读字体风格
2026-09-28 15:28:50 +08:00
}
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(TDbMTextNew *pText)
{
//m_strHeight.Format(_T("%.1f"), pText->GetHeight());
g_strPageDist.Format(_T("%.1f"), pText->GetPageDist(TRUE));
g_strPageHeight.Format(_T("%.1f"), pText->GetPageHeight(TRUE));
g_nPageStyle = pText->GetPageStyle();
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
2026-10-04 00:04:20 +08:00
AfxMessageBox(_T("文字风格已删除!"));
2026-09-28 15:28:50 +08:00
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() / 3.5));
g_strPageWidth.Format(_T("%.1f"), pText->GetPageWidth());
}
void CMutiRowTextDlg::Dlg2Obj(TDbMTextNew *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_strPageWidth = m_strPageWidth;
g_strLineSpace = m_strLineSpace;
g_strPageHeight = m_strPageHeight;
g_strPageDist = m_strPageDist;
g_nPageStyle = m_nPageStyle;
pText->SetHeight(3.5);
double nRotation = _tstof(m_strRotation);
pText->SetRotation(nRotation * PI / 180.0);
pText->SetText(m_strInputText);
pText->SetPageDist(_tstof(m_strPageDist), TRUE);
pText->SetPageHeight(_tstof(m_strPageHeight), TRUE);
pText->SetPageStyle(m_nPageStyle);
pText->SetAlignment(g_AlignList_muti[g_nAlignIndex_muti]);
pText->SetLineSpace(_tstof(m_strLineSpace) * 3.5);
2026-10-04 00:04:20 +08:00
pText->SetPageWidth(_tstof(m_strPageWidth), TRUE); // 对话框指定
2026-09-28 15:28:50 +08:00
}
void CMutiRowTextDlg::SaveText()
{
OPENOBJ_BEGIN(m_id, AcDb::kForRead, TDbMTextNew, pText);
if(!pText)
return;
if(pText->upgradeOpen()!=Acad::eOk)
return;
g_nAlignIndex_muti = m_comboAlign.GetCurSel();
m_nPageStyle = m_comboPageStyle.GetCurSel();
if(g_nAlignIndex_muti < 0)
g_nAlignIndex_muti = 0;
if(m_comboFontStyle.GetCurSel()>=0)
m_comboFontStyle.GetLBText(m_comboFontStyle.GetCurSel(), m_strStyle);
if(!m_bEditObj)
xg_setvar(_T("TEXTSTYLE"), m_strStyle);
GetDefaultTextProp();
pText->assertWriteEnabled();
Dlg2Obj(pText);
pText->downgradeOpen();
OPENOBJ_END();
}
void CMutiRowTextDlg::OnChar(UINT nID)
{
UpdateData(TRUE);
int l = 0, h = 0;
m_editInputText.GetSel(h, l);
int nPos = m_editInputText.GetFirstVisibleLine();
switch (nID)
{
case ID_SAVE:
{
2026-10-04 00:04:20 +08:00
// 停止绘制,使编辑框保持当前状态
2026-09-28 15:28:50 +08:00
m_ctrlInputText->SetRedraw(FALSE);
SaveText();
2026-10-04 00:04:20 +08:00
// cad刷新
2026-09-28 15:28:50 +08:00
actrTransactionManager->queueForGraphicsFlush();
actrTransactionManager->flushGraphics();
acedUpdateDisplay();
m_editInputText.SetFocus();
m_editInputText.SetSel(h, l);
m_editInputText.LineScroll(nPos - m_editInputText.GetFirstVisibleLine());
2026-10-04 00:04:20 +08:00
m_ctrlInputText->SetRedraw(TRUE);// 解除停止绘制状态
2026-09-28 15:28:50 +08:00
}
return;
}
CCharToolbarDlg::OnChar(nID);
}
void CMutiRowTextDlg::OnOK()
{
g_nAlignIndex_muti = m_comboAlign.GetCurSel();
m_nPageStyle = m_comboPageStyle.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);
GetDefaultTextProp();
}
void CMutiRowTextDlg::OnCancel()
{
CCharToolbarDlg::OnCancel();
}
void CMutiRowTextDlg::OnButtonPagewidth()
{
UpdateData(TRUE);
double nPageWidth = _tstof(m_strPageWidth)*DocGetPScale();
BeginEditorCommand();
LAB_REINPUT:
2026-10-04 00:04:20 +08:00
if(GetDist(_T("\n定义上华多行文字行宽"), nPageWidth, RSG_NOZERO|RSG_NONEG) == RTCAN) {
2026-09-28 15:28:50 +08:00
goto LAB_REINPUT;
} else {
CompleteEditorCommand();
nPageWidth /= DocGetPScale();
m_strPageWidth.Format(_T("%.1f"), nPageWidth);
//UpdateData(FALSE);
DDX_Text(pDXLoad, IDC_PAGE_WIDTH, m_strPageWidth);
}
}
void CMutiRowTextDlg::OnButtonTextHeight()
{
UpdateData(TRUE);
double nHeight = _tstof(m_strHeight)*DocGetPScale();
BeginEditorCommand();
LAB_REINPUT:
2026-10-04 00:04:20 +08:00
if(GetDist(_T("\n定义上华多行文字字高"), nHeight, RSG_NOZERO|RSG_NONEG) == RTCAN) {
2026-09-28 15:28:50 +08:00
goto LAB_REINPUT;
} else {
CompleteEditorCommand();
nHeight /= DocGetPScale();
m_strHeight.Format(_T("%.1f"), nHeight);
long hPos = 0l, lPos = 0l;
m_ctrlInputText->GetSel(hPos, lPos);
if (hPos == lPos)
{
hPos--;
m_ctrlInputText->SetSel(hPos, lPos);
}
CHARFORMAT cf;
ZeroMemory(&cf, sizeof(CHARFORMAT));
DDX_Text(pDXLoad, IDC_COMBO_HEIGHT, m_strHeight);
double dHeight = _tstof(m_strHeight);
UpdateData(TRUE);
DWORD d = m_ctrlInputText->GetSelectionCharFormat(cf);
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_SIZE;
cf.dwEffects = 0;
cf.yHeight = 50.5 * dHeight;
m_ctrlInputText->SetSel(hPos, lPos);
BOOL bRet = m_ctrlInputText->SetSelectionCharFormat(cf);
m_ctrlInputText->SetDefaultCharFormat(cf);
m_ctrlInputText->SetFocus();
m_ctrlInputText->SetSel(hPos, lPos);
m_ctrlInputText->Invalidate();
}
}
void CMutiRowTextDlg::OnButtonPageDist()
{
UpdateData(TRUE);
double nDist = _tstof(m_strPageDist)*DocGetPScale();
BeginEditorCommand();
LAB_REINPUT:
2026-10-04 00:04:20 +08:00
if(GetDist(_T("\n定义上华多行文字页间距"), nDist, RSG_NOZERO|RSG_NONEG) == RTCAN) {
2026-09-28 15:28:50 +08:00
goto LAB_REINPUT;
} else {
CompleteEditorCommand();
nDist /= DocGetPScale();
m_strPageDist.Format(_T("%.1f"), nDist);
//UpdateData(FALSE);
DDX_Text(pDXLoad, IDC_CMB_PAGEDIST, m_strPageDist);
}
}
void CMutiRowTextDlg::OnButtonPageHeight()
{
UpdateData(TRUE);
double nHeight = _tstof(m_strPageHeight)*DocGetPScale();
BeginEditorCommand();
LAB_REINPUT:
2026-10-04 00:04:20 +08:00
if(GetDist(_T("\n定义上华多行文字页高"), nHeight, RSG_NOZERO|RSG_NONEG) == RTCAN) {
2026-09-28 15:28:50 +08:00
goto LAB_REINPUT;
} else {
CompleteEditorCommand();
nHeight /= DocGetPScale();
m_strPageHeight.Format(_T("%.1f"), nHeight);
//UpdateData(FALSE);
DDX_Text(pDXLoad, IDC_EDIT_PAGEHEIGHT, m_strPageHeight);
}
}
void CMutiRowTextDlg::OnSize(UINT nType, int cx, int cy)
{
2026-10-04 00:04:20 +08:00
//CCharToolbarDlg::OnSize(nType, cx, cy); // 不调用
2026-09-28 15:28:50 +08:00
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;
}
BOOL CMutiRowTextDlg::PreTranslateMessage(MSG* pMsg)
{
if( pMsg->message == WM_LBUTTONUP)
{
HWND hWnd = ::GetFocus();
int iID = ::GetDlgCtrlID(hWnd);
bool bNoSel = false;
if(iID == IDC_INPUT_TEXT)
{
long h = 0l, l = 0l;
m_ctrlInputText->GetSel(h, l);
m_nSelPos = l;
#if (ADS >= 17)
m_ctrlInputText->SetSel(0, l);
CString sText = m_ctrlInputText->GetSelText();
m_nSelPos = sText.GetLength();
m_ctrlInputText->SetSel(h, l);
#endif
m_bFromS = false;
m_nSearchNum = 0;
m_nInsteadNum = 0;
if (h == l)
{
if (h > 0)
{
h--;
}
m_ctrlInputText->SetSel(h, l);
bNoSel = true;
}
CHARFORMAT cf;
m_ctrlInputText->GetSelectionCharFormat(cf);
m_nColorIndex = cf.crTextColor;
m_btnColor.SetBackgroundColor(m_nColorIndex);
CWnd *pWnd = GetDlgItem(IDC_COMBO_HEIGHT);
if (pWnd != NULL)
{
2026-10-04 00:04:20 +08:00
// 16进制转化为10进制
2026-09-28 15:28:50 +08:00
CString sOx;
sOx.Format(_T("%d"), cf.yHeight);
double dDec = _tstof(sOx);
double dHeight = dDec / 50.5;
2026-10-04 00:04:20 +08:00
if (fabs(dHeight - 3.5) < 0.1)// WINDOWS默认字高与3.5之间对应关系有误差,调整一下
2026-09-28 15:28:50 +08:00
{
dHeight = 3.5;
}
CString sText;
sText.Format(_T("%.1f"), dHeight);
pWnd->SetWindowText(sText);
}
m_btnColor.Invalidate();
if (bNoSel)
{
m_ctrlInputText->SetSel(l, l);
}
}
}
if (pMsg-> message ==WM_RBUTTONDOWN)
{
CWnd * pWnd = (CWnd*) GetDlgItem(IDC_INPUT_TEXT);
if (pWnd == GetFocus())
{
2026-10-04 00:04:20 +08:00
// tPopmenu.EnableMenuItem(ID_RICH_COPY, MF_BYCOMMAND|nSelText);//使能菜单
2026-09-28 15:28:50 +08:00
CMenu menu;
DWORD dwSelectionMade;
VERIFY(menu.LoadMenu(IDR_MUTIROW));
CMenu *pmenuPopup = menu.GetSubMenu(0);
ASSERT(pmenuPopup != NULL);
dwSelectionMade = pmenuPopup->TrackPopupMenu( (TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_NONOTIFY),pMsg-> pt.x, pMsg-> pt.y, this );
pmenuPopup-> DestroyMenu();
return TRUE;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
2026-10-04 00:04:20 +08:00
// zxl 2013.02.22 add 增加设定文字颜色功能
2026-09-28 15:28:50 +08:00
void CMutiRowTextDlg::OnSetTextColor()
{
int i = 0;
int nColor = m_nColorIndex;
long hPos = 0l, lPos = 0l;
if (acedSetColorDialog(nColor, Adesk::kTrue, m_nColorIndex))
{
m_nColorIndex = nColor;
int nR = 0;
int nB = 0;
int nG = 0;
ColorToRGB(nColor, &nR, &nG, &nB);
COLORREF cBtn = RGB(nR, nG, nB);
m_btnColor.SetBackgroundColor(cBtn);
int nBar = 0;
if(m_ctrlInputText->IsKindOf(RUNTIME_CLASS(CEdit)))
{
CRichEditCtrl *pRichEdit = m_ctrlInputText;
pRichEdit->GetSel(hPos, lPos);
CHARFORMAT cf;
ZeroMemory(&cf, sizeof(CHARFORMAT));
DWORD d = pRichEdit->GetSelectionCharFormat(cf);
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_COLOR;
cf.dwEffects = 0;
if (cBtn == 0xffffff)
{
cBtn = 0;
}
2026-10-04 00:04:20 +08:00
cf.crTextColor = cBtn; //文字颜色
2026-09-28 15:28:50 +08:00
pRichEdit->SetSel(hPos, lPos);
BOOL bRet = pRichEdit->SetSelectionCharFormat(cf);
CHARFORMAT cf1;
ZeroMemory(&cf1, sizeof(CHARFORMAT));
pRichEdit->GetSelectionCharFormat(cf1);
pRichEdit->SetFocus();
pRichEdit->SetSel(hPos, lPos);
}
}
}
void CMutiRowTextDlg::SetTextProp(CString &sText)
{
m_vecCol.clear();
m_vecHeight.clear();
m_vecUnderLine.clear();
CString sColor, sHeight, sUnderline;
COLORREF cf;
double dHeight = 3.5;
bool bUnderline = false;
XString xsText = sText;
CString sTextShow;
int nCount = xsText.Length();
for(int idx = 0; idx < nCount; idx++)
{
TCHAR c=xsText[idx];
if (c == _T('$'))
{
sColor = _T(""), sHeight = _T(""), sUnderline = _T("");
while(xsText[++idx] != _T('|'))
{
sColor += xsText[idx];
}
while(xsText[++idx] != _T('|'))
{
sHeight += xsText[idx];
}
while(xsText[++idx] != _T('$'))
{
sUnderline += xsText[idx];
}
cf = _tstof(sColor);
dHeight = _tstof(sHeight);
if (_tstof(sUnderline) > 0)
{
bUnderline = true;
}
else
{
bUnderline = false;
}
continue;
}
sTextShow += c;
2026-10-04 00:04:20 +08:00
if (c < 0)// 汉字
2026-09-28 15:28:50 +08:00
{
idx++;
sTextShow += xsText[idx];
}
if (c == _T('\n'))
{
continue;
}
m_vecCol.push_back(cf);
m_vecHeight.push_back(dHeight);
m_vecUnderLine.push_back(bUnderline);
}
sText = sTextShow;
}
void CMutiRowTextDlg::SetDlgTextProp()
{
CString csText;
m_ctrlInputText->GetWindowText(csText);
SetTextProp(csText);
if (m_vecCol.size() == 0)
{
return;
}
m_strInputText = csText;
UpdateData(FALSE);
XString xsText;
xsText=csText;
int nCount = (int)_tcslen(xsText);
int iLow=0, iUp=0, nIndex = 0;
2026-10-04 00:04:20 +08:00
acedSetStatusBarProgressMeter(_T("打开中..."), 0, nCount);
2026-09-28 15:28:50 +08:00
for(int idx = 0; idx < nCount; idx++)
{
acedSetStatusBarProgressMeterPos(idx + 1);
iUp = iLow + 1;
TCHAR c=xsText[idx];
CString sWord = c;
2026-10-04 00:04:20 +08:00
if (c < 0)// 汉字
2026-09-28 15:28:50 +08:00
{
idx++;
sWord += xsText[idx];
2026-10-04 00:04:20 +08:00
if (!IsGreeceChar(sWord))// 希腊字符在richedit控件中占一个存储单元,而在字符串中占2个存储单元
2026-09-28 15:28:50 +08:00
{
iUp++;
}
}
2026-10-04 00:04:20 +08:00
else if (c > 127 && !IsGreeceChar(c))//高平台汉字
2026-09-28 15:28:50 +08:00
{
iUp++;
}
int nSpare = idx - 1;
while (c == 13 && xsText[nSpare--] == _T(' '))
{
nIndex--;
}
m_ctrlInputText->SetSel(iLow, iUp);
CString s = m_ctrlInputText->GetSelText();
if (s.IsEmpty() || c == _T('\n'))
{
iLow++;
continue;
}
CHARFORMAT cf;
ZeroMemory(&cf, sizeof(CHARFORMAT));
DWORD d = m_ctrlInputText->GetSelectionCharFormat(cf);
cf.cbSize = sizeof(CHARFORMAT);
cf.dwMask = CFM_COLOR | CFM_SIZE | CFM_STYLE | CFM_UNDERLINE;
cf.dwEffects = 0;
if (nIndex < m_vecCol.size())
{
cf.crTextColor = m_vecCol[nIndex];
}
if (nIndex < m_vecHeight.size())
{
cf.yHeight = 50.5 * m_vecHeight[nIndex];
}
if (nIndex < m_vecUnderLine.size())
{
if (m_vecUnderLine[nIndex])
{
cf.dwEffects = CFE_UNDERLINE;
}
}
m_ctrlInputText->SetSelectionCharFormat(cf);
nIndex++;
iLow = iUp;
}
acedRestoreStatusBar();
}
void CMutiRowTextDlg::GetDefaultTextProp()
{
UpdateData(TRUE);
CString csText;
m_ctrlInputText->GetWindowText(csText);
XString xsText;
xsText=csText;
int nCount = (int)_tcslen(xsText);
int iLow=0, iUp=0;
COLORREF cfBefor = 0;
double dHeightBefor = 0.0;
bool bUnderLineBefor = false;
CString sTextShow, sText;
long lLen = 0L;
for(int idx = 0; idx < nCount; idx++)
{
iUp = iLow + 1;
TCHAR c=xsText[idx];
CString sWord;
sWord +=c;
2026-10-04 00:04:20 +08:00
if (c < 0 )// 汉字
2026-09-28 15:28:50 +08:00
{
idx++;
sWord += xsText[idx];
if (!IsGreeceChar(sWord))
{
iUp++;
}
}
else if (c > 127 && !IsGreeceChar(c))
{
iUp++;
}
m_ctrlInputText->SetSel(iLow, iUp);
LPSTR pst = new CHAR[2];
lLen = m_ctrlInputText->GetSelText(pst);
delete []pst;
2026-10-04 00:04:20 +08:00
if (lLen > 2L && iUp > iLow + 1) // 增加对word中拷贝的特殊格式的字符处理
2026-09-28 15:28:50 +08:00
{
--iUp;
m_ctrlInputText->SetSel(iLow, iUp);
}
sText = m_ctrlInputText->GetSelText();
if (sText.IsEmpty())
{
++iLow;
if (c == _T('\n'))
{
sTextShow += c;
}
continue;
}
CHARFORMAT cf;
m_ctrlInputText->GetSelectionCharFormat(cf);
2026-10-04 00:04:20 +08:00
// 16进制转化为10进制
2026-09-28 15:28:50 +08:00
CString sOx;
sOx.Format(_T("%d"), cf.yHeight);
double dDec = _tstof(sOx);
double dHeight = dDec / 50.5;
if (fabs(dHeight - 3.5) < 0.1)
{
dHeight = 3.5;
}
bool bUnderLine = false;
int nBool = 0;
if (cf.dwEffects & CFE_UNDERLINE)
{
bUnderLine = true;
nBool = 1;
}
if (cf.crTextColor != cfBefor || dHeight != dHeightBefor || bUnderLine != bUnderLineBefor)
{
CString sProp;
sProp.Format(_T("$%.0d|%.1f|%d$"), cf.crTextColor, dHeight, nBool);
sTextShow += sProp;
}
sTextShow += sWord;
cfBefor = cf.crTextColor;
dHeightBefor = dHeight;
bUnderLineBefor = bUnderLine;
iLow = iUp;
}
m_strInputText = sTextShow;
}
2026-10-04 00:04:20 +08:00
// zxl 2013.02.22 add 增加设定文字颜色功能
2026-09-28 15:28:50 +08:00
COLORREF CMutiRowTextDlg::GetCurColor(const int nPosCur)
{
int nPos = nPosCur;
COLORREF col = RGB(0, 0, 0);
#if (ADS >= 17)
nPos /= 2;
#endif
CString csText;
m_ctrlInputText->GetWindowText(csText);
XString xsText;
xsText=csText;
int nCount = (int)_tcslen(xsText);
int nIndex = 0;
for(int idx = 0; idx < nCount; idx++)
{
TCHAR c=xsText[idx];
2026-10-04 00:04:20 +08:00
if (c < 0 || c == _T('\n'))// 汉字
2026-09-28 15:28:50 +08:00
{
if (idx != nPos)
{
idx++;
}
else
{
break;
}
}
if (idx == nPos)
{
break;
}
nIndex++;
}
if (nIndex < m_vecCol.size())
{
col = m_vecCol[nIndex];
m_dCurTextHeight = m_vecHeight[nIndex];
}
return col;
}