DrawText换行
2017-01-04 11:36
323 查看
函数原型
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;
}
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++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- 关于C#中排序函数的总结
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ASP下经常用的字符串等函数参考资料
- PostgreSQL教程(五):函数和操作符详解(1)
- DOS批处理 函数定义与用法
- asp Chr 函数 数字转字母的方法
- Lua中的函数精讲笔记
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中调用C++函数示例
- Lua实现split函数
- Lua常用时间函数使用实例
- Lua函数与字符串处理简明总结