VC文本折行输出,计算行数。

来源:互联网 发布:创想软件技术有限公司 编辑:程序博客网 时间:2024/04/29 10:30

很多时候需要文本折行输出,我所使用的文本折行有两种方式:

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);}



0 0