![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Аналоговые часы
исследователь © (2007-08-18 18:14:00)Такой вопрос: пишу программку-прото аналоговые часики, для души, с поддержкой скинов. Есть красивые картинки скинов, но фон циферблата в них градиентный. Отсюда вопрос: как закрашивать стрелку по событию таймера так, чтобы не было ее видно, ведь ее нужно будет отрисовывать в другом месте.
Ricks (2007-08-18 20:17:00) [101]Да.
Сначала копируешь фон (циферблат) полностью во временный битмап, потом на временном рисуешь стрелку. И за этим рисуешь временный на форме.
Удачи
исследователь (2007-08-18 20:14:00) [102]Ну в общем, как я и сказал, циферблат копируется полностью. Верно?
Ricks (2007-08-18 20:12:00) [103]Ну вот смотри и пробуй разобраться:
type
TForm1 = class(TForm)
MainTimer: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure MainTimerTimer(Sender: TObject);
private
{ Private declarations }
public
aImage : TBitmap;
aSkin : TBitmap;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
aImage:=TBitmap.Create;
aSkin:=TBitmap.Create;
aImage.Width:=100;
aImage.Height:=100;
aSkin.Width:=100;
aSkin.Height:=100;
aSkin.LoadFromFile(...)
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
aImage.Free;
aSkin.Free;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var h, m, s, n : word;
a : single;
begin
BitBlt( aImage.Canvas.Handle,
0, 0, 100, 100, aSkin.Canvas.Handle, 0, 0, SRCCOPY );
with aImage.Canvas do begin
MoveTo(50, 50);
DecodeTime(GetTime, h, m, s, n);
a:=2*pi * s/60 + pi;
LineTo( round(50 - sin(a) * 30), round(50 + cos(a) * 30) );
TextOut(0, 0, IntToStr(s));
end;
BitBlt( Canvas.Handle,
100, 100, 100, 100, aImage.Canvas.Handle, 0, 0, SRCCOPY );
end;
исследователь (2007-08-18 19:54:00) [104]Все, понял, но осталась пара вопросов.
Выходит, что x и у равны нулю, так как мы копируем полностью циферблат???
исследователь (2007-08-18 19:44:00) [105]Про BitBlt я знаю, что она переносит изображение. А фон где рисовать?
исследователь (2007-08-18 19:41:00) [106]не обращайте внимания на опечатки
Ricks (2007-08-18 19:41:00) [107]Стрелку рисуй уже на самом битмапе
Bitmap.Canvas.MoveTo()
Bitmap.Canvas.LineTo();
BitBlt это типа CopyRect - переносит прямоугольное изображение
исследователь (2007-08-18 19:37:00) [108]Это-то понятно, а вот со стрелкой - не очень. Вот я гружу в Bitmap1 изображение циферблата, так?
Далее делаю Bitmap2.width:=bitam1.width; и то же с высотой. Так?
Далее пишу
xx:=bitmap1.width div 2;
yy:=bitmap1.height div 2
BitBlt(Bitmap2.Canvas.Handle,
xx,yy,
xx+Round(MArrow * sin(MA)), yy+Round(MArrow * cos(MA)),
Bitmap1.Canvas.Handle, xx, yy, SRCCOPY);
не пашет
Ricks (2007-08-18 19:27:00) [109]Попытаюсь тебе объяснить. допустим тебе надо нарисовать прямоугольную область, верхний левый угол которой будет находиться в координатах (100; 150), и размером она будет 200 на 250 точек. Так вот X=100 Y=150, Width=200, Height=250. Усёк?
В свойствах TBitmap есть Width и Height, а рисовать ты его будешь начиная с (X; Y)
исследователь (2007-08-18 19:20:00) [110]Натюрлих :)
Вопросы:
0. Много ли памяти будет жрать?
1. ВАЖНО: что есть X и Y?
ведь у меня стрелка описывается так:
MoveTo(центр_циферблата);
LineTo(CX+Round(HArrow * sin(HA)), CY-Round(HArrow * cos(HA)));
где
Harrow - длина часовой стрелки, HA - угол поворота.
2. Тоже ВАЖНО: что есть Width и Height? Свойства Bitmap1?
@!!ex (2007-08-18 19:15:00) [111]Нахрена тебе копировать часть формы на битмап??
Головой думай.
Загружаешь свою картинку в BitMap1.
Создаешь еще один BitMap. BitMap2.
Такого же размера как и битмап1.
Каждый кадр делаешь
BitBlt(BitMap2.Canvas.Handle, X,Y,Width,Height, BitMap1.Canvas.Handle, X,Y, SRCCOPY);
<Тут римуешь на втором битмапе стрелку>
BitBlt(Form1.Canvas.Handle, X,Y,Width,Height, BitMap2.Canvas.Handle, X,Y, SRCCOPY);
Ферштейн?
исследователь (2007-08-18 19:08:00) [112]Замечательый просто "алгоритм" :)
Перефразирую: как скопировать часть формы в TBitmap?
@!!ex (2007-08-18 19:07:00) [113]BitBlt(DestinationHandle, X,Y,Width,Height, SourceHandle, X,Y, SRCCOPY);
Handle = Canvas.Handle
исследователь (2007-08-18 18:30:00) [114]Алгоритм работы с вызовами функций можешь накидать примерно?
Ricks (2007-08-18 18:26:00) [115]можно CopyRect, но вообще лучше BitBlt - немного быстрее
BrushCopy, извини, не знаю что делает. я, вообще, все что связанно с Canvas <=> HDC делаю на API
исследователь (2007-08-18 18:21:00) [116]CopyRect и BrushCopy?
Ricks (2007-08-18 18:18:00) [117]рисуй во временный битмап сначала фон, потом в нужном месте стрелку, а потом выводи