TextOut只能输出单行文本 DrawTextEx输出的文本是固定行距的(行距很小) 而且速度也很慢 所以我自己写了一个函数 主要思想是先用GetTextExtent 循环地计算出多少字符可以显示在一行 然后用TextOut输出文字 // 自定义行距的文字输出 带自动换行 // pDC: 需要绘图的DC // strText: 需要输出的字符串 // pRect: 输出的位置 bottom成员过小不会阻止文字输出 函数将返回实际的文字底部位置于bottom成员 // bCalcRect: 当true时,不对pDC进行实际的绘制操作.仅返回pRect->bottom文字的底部位置 // iRowSpacing: 行距 像素单位 void CScrollWnd::DrawTextLayout (CDC *pDC, LPCTSTR strText, LPRECT pRect, bool bCalcRect, int iRowSpacing) { if (pRect->right == 0) return; int iStrLen = lstrlen (strText); SIZE size; size.cx = 0; size.cy = 0; int iY = pRect->top; const wchar_t *pStrLine = strText; bool bEndLine = false; int i; while (!bEndLine) { i = 1; size .cx = 0; while (size.cx < pRect->right - pRect->left) { if (!pStrLine[i]) { bEndLine = true; break; } if (pStrLine[i] == L'/r' && pStrLine[i + 1] == L'/n') { i += 2; break; } size = pDC->GetTextExtent (pStrLine, i + 2); i ++; } //i -= 2; if (!pStrLine[i]) bEndLine = true; if (!bCalcRect) { if (bEndLine) pDC->TextOutW (pRect->left, iY, pStrLine, i + 1); else pDC->TextOutW (pRect->left, iY, pStrLine, i); } iY = iY + size.cy + iRowSpacing; pStrLine += i; } pRect->bottom = iY; }