-
Такой вопрос: пишу программку-прото аналоговые часики, для души, с поддержкой скинов. Есть красивые картинки скинов, но фон циферблата в них градиентный. Отсюда вопрос: как закрашивать стрелку по событию таймера так, чтобы не было ее видно, ведь ее нужно будет отрисовывать в другом месте.
-
рисуй во временный битмап сначала фон, потом в нужном месте стрелку, а потом выводи
-
CopyRect и BrushCopy?
-
можно CopyRect, но вообще лучше BitBlt - немного быстрее BrushCopy, извини, не знаю что делает. я, вообще, все что связанно с Canvas <=> HDC делаю на API
-
Алгоритм работы с вызовами функций можешь накидать примерно?
-
BitBlt(DestinationHandle, X,Y,Width,Height, SourceHandle, X,Y, SRCCOPY); Handle = Canvas.Handle
-
Замечательый просто "алгоритм" :)
Перефразирую: как скопировать часть формы в TBitmap?
-
Нахрена тебе копировать часть формы на битмап?? Головой думай. Загружаешь свою картинку в 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); Ферштейн?
-
Натюрлих :) Вопросы: 0. Много ли памяти будет жрать? 1. ВАЖНО: что есть X и Y? ведь у меня стрелка описывается так:
MoveTo(центр_циферблата); LineTo(CX+Round(HArrow * sin(HA)), CY-Round(HArrow * cos(HA)));
где
Harrow - длина часовой стрелки, HA - угол поворота.
2. Тоже ВАЖНО: что есть Width и Height? Свойства Bitmap1?
-
Попытаюсь тебе объяснить. допустим тебе надо нарисовать прямоугольную область, верхний левый угол которой будет находиться в координатах (100; 150), и размером она будет 200 на 250 точек. Так вот X=100 Y=150, Width=200, Height=250. Усёк?
В свойствах TBitmap есть Width и Height, а рисовать ты его будешь начиная с (X; Y)
-
Это-то понятно, а вот со стрелкой - не очень. Вот я гружу в 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); не пашет
-
не обращайте внимания на опечатки
-
Стрелку рисуй уже на самом битмапе Bitmap.Canvas.MoveTo() Bitmap.Canvas.LineTo();
BitBlt это типа CopyRect - переносит прямоугольное изображение
-
Про BitBlt я знаю, что она переносит изображение. А фон где рисовать?
-
Все, понял, но осталась пара вопросов.
Выходит, что x и у равны нулю, так как мы копируем полностью циферблат???
-
Ну вот смотри и пробуй разобраться: type
TForm1 = class(TForm)
MainTimer: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure MainTimerTimer(Sender: TObject);
private
public
aImage : TBitmap;
aSkin : TBitmap;
end;
var
Form1: TForm1;
implementation
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;
-
Ну в общем, как я и сказал, циферблат копируется полностью. Верно?
-
Да. Сначала копируешь фон (циферблат) полностью во временный битмап, потом на временном рисуешь стрелку. И за этим рисуешь временный на форме. Удачи
-
А вариант копировать только там, где стрелочка прорисовалась? Так и памяти жрать меньше будет
-
у тебя памяти 16Мб?
|