首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

如其控制绘制文本的行高

2013-04-20 
如果控制绘制文本的行高一般来说,绘制一段文字,用DrawText或才DrawTextEx。DrawText能按照我的矩形自动换行

如果控制绘制文本的行高
一般来说,绘制一段文字,用DrawText或才DrawTextEx。DrawText能按照我的矩形自动换行,但问题来了,这换行的行高,不好控制。看下面一段文字:
如其控制绘制文本的行高
我希望这两行的行间隔更短一下,或更宽一些。
如果通过更改字体来实现,字体参数如何?
谢谢各位!!
[解决办法]
用GetTextExtentExPoint函数计算字符串分行数据,用PolyTextOut输出字符串,中间计算好行距设置每行输出的位置。
下面是Win32的代码:

void OnDraw(HWND hWnd, HDC hdc)
{
TCHAR szText[] = _T("一般来说,绘制一段文字,用DrawText或才DrawTextEx。DrawText能按照我的矩形自动换行,但问题来了,这换行的行高,不好控制。看下面一段文字:");
int nLineWidth = 300;// 行宽
int nLineHeight = 30;// 行高
int nMaxLines = 10;// 一次绘制最大行数
int nLeft = 20, nTop = 20, nRight = 20, nBottom = 20;
SIZE stSize;

RECT rcClient;
GetClientRect(hWnd, &rcClient);
//nLineWidth = rcClient.right - rcClient.left - nLeft - nRight;

HFONT hOldFont = (HFONT)SelectObject(hdc, GetStockObject(DEFAULT_GUI_FONT));

TEXTMETRIC tmText = {0};
GetTextMetrics(hdc, &tmText);

nLineHeight = 3 * tmText.tmHeight;// 三倍行距
nMaxLines = (rcClient.bottom - rcClient.top - nTop - nBottom) / nLineHeight;

PPOLYTEXT pPolyText = new POLYTEXT[nMaxLines];
ZeroMemory(pPolyText, sizeof(POLYTEXT) * nMaxLines);

pPolyText->x = nLeft + 2 * tmText.tmMaxCharWidth;// 绘制起始点坐标,首行2字符缩进
pPolyText->y = 20;// 绘制起始点坐标
pPolyText->n = _tcslen(szText);
pPolyText->lpstr = szText;

int nLines = 0;
for (nLines = 1; nLines < nMaxLines; nLines++)
{
// 计算每行的位置和字符串分行点
pPolyText[nLines].n = pPolyText[nLines - 1].n;
GetTextExtentExPoint(hdc, pPolyText[nLines - 1].lpstr, pPolyText[nLines - 1].n,
nLineWidth, (int*)&pPolyText[nLines - 1].n, NULL, &stSize);
if (pPolyText[nLines].n == pPolyText[nLines - 1].n)
{
break;
}
pPolyText[nLines].lpstr = pPolyText[nLines - 1].lpstr + pPolyText[nLines - 1].n;
pPolyText[nLines].n -= pPolyText[nLines - 1].n;
pPolyText[nLines].x = nLeft;
pPolyText[nLines].y = pPolyText[nLines - 1].y + nLineHeight;
}
PolyTextOut(hdc, pPolyText, nLines);
delete[] pPolyText;

SelectObject(hdc, hOldFont);
}
这段代码没有考虑英文单词的分词。

热点排行