Magic_Game/Easy2D/Node/EText.cpp

154 lines
2.9 KiB
C++

#include "..\enodes.h"
#include "..\Win\winbase.h"
e2d::EText::EText()
: m_bWordWrapping(false)
, m_pFont(nullptr)
, m_fWordWrappingWidth(0)
{
this->setFont(new EFont());
}
e2d::EText::EText(const EString & text)
: EText()
{
this->setText(text);
this->setFont(new EFont());
}
e2d::EText::EText(EFont * font)
: EText()
{
this->setFont(font);
}
e2d::EText::EText(const EString & text, EFont * font)
: EText()
{
this->setText(text);
this->setFont(font);
}
e2d::EText::EText(const EString & text, EString fontFamily, float fontSize, UINT32 color, UINT32 fontWeight, bool italic)
{
this->setText(text);
this->setFont(new EFont(fontFamily, fontSize, color, fontWeight, italic));
}
e2d::EText::~EText()
{
SafeRelease(&m_pFont);
}
e2d::EString e2d::EText::getText() const
{
return m_sText;
}
float e2d::EText::getWidth() const
{
return m_fWordWrappingWidth * m_fScaleX;
}
float e2d::EText::getRealWidth() const
{
return m_fWordWrappingWidth;
}
e2d::EFont * e2d::EText::getFont() const
{
return m_pFont;
}
void e2d::EText::setText(const EString & text)
{
m_sText = text;
_initTextLayout();
}
void e2d::EText::setFont(EFont * font)
{
if (font)
{
SafeRelease(&m_pFont);
m_pFont = font;
font->retain();
_initTextLayout();
}
}
void e2d::EText::setWordWrapping(bool value)
{
m_bWordWrapping = value;
_initTextLayout();
}
void e2d::EText::setWordWrappingWidth(float wordWrapWidth)
{
m_fWordWrappingWidth = max(wordWrapWidth, 0);
_initTextLayout();
}
void e2d::EText::_onRender()
{
GetSolidColorBrush()->SetColor(D2D1::ColorF(m_pFont->m_Color, m_fDisplayOpacity));
GetRenderTarget()->DrawTextW(
m_sText.c_str(),
UINT32(m_sText.length()),
m_pFont->_getTextFormat(),
D2D1::RectF(
0,
0,
m_bWordWrapping ? m_fWordWrappingWidth : m_Size.width,
getRealHeight()
),
GetSolidColorBrush()
);
}
void e2d::EText::_initTextLayout()
{
// 未设置字体或空字符串时,文本宽高为 0
if (!m_pFont || m_sText.empty())
{
this->_setHeight(0);
m_fWordWrappingWidth = 0;
return;
}
// 未打开文本自动换行时,设置 TextFormat 属性为不换行
if (!m_bWordWrapping)
{
m_pFont->_getTextFormat()->SetWordWrapping(DWRITE_WORD_WRAPPING_NO_WRAP);
}
else
{
m_pFont->_getTextFormat()->SetWordWrapping(DWRITE_WORD_WRAPPING_WRAP);
}
// 获取 TextLayout
IDWriteTextLayout * pDWriteTextLayout = nullptr;
HRESULT hr = GetDirectWriteFactory()->CreateTextLayout(
m_sText.c_str(),
UINT32(m_sText.size()),
m_pFont->_getTextFormat(),
m_bWordWrapping ? m_fWordWrappingWidth : 0,
0,
&pDWriteTextLayout
);
ASSERT(SUCCEEDED(hr), "Create IDWriteTextFormat Failed!");
// 获取文本布局的宽度和高度
DWRITE_TEXT_METRICS metrics;
pDWriteTextLayout->GetMetrics(&metrics);
this->_setSize(metrics.widthIncludingTrailingWhitespace, metrics.height);
m_fWordWrappingWidth = metrics.widthIncludingTrailingWhitespace;
// 删除相关资源
SafeReleaseInterface(&pDWriteTextLayout);
}