HDC dc;
RECT r;
int in = 220;
//220 - это есть высота канвы. Текст прокручивается в данном примере снизу вверхъ
Плавные титры в Delphi (на подобии About на qip)
Хотел сделать плавные титры (в разделе о программе - подобное как в любим qip).
Искал во всём инете, нашёл пример только на С++ (немного разбираюсь), но при переводе на синтаксис Delphi выдаёт ошибки.
Вот код на С++:
Код:
Код:
in--;
String s = String("здесь идет очень-очень большой текст... См пример в аттаче.";
r.left = 10;
r.top = in;
r.right = 190;
r.bottom = 220;
SetTextColor(ima->Canvas->Handle, 0xff00ff);
//установили цвет выводимого текста
DrawText( ima->Canvas->Handle,
s.c_str(), s.Length(),
&r,
DT_WORDBREAK);
if (in<-210)//как только весь текст прокручен - начинаем заново прокрутку. Это подгоняется опытным путем
in = 220;
String s = String("здесь идет очень-очень большой текст... См пример в аттаче.";
r.left = 10;
r.top = in;
r.right = 190;
r.bottom = 220;
SetTextColor(ima->Canvas->Handle, 0xff00ff);
//установили цвет выводимого текста
DrawText( ima->Canvas->Handle,
s.c_str(), s.Length(),
&r,
DT_WORDBREAK);
if (in<-210)//как только весь текст прокручен - начинаем заново прокрутку. Это подгоняется опытным путем
in = 220;
Дошёл до Settextcolor и всё, начинает ругаться :confused:
помогите тогда перевести код с++ на синтаксис delphi, плиз!!!
Код:
TForm1=class(TForm)
..................
private
pos: integer;
R: TRect;
S: String;
................
..................
private
pos: integer;
R: TRect;
S: String;
................
Код:
procedure TForm1.FormShow(Sender: TObject);
begin
pos:=220;
Self.DoubleBuffered:=true;
Timer1.Interval:=10;
S:='ААААААААААААААААААААА'#10#13'ААААААААААААААААА'#10#13'АААААААААААААААААААА'#10#13'ААААААААААААААА'+
'ФФФФФФФФФФФФФФФФ'#10#13'ФФФФФФФФФФФФФФФФ'#10#13'ФФФФФФФФФФФФФФФФФФФФФФ'#10#13'ФФФФФФФФФФФФФФФФФФФ'+
'ИИИИИИИИИИИИГ'#10#13'ГГГГГГГГГГГГ'#10#13'ЕЕЕЕЕЕЕЕЕЕЕННННН'#10#13'НННННННННННООООО'#10#13'ОООООООООООООООО'+
'ДДДДДДДДДДДД'#10#13'ДДДДДД'#10#13'ДДДДДЛЛЛЛЛЛЛЛЛЛЛ'#10#13'ЛЛЛЛЛЛЛЛИИИИИИИИИ'#10#13'ИИИИИИИИННННН'#10#13'ННННННННН'+
'ЫЫЫЫЫЫЫЫЫЫЫЫ'#10#13'ЫЫЫЫЙЙЙЙЙЙЙЙЙЙЙ'#10#13'ЙЙЙЙЙЙЙЙЙЙЙЙЙЙ ТТТТТТТТТТТТТТТ';
end;
begin
pos:=220;
Self.DoubleBuffered:=true;
Timer1.Interval:=10;
S:='ААААААААААААААААААААА'#10#13'ААААААААААААААААА'#10#13'АААААААААААААААААААА'#10#13'ААААААААААААААА'+
'ФФФФФФФФФФФФФФФФ'#10#13'ФФФФФФФФФФФФФФФФ'#10#13'ФФФФФФФФФФФФФФФФФФФФФФ'#10#13'ФФФФФФФФФФФФФФФФФФФ'+
'ИИИИИИИИИИИИГ'#10#13'ГГГГГГГГГГГГ'#10#13'ЕЕЕЕЕЕЕЕЕЕЕННННН'#10#13'НННННННННННООООО'#10#13'ОООООООООООООООО'+
'ДДДДДДДДДДДД'#10#13'ДДДДДД'#10#13'ДДДДДЛЛЛЛЛЛЛЛЛЛЛ'#10#13'ЛЛЛЛЛЛЛЛИИИИИИИИИ'#10#13'ИИИИИИИИННННН'#10#13'ННННННННН'+
'ЫЫЫЫЫЫЫЫЫЫЫЫ'#10#13'ЫЫЫЫЙЙЙЙЙЙЙЙЙЙЙ'#10#13'ЙЙЙЙЙЙЙЙЙЙЙЙЙЙ ТТТТТТТТТТТТТТТ';
end;
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
begin
dec(pos);
r.left:=10;
r.top:=pos;
r.Right:=190;
r.Bottom:=220;
SetTextColor(Canvas.Handle,$ff00ff);
DrawText(Canvas.Handle,pchar(s),length(s),r,DT_WORDBREAK);
if pos<-410 then
pos:=220;
end;
begin
dec(pos);
r.left:=10;
r.top:=pos;
r.Right:=190;
r.Bottom:=220;
SetTextColor(Canvas.Handle,$ff00ff);
DrawText(Canvas.Handle,pchar(s),length(s),r,DT_WORDBREAK);
if pos<-410 then
pos:=220;
end;
а в memo или richedit подобное можно сделать?
В мемо или ричедит.... Можно, там же Canvas есть.
Код:
procedure TForm1.Timer1Timer(Sender: TObject);
var text_dc:hdc;
Canvas:TCanvas;
begin
dec(pos);
r.left:=10;
r.top:=pos;
r.Right:=190;
r.Bottom:=200;
canvas:=tcanvas.Create;
text_dc:=getdc(memo1.Handle);
canvas.Handle:=text_dc;
SetTextColor(Canvas.Handle,$000000);
DrawText(Canvas.Handle,pchar(s),length(s),r,DT_WORDBREAK);
if pos<-410 then pos:=220;
end;
var text_dc:hdc;
Canvas:TCanvas;
begin
dec(pos);
r.left:=10;
r.top:=pos;
r.Right:=190;
r.Bottom:=200;
canvas:=tcanvas.Create;
text_dc:=getdc(memo1.Handle);
canvas.Handle:=text_dc;
SetTextColor(Canvas.Handle,$000000);
DrawText(Canvas.Handle,pchar(s),length(s),r,DT_WORDBREAK);
if pos<-410 then pos:=220;
end;
тут же возник ещё вопрос - цвет шрифта мы поставили с помощью SetTextColor, а вот чтобы одна строка была одним цветом, а другая была другим и при этом выделена жирным???
Код:
1. Расчитываем высоту строки символов (есть функция API, не помню какая. Можно в канве взять Canvas.TextHeight('Mq'), будет макс. возможная высота строки).
2. Расчитываем Rect для первой строки (аналогично тому, как и расчитывал для всего текста)
3. Цикл по строкам, пока не кончатся
3.1. Устанавливаем цвет для строки
3.2. Выводим в Rect строку
3.3. Смещаем Rect вниз на высоту одной строки+промежуток между строками
2. Расчитываем Rect для первой строки (аналогично тому, как и расчитывал для всего текста)
3. Цикл по строкам, пока не кончатся
3.1. Устанавливаем цвет для строки
3.2. Выводим в Rect строку
3.3. Смещаем Rect вниз на высоту одной строки+промежуток между строками
С жирным думаю тот же принцип: вместе с цветом устанавливаешь параметры шрифта. Только надо будет учитывать, что "жирность" может менять и ширину, и высоту строки. Если строки по количеству букв/слов фиксированные (или не важно, влезет или нет, то бишь нет автопереносов) - то и ладно, просто на каждом шаге пересчитываем высоту строки (и то, если она будет от жирности меняться - по идее не должна, но кто его знает, может еще и от шрифта зависит).