Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.01.21;
Скачать: [xml.tar.bz2];

Вниз

Вывод текста по кругу (поправьте плиз алгоритм)   Найти похожие ветки 

 
Roman_   (2001-11-19 00:06) [0]

Вопрос теперь такой: а как выводить текст по кругу???
Кидаю то, что я написал. Немного криво вышло, в том то и проблема. Может кто то, что то посоветует?

const
mx: Integer = -10; //отступ от края канвы
my: Integer = -10; //отступ от края канвы
sangle: Integer = 0; //начальный угол
eangle: Integer = 360; //конечный угол
drawing_text: String = "This is the TEST"; //текст


procedure TForm1.PBoxPaint(Sender: TObject);
//возвращает ширину (высоту) прямоугольника деленную на два
function RectDiv2(ARect: TRect; AHeight: Boolean): Integer;
begin
if AHeight then Result:= (ARect.Bottom - ARect.Top) div 2 else
Result:= (ARect.Right - ARect.Left) div 2;
end;
var
px, py, i, a: Integer;
oldf: TFont;
logf: TLogFont;
ts: TSize;
s: String;
begin
with PBox.Canvas do
begin
//чистим канву
Brush.Color:= clWhite;
Pen.Color:= clBlack;
Pen.Width:= 1;
Rectangle(ClipRect);
r:= ClipRect;
//круг вокру которого выводим текст
InflateRect(r, mx, my);
Ellipse(r);
//font routin
//переназначаем шрифтыи иполучаем LogFont канвы
oldf:= TFont.Create;
oldf.Assign(Font);
Font.Size:= 12;
GetObject(Font.Handle, sizeof(TLogFont), @logf);
//drawing routin
s:= drawing_text + " "; //пробел в конце (для углов 1:0; 2:360;)
//угол смещения
a:= (eangle - sangle) div (Length(s) - 1);
for i:= 0 to Length(s) -1 do
begin
//координата Х буквы
px:= Trunc(-RectDiv2(r, false)*cos((sangle + a*i)*Pi/180) + (RectDiv2(r, false) + abs(mx)));
//координата У буквы
py:= Trunc(-RectDiv2(r, true)*sin((sangle + a*i)*Pi/180) + (RectDiv2(r, true) + abs(my)));
//поворот буквы: 90 градусов минус угол смещения
logf.lfEscapement:= (90 - (sangle + a*i))*10;
logf.lfPitchAndFamily:= DEFAULT_PITCH or FF_DONTCARE;
logf.lfQuality:= PROOF_QUALITY;
//просьба не ставить MS Sans Serif, не будет работать
logf.lfFaceName:= "Times New Roman";
//создаем временный фонт и назначаем его текущему на канве
Font.Handle:= CreateFontIndirect(logf);
SetBkMode(Handle, TRANSPARENT);
//получаем высоту, ширину буквы выведеной новым шрифтом
// и обновляем координаты
ts:= TextExtent(s[i + 1]);
if px < (RectDiv2(r, false) + abs(mx)) then Dec(px, ts.cx div 2) else Inc(px, ts.cx div 2);
if py < (RectDiv2(r, true) + abs(my)) then Dec(py, ts.cy div 2) else Inc(py, ts.cy div 2);
//выводим букву
TextOut(px, py, s[i + 1]);
end;
Font.Assign(oldf);
oldf.Free;
end;
end;


 
Roman_   (2001-11-19 10:11) [1]

А что если выводить буквы на временном битмапе, а потом его вращать и копировать в основную канву?



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.01.21;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.55 MB
Время: 0.015 c
3-66177
NewComer
2001-12-17 12:18
2002.01.21
Помогите разобраться с FastReport 2.44


4-66392
ctapik
2001-11-19 20:17
2002.01.21
Как получить хендл на System Image List


14-66355
Simonaln
2001-11-26 16:31
2002.01.21
ПО для тестировния


14-66358
Merlin
2001-11-22 23:53
2002.01.21
Вопрос, который меня мучает уже больше месяца...


7-66379
dinamit
2001-10-06 16:02
2002.01.21
По поводу параллельного программирования





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский