Конференция "KOL" » Титры
 
  • Крош (08.02.12 11:08) [0]
    Добрый день, Уважаемые знатоки. Подскажите пожалуйста, как реализовать эффект бесконечных титров (вертикального скроллинга текста). Прокрутка мемо (всем устраивает, если бы не дергались строки, т.е. не плавно прокручиваются), перемещение метки тоже не вариант (дергается). Подскажите как такое сотворить. Пример будет только в радость, который приму с великой благодарностью.
  • Крош (08.02.12 11:12) [1]
    P.S.
    Текст не фиксированный, а подгружается из текстового файла.
  • Vladimyr © (08.02.12 14:19) [2]
    можно рисовать текст на канве...
    конечно, придётся чуток разобраться, как именно, но это несложно
    зато потом можно делать это абсолютно так, как хочется!
  • Крош (10.02.12 00:25) [3]
    Плиз. Подскажите.
    ...
    Timer1: TKOLTimer;
    PB2: TKOLPaintBox;
    ...
    x,y,i:Integer;
    s:PStrList;
    ...
    procedure TForm1.KOLFormFormCreate(Sender: PObj);
    begin
    x:=PB2.Width div 7;
    y:=PB2.Height;
    i:=1;
    PB2.Font.FontName:='Tahoma';
    s:=NewStrList;
    s.LoadFromFile('readme.txt');
    end;

    procedure TForm1.Timer1Timer(Sender: PObj);
    begin
    y:=y-1;
    if y=-10*s.Count then y:=PB2.height+10;
    PB2.Canvas.Font.Color:=$000576DC;
    for i:=1 to s.Count do begin
    PB2.Canvas.TextOut(x,y+10*i, s.Items[i]);
    end;

    Все рисуется, крутится, однако сильно сомневаюсь в правильности сего решения.
    1. немного мерцает (но с прокруткой мемо не сравнить),
    2. Как правильно добиться  вывода текста по центру.
  • Крош (10.02.12 01:28) [4]
    Обнаружил архив форума, если скачать, то как его локально можно смотреть?
  • G-Host © (10.02.12 02:07) [5]
    1. Таймер должен только изменять переменную y и вызывать перерисовку необходимой области. Сама работа с канвой должна проходить в методе OnPaint.
    2. Получай размер строки при помощи TCanvas.TextExtent
  • Vladimyr © (10.02.12 09:17) [6]
    я делал так:
    1. создавал два битмапа
    2. рисовал на одном текст
    3. выводил его на канву
    4. рисовал текст на другом
    5. менял их местами
    ничего не мерцает, работает мухой даже на очень медленных
    процах (КПК)

    чтобы отцентрировать текст, надо исп. ф-цию рисования,
    которая не рисует, но позволяет узнать получившийся размер
    (не помню, как она называется), затем рассчитать новое
    положение текста, уже зная размер, который он займёт...
    и потом рисовать "по-настоящему"
  • Vladimyr © (10.02.12 09:17) [7]
    собссно, TextExtent :))
  • Крош (10.02.12 11:36) [8]
    Спасибо Вам всем. Все переделал.
    Vladimyr, а можно увидеть Ваше решение? Для меня пока все это немного туманно, поэтому буду рад посмотреть как Вы это реализовали.
  • Крош (11.02.12 00:55) [9]
    Под семеркой с аэро, PaintBox почему то становится прозрачным. Под XP все нормально, под 7 с упрощенной темой тоже. Что не так?
  • Крош (11.02.12 11:32) [10]
    При создании формы:
    Bmp2 := NewBitmap( PB2.Width, PB2.Height );
    Bmp2.BkColor:=clBlack;
    В событие отрисовки PaintBox, перед рисованием на канве добавил
    Bmp2.Draw(PB2.Canvas.Handle,0,0);
    Теперь PaintBox не прозрачный, но сильно мерцает :(
  • RusSun © (11.02.12 20:32) [11]
    Всем привет)
    to Vladimir можно посмотреть на Ваше решение )
    у меня тоже простенький вариант получился а вот

    > 5. менял их местаминичего не мерцает, работает мухой даже
    > на очень медленных

    не очень получается.
  • Крош (14.02.12 19:25) [12]
    Вывожу текст:
    DrawText(PaintBox.Canvas.Handle,pchar(s),length(s),r,DT_CENTER);
    Никак не могу изменить шрифт и цвет(рисует черным цветом с белым фоном). Ясен день, что как то просто, но не получается....
  • RusSun © (14.02.12 19:57) [13]
    PaintBox.Font.FontHeight := 30;

    PaintBox.Canvas.Font.Color := TColor(clBlue);

  • Крош (14.02.12 20:03) [14]
    Сорри, как и думал, малость тупанул.
  • Крош (14.02.12 20:08) [15]
    to RusSun
    так почемуто не работает...
    а вот так пашет:
    SetTextColor(PaintBox.Canvas.Handle,clWhite);
  • RusSun © (14.02.12 20:12) [16]
    procedure TimerTimer(Dummy : Pointer;Sender:PControl);
    begin
    y:=y-2;
    if y=-10*s.Count then y:=PB2.height+20;
    //PB2.Canvas.Font.Color:=$008000 ;//$000576DC
    PB2.Font.FontHeight := 30;

    PB2.Canvas.Font.Color := TColor(clBlue);
    //PB2.canvas.font
    for i:=1 to s.Count do begin
    PB2.Canvas.TextOut(x,y+20*i, s.Items[i]);

                            end;

    end;

  • RusSun © (14.02.12 20:17) [17]
  • Крош (14.02.12 20:44) [18]
    Это да, в этом случае без проблем, но если использовать не TextOut, а DrawText (красивее выводится текст):
    ...
    pos: integer;
    R: TRect;
    ...
    pos:=PB2.Top;
    ...
    procedure TForm1.Timer1Timer(Sender: PObj);
    begin
    r.left:=1;
    r.top:=pos;
    r.Right:=PainBox.Width;
    r.Bottom:=PainBox.Height;

    dec(pos);

    PB2.Canvas.Brush.Color:=clBlack; // 1
    PB2.Canvas.Brush.BrushStyle:= bsClear; //2
    DrawText(PB2.Canvas.Handle,pchar(s),length(s),r,DT_CENTER);
    if pos<-PB2.Height then pos:=220;
    end;

    Если без строк 1 и 2 то выводит красиво, но не тем шрифтом и цветом и затирает фон. С 1 и 2 все размазывается.
  • Крош (14.02.12 21:12) [19]
    Млин, напутал.
    Не:
    PB2.Canvas.Brush.Color:=clBlack; // 1
    PB2.Canvas.Brush.BrushStyle:= bsClear; //2
    а
    SetTextColor(PB2.Canvas.Handle,clWhite); //1
    SetBkMode(PB2.Canvas.Handle,TRANSPARENT); //2
 
Конференция "KOL" » Титры
Есть новые Нет новых   [118688   +17][b:0][p:0.001]