Библиотека программиста

16.04.2024 - Как вывести текст по окружности?

Изменяя аргумент iAngle, можно вращать начальную точку - центр. А изменяя iSector можно выводить текст как по окружности, так и по дуге (она задается в градусах). Наверняка многие видели такой эффектик. Какой-нибудь текст крутится вокруг центра и меняется его радиус - расстояние от центра до букв. И тут можно такое же сделать. Для этого надо вызывать эту процедуру по таймеру, где перед вызовом изменять iAngle и iR (переменные завести). Только перед каждым рисованием, надо в этой функции очищать уже нарисованное, чтобы не оставалось старого. А если это непосредственно на канве делается медленно и мигает, но надо рисовать на битмапе и оттуда изображение копировать.

Код
void DrawCircularText (TCanvas *Canvas, AnsiString asFontName, int iHeight, char *szText, int iAngle, int iR, int iCX, int iCY, int iSector)
{
LOGFONT lf; // создаем объект для нестандартного шрифта
HFONT hPrevFont, hFont;
int iPass = iSector/lstrlen(szText); // расстояние между буквами
ZeroMemory(&lf,sizeof(lf));
lf.lfCharSet=RUSSIAN_CHARSET; // для русского языка
lf.lfWeight = 900; // чтоб хоть видно было! Хотя можно убрать
for (int i=0;i<lstrlen(szText);i++)
{
lf.lfEscapement = 10*iAngle-(10*iPass*(i-1)); // угол
lstrcpy(lf.lfFaceName,asFontName.c_str()); // имя шрифта
lf.lfHeight = iHeight; // устанавливаем высоту
hFont = CreateFontIndirect(&lf); // создаем непосредственно шрифт
hPrevFont = SelectObject (Canvas->Handle, hFont); // делаем шрифт hFont
Canvas->TextOut (iCX+iR*sin((-180+iAngle-(i-1)*iPass)*3.14/180),iCY+iR*cos((-180+iAngle-(i-1)*iPass)*3.14/180),szText [i]); // выводим символ
hFont = SelectObject(Canvas->Handle, hPrevFont); // обратно меняем шрифт
DeleteObject (hFont); // удаляем
}
}

Опубликовано на сайте: http://www.coders-library.ru
Прямая ссылка: http://www.coders-library.ru/index.php?name=news&op=view&id=230