提供一個實用函式,在指定矩形範圍內以任意角度旋轉繪製文字,支援裁切與不透明背景選項。
void DrawRotatedText(CDC* pDC, const CString str, CRect rect,
double angle, UINT nOptions);
pDC:裝置環境指標str:顯示文字rect:顯示範圍矩形angle:旋轉角度(度數)nOptions:ExtTextOut 旗標(ETO_CLIPPED、ETO_OPAQUE)
void DrawRotatedText(CDC* pDC, const CString str, CRect rect,
double angle, UINT nOptions) {
// 角度轉弧度
double pi = 3.141592654;
double radian = pi * 2 / 360 * angle;
// 取得文字尺寸與中心點
CSize textSize = pDC->GetTextExtent(str);
CPoint center(textSize.cx / 2, textSize.cy / 2);
// 計算旋轉後中心點偏移
CPoint rCenter(
long(cos(radian) * center.x - sin(radian) * center.y),
long(sin(radian) * center.x + cos(radian) * center.y)
);
// 設定文字對齊與背景模式
pDC->SetTextAlign(TA_BASELINE);
pDC->SetBkMode(TRANSPARENT);
// 繪製旋轉文字
pDC->ExtTextOut(
rect.left + rect.Width() / 2 - rCenter.x,
rect.top + rect.Height() / 2 + rCenter.y,
nOptions, &rect, str, NULL
);
}
// 在矩形 (100,100,300,300) 內,逆時針旋轉 15 度繪製文字
DrawRotatedText(pDC, "VC知識庫", CRect(100,100,300,300), 15, ETO_CLIPPED);
TA_BASELINE 設定基線對齊,配合 ExtTextOut 精確控制輸出位置。nOptions 可控制是否裁切矩形外像素(ETO_CLIPPED)與是否填充不透明背景(ETO_OPAQUE)。