多行文本绘制

CPaintDC   dc(this);   //   用于绘制的设备上下文
CString   str=   "abcde\r111 ";
dc.DrawText(str,CRect(10,10,100,100),DT_CENTER);
WIN32代码:
  const   char   *p   = "abcde\r111 ";
  HDC   hdc   =   ::GetDC(m_hWnd);
  RECT   rc={10,10,100,100};
  ::DrawText(hdc,p,strlen(p),&rc,DT_CENTER);
  ::ReleaseDC(m_hWnd,hdc);
TextOut()只能输出一行文本,因为DrawText()不能实现左,右,左下,下,右下的对齐方式所以还行用到TextOut(),但你就要计算要输出文本的行数,最大行宽,每行输出位置了,这些参数要你CDC用的CFont有关,可通过pDc-> GetTextExtent()得到当前字体输出时的长宽

//计算多行不压缩时,文本输出的长度和宽度
//参数:nSigleHeigth   单行平均高度
// nNum   行数
//                                 将每行字符放入strArray中
CSize   CCell::CalMulLneTextSize(CDC*   pDc,   CStringArray&   strArray,   int&   nSigleHeigth,   int&   nNum)
{
int   nLength   =   m_strText.GetLength();
int   nPrePos   =   -1; //上一个回车的位置
int   nMaxCx   =   0; //最长行的长度,最长行不一定字数最多
int   nCy   =   0;
nNum   =   0;
CSize   size(0,0);
for   (int   i=0;   i <nLength;   i++)
{
if(m_strText[i]   ==   '\n ')
{
nNum++;
CString   strTemp   =   m_strText.Mid(nPrePos+1,i-nPrePos);
strArray.Add(strTemp);
size   =   pDc-> GetTextExtent(strTemp);
nCy   +=   size.cy;
if   (size.cx   >   nMaxCx)
nMaxCx   =   size.cx;

nPrePos   =   i;
}
}

//最后一个不是回车换行
if   (m_strText[nLength-1]   !=   '\n ')
{
CString   strTemp   =   m_strText.Mid(nPrePos+1,nLength-1-nPrePos);
strArray.Add(strTemp);
size   =   pDc-> GetTextExtent(strTemp);
nCy   +=   size.cy;
nNum   ++;
if   (size.cx   >   nMaxCx)
nMaxCx   =   size.cx;
}

size.cx   =   nMaxCx;
size.cy   =   nCy;
if   (nNum   >   0)
nSigleHeigth   =   nCy/nNum;
else
nSigleHeigth   =   nCy;

return   size;
}


你可能感兴趣的:(多行文本绘制)