15,980
社区成员




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);
}
这段代码没有考虑英文单词的分词。