您的位置:首页 > 编程语言 > C语言/C++

DrawText换行

2017-01-04 11:36 323 查看
函数原型
int DrawText(
HDC hDC, // 设备描述表句柄
LPCTSTR lpString, // 将要绘制的字符串
int nCount, // 字符串的长度
LPRECT lpRect, // 指向矩形结构RECT的指针
UINT uFormat // 正文的绘制选项
);


1.一般情况是将uFormat设置成DT_WORDBREAK,但是这种当遇到连续字母或者数字就认为是一个单词,换行就不灵光了,那么我们只能自己计算

2.直接上代码了,调用

drawTextEx(hDC, ws.c_str(), rc, color, DT_EDITCONTROL | DT_LEFT);
int drawTextEx(HDC hDC, CDuiString sText, RECT &destRC, DWORD color, UINT uFormat)
{
::SetTextColor(hDC, RGB(GetBValue(color), GetGValue(color), GetRValue(color)));
int nCount;
CDuiString sDraw, sLeft,sTemp;
sDraw.Empty();
sLeft = sText;
LPCTSTR lpString = sText.GetData();
int nTolLength = sText.GetLength();

SIZE szStr;
CDuiString lpStr;

int nWidth = destRC.right - destRC.left; // Rect width

nCount = 1;
while (nTolLength > 0)
{
//如果绘制的字字符串本身带有格式,有换行符。这里需将nCount置于1。要遍历每个字符是否为换行符
//nCount=1;
if (nCount > nTolLength)
nCount = nTolLength;
lpStr = sLeft.Left(nCount);
::GetTextExtentPoint32(hDC, lpStr.GetData(), nCount, &szStr);
if (szStr.cx < nWidth)
{
while (szStr.cx < nWidth && nCount < nTolLength)
{
// 保留原来的格式。有换行符时直接换行
sTemp = sLeft.Mid(nCount - 1, 1);
if (sTemp == _T("\r") || sTemp == _T("\n")) //如果是换行符。直接换行。
{
sDraw += sLeft.Left(nCount);
sLeft = sLeft.Right(sLeft.GetLength() - nCount);
nTolLength -= nCount;
continue;
}

nCount++;
lpStr = sLeft.Left(nCount);
::GetTextExtentPoint32(hDC, lpStr, nCount, &szStr);
}
if (szStr.cx > nWidth)
nCount--;
}
else
{
while (szStr.cx > nWidth && nCount > 1)
{
nCount--;
lpStr = sLeft.Left(nCount);
::GetTextExtentPoint32(hDC, lpStr, nCount, &szStr);
}
}
// 如果在需要换行的地方后面出现换行符,则不需要手动换行

if (sLeft.GetLength() > nCount)
sTemp = sLeft.Mid(nCount, 1);
else
sTemp = _T("");

if (sTemp == _T("\r") || sTemp == _T("\n"))
sDraw += sLeft.Left(nCount);
else
sDraw += sLeft.Left(nCount) + _T("\r");

sLeft = sLeft.Right(sLeft.GetLength() - nCount);
nTolLength -= nCount;

}
HFONT hOldFont = (HFONT)::SelectObject(hDC, m_pManager->GetFont(0));
::DrawText(hDC, sDraw, sDraw.GetLength(), &destRC, uFormat);
::SelectObject(hDC, hOldFont);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  函数 c++