如果控制绘制文本的行高

ysjyniiq 2013-04-13 11:18:20
一般来说,绘制一段文字,用DrawText或才DrawTextEx。DrawText能按照我的矩形自动换行,但问题来了,这换行的行高,不好控制。看下面一段文字:

我希望这两行的行间隔更短一下,或更宽一些。
如果通过更改字体来实现,字体参数如何?
谢谢各位!!
...全文
144 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ysjyniiq 2013-04-16
  • 打赏
  • 举报
回复
引用 1 楼 Mackz 的回复:
用GetTextExtentExPoint函数计算字符串分行数据,用PolyTextOut输出字符串,中间计算好行距设置每行输出的位置。 下面是Win32的代码: C/C++ code?1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950v……
果然大神,结帖结分。
菜牛 2013-04-14
  • 打赏
  • 举报
回复
用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);
}
这段代码没有考虑英文单词的分词。

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧