Конференция "Media" » Аналоговые часы
 
  • исследователь © (18.08.07 18:14) [0]
    Такой вопрос: пишу программку-прото аналоговые часики, для души, с поддержкой скинов. Есть красивые картинки скинов, но фон циферблата в них градиентный. Отсюда вопрос: как закрашивать стрелку по событию таймера так, чтобы не было ее видно, ведь ее нужно будет отрисовывать в другом месте.
  • Ricks © (18.08.07 18:18) [1]
    рисуй во временный битмап сначала фон, потом в нужном месте стрелку, а потом выводи
  • исследователь © (18.08.07 18:21) [2]
    CopyRect и BrushCopy?
  • Ricks © (18.08.07 18:26) [3]
    можно CopyRect, но вообще лучше BitBlt - немного быстрее
    BrushCopy, извини, не знаю что делает. я, вообще, все что связанно с Canvas <=> HDC делаю на API
  • исследователь © (18.08.07 18:30) [4]
    Алгоритм работы с вызовами функций можешь накидать примерно?
  • @!!ex © (18.08.07 19:07) [5]
    BitBlt(DestinationHandle, X,Y,Width,Height, SourceHandle, X,Y, SRCCOPY);
    Handle = Canvas.Handle
  • исследователь © (18.08.07 19:08) [6]
    Замечательый просто "алгоритм" :)

    Перефразирую: как скопировать часть формы в TBitmap?
  • @!!ex © (18.08.07 19:15) [7]
    Нахрена тебе копировать часть формы на битмап??
    Головой думай.
    Загружаешь свою картинку в 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);

    Ферштейн?
  • исследователь © (18.08.07 19:20) [8]
    Натюрлих :)
    Вопросы:
    0. Много ли памяти будет жрать?
    1. ВАЖНО: что есть X и Y?
    ведь у меня стрелка описывается так:

    MoveTo(центр_циферблата);
    LineTo(CX+Round(HArrow * sin(HA)), CY-Round(HArrow * cos(HA)));

    где

    Harrow - длина часовой стрелки, HA - угол поворота.

    2. Тоже ВАЖНО: что есть Width и Height? Свойства Bitmap1?
  • Ricks © (18.08.07 19:27) [9]
    Попытаюсь тебе объяснить. допустим тебе надо нарисовать прямоугольную область, верхний левый угол которой будет находиться в координатах (100; 150), и размером она будет 200 на 250 точек. Так вот X=100 Y=150, Width=200, Height=250. Усёк?

    В свойствах TBitmap есть Width и Height, а рисовать ты его будешь начиная с (X; Y)
  • исследователь © (18.08.07 19:37) [10]
    Это-то понятно, а вот со стрелкой - не очень. Вот я гружу в 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);



    не пашет
  • исследователь © (18.08.07 19:41) [11]
    не обращайте внимания на опечатки
  • Ricks © (18.08.07 19:41) [12]
    Стрелку рисуй уже на самом битмапе
    Bitmap.Canvas.MoveTo()
    Bitmap.Canvas.LineTo();

    BitBlt это типа CopyRect - переносит прямоугольное изображение
  • исследователь © (18.08.07 19:44) [13]
    Про BitBlt я знаю, что она переносит изображение. А фон где рисовать?
  • исследователь © (18.08.07 19:54) [14]
    Все, понял, но осталась пара вопросов.

    Выходит, что x и у равны нулю, так как мы копируем полностью циферблат???
  • Ricks © (18.08.07 20:12) [15]
    Ну вот смотри и пробуй разобраться:
    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;

  • исследователь © (18.08.07 20:14) [16]
    Ну в общем, как я и сказал, циферблат копируется полностью. Верно?
  • Ricks © (18.08.07 20:17) [17]
    Да.
    Сначала копируешь фон (циферблат) полностью во временный битмап, потом на временном рисуешь стрелку. И за этим рисуешь временный на форме.
    Удачи
  • исследователь © (18.08.07 20:18) [18]
    А вариант копировать только там, где стрелочка прорисовалась? Так и памяти жрать меньше будет
  • antonn © (18.08.07 20:40) [19]
    у тебя памяти 16Мб?
 
Конференция "Media" » Аналоговые часы
Есть новые Нет новых   [134431   +10][b:0][p:0.001]