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