Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Мигание


Inna ©   (2003-05-22 13:59:00) 

Дельфи я только осваиваю и вот какая проблема - хочу переместить по форме картинку. Поместила Image и Timer и написала в onTimer чтото вроде
Image1.Top:=Image1.Top+5 Картинка двигается, но мигает. Что делать?


Inna   (2003-05-26 10:42:00) [1]

to pasha676,DeadMeat ©
Спасибо!


pasha676   (2003-05-23 17:51:00) [2]

Извини за критику но код страдает избыточностью.
В смысле для новичка такой давать не надо.
Надо при креате формы
1) Создать TBitmap
2) загрузить туда нужный рисунок.

Надо по таймеру
1) Изменить координаты рисунка
2) Залить фон канваса формы
3) Вывести рисунок из битмапа в нужное место на форме.

Так будет понятней.
Inna - что непонятно - спрашивай. Но лучше сядь и разберись самостоятельно. Ключевые слова для поиска в хелпе - TBitmap, TCanvas


DeadMeat   (2003-05-23 17:19:00) [3]

> Inna

Набацал... Тока в начале на форму кинь этот Timer1 и Image1 со свойством Visible:=false, чтобы на экране не мешалась. В этот Image1 надо загрузить картинку (только *.BMP). Писал на быструю руку, так что за красоту не отвечаю, но работает так, как я и обещал, т.е. стирает всё подряд, что было под картинкой... Да и ещё скорость передвижения должна быть постоянной, если она меняется, то код надо переделывать... и будет некоторая потеря скорости... Либо повторять все действия с начала...


unit Unit1;

interface

uses
Windows, Messages, Graphics, Forms, StdCtrls, Controls, ExtCtrls, Classes;

type
TForm1 = class(TForm)
Timer1: TTimer;
Image1: TImage;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
protected
procedure paint (var m:twmpaint);message wm_paint;
end;

const xspeed=1; // скорость по X
( form1.handle,nil,false)

> Inna

Набацал... Тока в начале на форму кинь этот Timer1 и Image1 со свойством Visible:=false, чтобы на экране не мешалась. В этот Image1 надо загрузить картинку (только *.BMP). Писал на быструю руку, так что за красоту не отвечаю, но работает так, как я и обещал, т.е. стирает всё подряд, что было под картинкой... Да и ещё скорость передвижения должна быть постоянной, если она меняется, то код надо переделывать... и будет некоторая потеря скорости... Либо повторять все действия с начала...


unit Unit1;

interface

uses
Windows, Messages, Graphics, Forms, StdCtrls, Controls, ExtCtrls, Classes;

type
TForm1 = class(TForm)
Timer1: TTimer;
Image1: TImage;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
protected
procedure paint (var m:twmpaint);message wm_paint;
end;

const xspeed=1; // скорость по X
yspeed=1; // скорость по Y

var
Form1: TForm1;
bufbit:tbitmap;
x,y:integer; // координаты вывода

implementation

{$R *.dfm}

procedure drawpicture;
begin
invalidaterect (form1.handle,nil,false);
end;

procedure TForm1.paint(var m:twmpaint);
var ps:tpaintstruct;
begin
beginpaint (handle,ps);
bitblt (form1.canvas.handle,x,y,bufbit.width,bufbit.height,bufbit.canvas.handle,0,0,srccopy);
endpaint (handle,ps);
end;

procedure TForm1.FormCreate(Sender: TObject);
var pct:tpicture;
begin
bufbit:=tbitmap.create;
bufbit.width:=image1.picture.width+xspeed*2;
bufbit.height:=image1.picture.height+yspeed*2;
bufbit.canvas.brush.color:=form1.canvas.brush.color;
patblt (bufbit.canvas.handle,0,0,bufbit.width,bufbit.height,patcopy);
bitblt (bufbit.canvas.handle,xspeed,yspeed,bufbit.width,bufbit.height,image1.picture.bitmap.canvas.handle,0,0,srccopy);
x:=0;
y:=0;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
bufbit.free;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
x:=x+xspeed;
y:=y+yspeed;
drawpicture; // это надо вызывать для рисования картинки
end;

end.


Как я и говорил уже, код оригинальностью не страдает...


DeadMeat   (2003-05-23 17:03:00) [4]

> Inna

Ща..., набацаю... погоди...


Inna   (2003-05-23 16:35:00) [5]

pasha676 - какой МВо классный, я согласна. А про вопрос - ну ламер я :(


pasha676   (2003-05-23 14:43:00) [6]

Да нет, не злой. Просто почти каждую неделю (а то и по 2-3 раза в неделю) появляеться этот вопрос. И МВо на него одинаково отвечает. И кстати мой пост был о том какой МВо классный :).

По смыслу твоего вопроса. По хорошему надо отказываться от TImage и рисовать рисунок хотя бы на канвасе формы. И пошустрей и подход правельнее.


Inna   (2003-05-23 14:27:00) [7]

Mbo - Спасиба, заработало
pasha676 - Какой ты злой :)
DeadMeat © а как насчёт примера?


DeadMeat   (2003-05-22 16:21:00) [8]

Теоретически мона сделать используя WM_PAINT и BitBlt... Но при этом если под картинкой чего-та есть, то этого чего-та, после её прохождения над ним может не оказаться... Прикол в том, чтобы перехватывать WM_PAINT и рисовать картинку с помощью BitBlt заранее больших размеров чем сама картинка:
по ширине - на скорость по горизонтали;
по высоте - на скорость по вертикали;
Может чё и получится...


pasha676   (2003-05-22 14:58:00) [9]

2МВо

Еще чуть чуть и тебе можно эту фразу (про даблбуфер) на хот-кей клавы вешать :). Поражаюсь тебе. Как только в ответ ты матом еще не сыпешь :).


MBo   (2003-05-22 14:04:00) [10]

Частично может помочь
Form1.DoubleBuffered:=True


Наверх

Титульная страница Поиск, карта сайта Написать письмо