duilib 显示文字 调用的是::DrawText() ,换行需要设置属性.wordbreak.
else if( _tcsicmp(pstrName, _T("wordbreak")) == 0 ) {
if( _tcsicmp(pstrValue, _T("true")) == 0 ) {
m_uTextStyle &= ~DT_SINGLELINE;
m_uTextStyle |= DT_WORDBREAK | DT_EDITCONTROL;
}
else {
m_uTextStyle &= ~DT_WORDBREAK & ~DT_EDITCONTROL;
m_uTextStyle |= DT_SINGLELINE;
}
}
此时 DT_SINGLELINE 属性清除.
而 显示居中的时候设置属性 valing.
此时:
if (_tcsstr(pstrValue, _T("vcenter")) != NULL) {
m_uTextStyle &= ~(DT_TOP | DT_BOTTOM);
m_uTextStyle |= (DT_VCENTER | DT_SINGLELINE);
}
有需要 设置DT_SINGLELINE 属性,导致冲突, 垂直居中失效.
完善方法: 我主要在CTEXTUI中添加支持.
CDuiRect CTextUI::GetTextRect(SIZE szAvailable)
{
RECT rcText = { 0, 0, MAX(szAvailable.cx, m_cxyFixed.cx), 9999 };
rcText.left += m_rcTextPadding.left;
rcText.right -= m_rcTextPadding.right;
if( m_bShowHtml ) {
int nLinks = 0;
CRenderEngine::DrawHtmlText(m_pManager->GetPaintDC(), m_pManager, rcText, m_sText, m_dwTextColor, NULL, NULL, nLinks, DT_CALCRECT | m_uTextStyle);
}
else {
CRenderEngine::DrawText(m_pManager->GetPaintDC(), m_pManager, rcText, m_sText, m_dwTextColor, m_iFont, DT_CALCRECT | m_uTextStyle);
}
SIZE cXY = {rcText.right - rcText.left + m_rcTextPadding.left + m_rcTextPadding.right,
rcText.bottom - rcText.top + m_rcTextPadding.top + m_rcTextPadding.bottom};
return rcText;
}
void CTextUI::PaintText(HDC hDC)
{
if( m_sText.IsEmpty() ) {
m_nLinks = 0;
return;
}
if( m_dwTextColor == 0 ) m_dwTextColor = m_pManager->GetDefaultFontColor();
if( m_dwDisabledTextColor == 0 ) m_dwDisabledTextColor = m_pManager->GetDefaultDisabledColor();
if( m_sText.IsEmpty() ) return;
m_nLinks = lengthof(m_rcLinks);
RECT rc = m_rcItem;
rc.left += m_rcTextPadding.left;
rc.right -= m_rcTextPadding.right;
rc.top += m_rcTextPadding.top;
rc.bottom -= m_rcTextPadding.bottom;
int iadd = 0;
if(bVcenterForce){
SIZE szAvailable = { rc.right - rc.left, rc.bottom - rc.top };
CDuiRect rcText = GetTextRect(szAvailable);
iadd = ((rc.bottom - rc.top) - (rcText.bottom - rcText.top)) / 2;
if(iadd <0) iadd = 0;
}
rc.top += iadd;
if( IsEnabled() ) {
if( m_bShowHtml )
CRenderEngine::DrawHtmlText(hDC, m_pManager, rc, m_sText, m_dwTextColor, \
m_rcLinks, m_sLinks, m_nLinks, m_uTextStyle);
else
CRenderEngine::DrawText(hDC, m_pManager, rc, m_sText, m_dwTextColor, \
m_iFont, m_uTextStyle);
}
else {
if( m_bShowHtml )
CRenderEngine::DrawHtmlText(hDC, m_pManager, rc, m_sText, m_dwDisabledTextColor, \
m_rcLinks, m_sLinks, m_nLinks, m_uTextStyle);
else
CRenderEngine::DrawText(hDC, m_pManager, rc, m_sText, m_dwDisabledTextColor, \
m_iFont, m_uTextStyle);
}
}
代码 添加GetTextRect 获取绘制文字区域, 然后设置绘制的偏移量. (已下是修改后对比.)