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

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

Аналоговые часы


Страницы:   1 2 3 4 5 6

исследователь ©   (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]

рисуй во временный битмап сначала фон, потом в нужном месте стрелку, а потом выводи


Страницы:   1 2 3 4 5 6

Наверх

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