很多时候需要文本折行输出,我所使用的文本折行有两种方式:
1.使用DrawText,传入属性DT_CALCRECT,DrawText可以返回文本的高度,具体用法为:
int textHeight = pDC->DrawText(strText, -1, rcDraw,DT_CALCRECT | DT_WORDBREAK | DT_EDITCONTROL| DT_NOPREFIX | DT_EXTERNALLEADING);
textheight就是多行文本的高度,drawtext会自动计算rcdraw的rect区域。但是,我在使用过程中发现,使用drawtext,函数返回的文本高度优势并不准确,可能会有误差,结果造成文本的丢失,所以为了准确,我一般会使用下面一种方式。
2.使用TEXTMETRIC获得当前所选字体尺寸。
int GetTextHeight( CString strText)
{
CDC* pDC = GetDC();
CFont* pFont = &m_Font;
CFont*poldFont = pDC->SelectObject(pFont);
int leftmargin = 0,rightmargin = 10; //已知左右边界。
TEXTMETRIC tmtext;
pDC->GetTextMetrics(&tmtext);
int charY = tmtext.tmHeight,charX = tmtext.tmAveCharWidth;
int line = 1; //行数初始化为1
CSize sizetext(0,0);
for (int i =0; i< strText.GetLength();i++)
{
sizetext.cx += charX;
if (sizetext.cx + leftmargin > rightmargin)
{
line++;
sizetext.cx = 0;
}
}
pDC->SelectObject(poldFont);
return line * charY; //行数乘单行高度。
}
获得行数和文本宽度后,可以使用drawtext或textout输出文本。
使用textout输出文本。
void DrawText(CString strtext,CDC dc)
{
TEXTMETRIC tm;
dc.GetTextMetrics(&tm);
int charX = tm.tmAveCharWidth;
int chayY = tm.tmHeight;
CSize sizetext(0,0);
int charNum = 0;
CRect rcText(lpDrawItemStruct->rcItem );
CString strDraw = strText;
for (int i =0; i< strText.GetLength();i++)
{
sizetext.cx += charX;
if (sizetext.cx + rcText.left > rcText.right)
{
sizetext.cx = 0;
dc.TextOut(rcText.left, rcText.top,strDraw,charNum);
strDraw = strDraw.Mid(charNum,strDraw.GetLength()-charNum);
rcText.top += chayY;
charNum = 0;
}
charNum++;
}
dc.TextOut(rcText.left, rcText.top,strDraw);
}