![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Имплонтация мультимедийного таймера в свой компонент [D6, WinXP]
Jimmy © (2007-09-19 21:00:00)Не подскажите, как имплонтировать мультимедийный таймер в свой компонент? Заранее спасибо.
Инс (2007-09-20 14:43:00) [1]>[33]-[38]
+1 :))
Сергей М. (2007-09-20 14:34:00) [2]
> Еще толком не разобрался
Ну тогда убирай его нафих.
Вот как разберешься, зачем тебе оно нада, тогда и вернешь его на место, но уже с полным, надеюсь, пониманием происходящего при этом как в ран-. так и в дизайн-тайм.
Jimmy (2007-09-20 14:33:00) [3]Взял из какого-то примера. Еще толком не разобрался.
Сергей М. (2007-09-20 14:25:00) [4]
> Не знаю
А зачем тогда объявил это событие, раз не знаешь ?
Jimmy (2007-09-20 14:24:00) [5]Не знаю.
Сергей М. (2007-09-20 14:03:00) [6]
> Jimmy (20.09.07 13:53) [33]
Можно.
Но лишь после того как ты ответишь на [23]
Jimmy (2007-09-20 13:53:00) [7]Так можно сделать анимацию на этапе DesignTime?
clickmaker (2007-09-20 13:14:00) [8]
> [24] Jimmy (20.09.07 12:06)
есть такая отличная штука - memory-mapped bitmap. Это когда рисуешь картинку сначала на канве битмапа, а после его целиком шлепаешь, куда надо.
в некоторых контролах это реализовано как DoubleBuffered
Я писал игрушку типа змейка на апи, так она у меня уже при 75мс бегала, как угорелая
Сергей М. (2007-09-20 13:13:00) [9]
> homm © (20.09.07 13:10) [30]
Да я думал, что он за один тик успевает всего 18 пикселей нарисовать)
А он, оказывается, о сдвиге)
homm (2007-09-20 13:10:00) [10]> [26] Сергей М. © (20.09.07 12:07)
> В одном кадре должно формироваться все изображение той самой
> строки, а не ее шматок в 18 пикселов !
Зато Ваш телепатор сбоит. 18 пикселей, это смещение за секунду, при скорости смещения 1 пиксель в кадр и 18 кадров в секунду.
Jeer (2007-09-20 12:36:00) [11]
> 3. 18 кадров=18 пикселей в секунду. Мало!
>
На платформах NT 10 ms == 100 Гц ( 100 frame per sec)
Этого за глаза хватит для видимой плавности движения.
При желании можно еще замедлить скролл путем имитации дробного шага
за счет инерционности зрения:
step := 1; //px
Inc(i);
if (i mod 3)=0 then step := - step
else step := 1;
*.Left := *.Left + step;
Сергей М. (2007-09-20 12:16:00) [12]
> Jimmy
Эдак тебе никикх таймеров не хватит)
Дай тебе таймер с разрешением в 5мс, у тебя возникнет идея-фикс двигать изображение на пол-пикселя за один тик)
Сергей М. (2007-09-20 12:09:00) [13]Похоже в [19] телепатор попал в точку)
Сергей М. (2007-09-20 12:07:00) [14]
> 18 кадров=18 пикселей в секунду. Мало!
Конечно мало, если в каждом кадре ты умеешь нарисовать всего 18 пикселей)
В одном кадре должно формироваться всеизображение той самой строки, а не ее шматок в 18 пикселов !
Инс (2007-09-20 12:07:00) [15]
> Шаг = 5 пикселей - некрасивая анимация.
При скорости 18 кадров в секунду - никто этого шага не заметит :))
Jimmy (2007-09-20 12:06:00) [16]Шаг = 5 пикселей - некрасивая анимация. Да Бог с ним, с мультимедиа таймером. У меня XP и действительно можно сделать тик равный 10 мсек. Это уже хорошо. Что на счет DesignTime?
Сергей М. (2007-09-20 12:04:00) [17]
> procedure TDiDRunString.Timer(Sender: TObject);
> begin
> if Assigned(FOnTimer) then FOnTimer(self);
> XX:=XX-1;
> DrawMain;
> Invalidate;
> end;
Зачем компонент TDiDRunString имеет св-во-событие OnTimer ?
Инс (2007-09-20 12:03:00) [18]
> 3. 18 кадров=18 пикселей в секунду. Мало!
А кто мешает сделать свойство, задающее шаг - 1 пиксел или 2 или 10?
Jimmy (2007-09-20 12:01:00) [19]1. Разрабатываю бегущую строку.
2. Не знаю как ее разработать без таймера.
3. 18 кадров=18 пикселей в секунду. Мало!
Jimmy (2007-09-20 11:58:00) [20]type
TDiDRunString = class(TGraphicControl)
private
FActive: Boolean;
FInterval: integer;
FTimer: TTimer;
FOnTimer: TNotifyEvent;
FCaption : string;
FKRgn : HRgn;
procedure SetActive(Value: Boolean);
procedure SetInterval(Interval: integer);
procedure Timer(Sender: TObject);
procedure SetCaption(Value: string);
procedure FreeRegion;
protected
procedure Paint; override;
procedure DrawMain;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property Interval: integer read FInterval write SetInterval;
property Active: Boolean read FActive write SetActive;
property OnTimer: TNotifyEvent read FOnTimer write FOnTimer;
property Caption: string read FCaption write SetCaption;
property Enabled;
property Font;
property ParentFont;
property ParentShowHint;
property ShowHint;
property Visible;
property OnClick;
end;
Var XX:Integer;
procedure Register;
implementation
{------------------------------------------------------------------------------}
procedure Register;
begin
RegisterComponents('DiD', [TDiDRunString]);
end;
{------------------------------------------------------------------------------}
constructor TDiDRunString.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
ControlStyle := [csClickEvents,csCaptureMouse];
XX:=0;
Width := 150;
Height := 20;
FKRgn := 0;
FActive:=False;
if not (csDesigning in ComponentState) then
try
FTimer := TTimer.Create(self);
FTimer.Enabled := false;
FTimer.Interval := FInterval;
FTimer.OnTimer := Timer;
except
FreeAndNil(FTimer);
end;
end;
destructor TDiDRunString.Destroy;
begin
if FKRgn <> 0 then FreeRegion;
if Assigned(FTimer) then FreeAndNil(FTimer);
inherited Destroy;
end;
procedure TDiDRunString.SetInterval(Interval: integer);
begin
FInterval := Interval;
if Assigned(FTimer) then
FTimer.Interval := FInterval;
end;
procedure TDiDRunString.Timer(Sender: TObject);
begin
if Assigned(FOnTimer) then FOnTimer(self);
XX:=XX-1;
DrawMain;
Invalidate;
end;
procedure TDiDRunString.DrawMain;
begin
Canvas.Font.Height:=Font.Height;
Canvas.Font.Name:=Font.Name;
Canvas.Brush.Style:=bsClear;
Canvas.TextOut(XX, 0, Caption);
if XX<Canvas.TextWidth(Caption)*(-1) then XX:=Width;
end;
procedure TDiDRunString.FreeRegion;
begin
if FKRgn <> 0 then DeleteObject(FKRgn);
FKRgn := 0;
end;
procedure TDiDRunString.Paint;
begin
inherited Paint;
FreeRegion;
DrawMain;
end;
procedure TDiDRunString.SetCaption(Value: string);
begin
if FCaption=Value then Exit;
FCaption:=Value;
Invalidate;
end;
procedure TDiDRunString.SetActive(Value: Boolean);
begin
if FActive=Value then Exit;
FActive:=Value;
if Not(csDesigning in ComponentState) then FTimer.Enabled:=Value;
Invalidate;
end;
end.