Как-то раз мне понадобилась функция, которая могла бы вращать текст внутри прямоугольника. Проблема состоит в том, что 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); }
|