Простое вращение текста.
Автор: Stefan Schwedt
Как-то раз мне понадобилась функция, которая
могла бы вращать текст внутри прямоугольника.
Проблема состоит в том, что Windows позволяет
вращать текст вокруг левого нижнего угла
указанного текста. Здесь приводится решение
данной проблемы.
Совместимость: VC 4-6, Win95-98,
NT4, W2K, MFC
Сперва создайте CFont с углом вращения,
указанным в nEscapement. Укажите Вашему DC на этот
фонт и вызовите следующую функцию:
#include <cmath>
// pDC : указатель на контекст устройства
// str : сам текст
// rect: собственно квадрат
// nOptions: может быть комбинацией ETO_CLIPPED и ETO_OPAQUE (см. функцию ExtTextOut)
void DrawRotatedText(CDC* pDC, const CString str, CRect rect,
double angle, UINT nOptions = 0)
{
// преобразуем угол в радианы
double pi = 3.141592654;
double radian = pi * 2 / 360 * angle;
// получаем центр невращаемого текста
CSize TextSize = pDC->GetTextExtent(str);
CPoint center;
center.x = TextSize.cx / 2;
center.y = TextSize.cy / 2;
// теперь вычисляем центр вращаемого текста
CPoint rcenter;
rcenter.x = long(cos(radian) * center.x - sin(radian) * center.y);
rcenter.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);
}
|