Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > Borland C++ Builder/Turbo C++ Explorer > Прозрачный компонент под анимацией


Автор: Syslik 06.01.21, 13:09
Всем привет. Не могу добиться желаемого результата для анимированной картинки с прозрачным задним планом (типа курсора мыши) для отображения хода выполнения запроса в программе.
Один из вариантов, рисование на потомке TPanel (пробовал сразу на TPaint и на форме - не получается, или я не мог понять из прочитанного :) )
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "WaitBoxUnit.h"
    #include "math.h"
     
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    __fastcall WImagePn::WImagePn(TComponent* Owner): TPanel(Owner)
    {
       this->Parent       = dynamic_cast<TWinControl*>(Owner);
     
       this->Width        = 40;
       this->Height       = 40;
       this->BorderWidth  = 0;
       this->BorderStyle  = bsNone;
       this->BevelOuter   = bvNone;
       this->BringToFront();
     
       Images             = new TPngImage;
       ShadowImages       = new Graphics::TBitmap();
       ShadowTemplate     = new Graphics::TBitmap();
     
       MImageCounter      = 0;
       MType              = tSnake;
       SetImageType(MType);
     
       Timer              = new TTimer(Owner);
       Timer->Enabled     = true;
       Timer->Interval    = 1000;
       Timer->OnTimer     = OnTimer;
    }
    //---------------------------------------------------------------------------
     
    __fastcall WImagePn::~WImagePn()
    {
       delete ShadowImages;
       delete ShadowTemplate;
       delete Timer;
       delete Images;
    }
    //---------------------------------------------------------------------------
     
    void __fastcall WImagePn::Paint()
    {
       TPanel::Paint();
       try {
          BitBlt(ShadowTemplate->Canvas->Handle, 0,0,40,40, ShadowImages->Canvas->Handle, (MImageCounter * 40), 0, SRCCOPY);
          TPanel::Canvas->Draw(0, 0, ShadowTemplate);
         } __finally {
       }
    }
    //---------------------------------------------------------------------------
     
    void __fastcall WImagePn::OnTimer (TObject *Sender)
    {
        MImageCounter ++;
        if (MImageCounter > 7)
           MImageCounter = 0;
     
        this->Invalidate();
        Application->ProcessMessages();
    }
    //---------------------------------------------------------------------------
     
    void __fastcall WImagePn::SetImageType(MImageType Value)
    {  String UImageName;
       MType = Value;
       if      (MType == tSnake)        UImageName = "WAIT_IMAGE_01";
       else if (MType == tFadingBalls)  UImageName = "WAIT_IMAGE_02";
       else if (MType == tRainbow)      UImageName = "WAIT_IMAGE_03";
       else                             UImageName = "WAIT_IMAGE_04";
     
       TResourceStream *RcStream = new TResourceStream(unsigned(HInstance), UImageName, L"RT_RCDATA");
       try {
          Images->LoadFromStream(RcStream);
          ShadowImages->Assign(Images);
          ShadowTemplate->Assign(Images);
          ShadowTemplate->SetSize(40, 40);
       } __finally {
          delete RcStream;
       }
       this->Invalidate();
    }
    //---------------------------------------------------------------------------
     
    int __fastcall WImagePn::GetInterval()
    {
       return Timer->Interval;
    }
    //---------------------------------------------------------------------------
     
    void __fastcall WImagePn::SetInterval(int Value)
    {
       Timer->Interval = Value > 0 ? Value: 1000;
     
    }
    //---------------------------------------------------------------------------

ну и сам хеадер
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    //---------------------------------------------------------------------------
    #ifndef WaitBoxUnitH
    #define WaitBoxUnitH
    //---------------------------------------------------------------------------
    #include <Classes.hpp>
    #include <PngImage.hpp>
    #include <Forms.hpp>
     
    //---------------------------------------------------------------------------
    enum MImageType {tSnake, tFadingBalls, tRainbow, tBrokenCircle};
     
    class PACKAGE WImagePn : public TPanel   // TCustomPanel
    {
    private:
       TTimer *Timer;
       MImageType MType;
       int MImageCounter;
       TPngImage *Images;
       Graphics::TBitmap *ShadowImages;
       Graphics::TBitmap *ShadowTemplate;
    protected:
       virtual void __fastcall Paint(void);
       int __fastcall GetInterval();
       void __fastcall SetInterval(int Value);
       void __fastcall SetImageType(MImageType Value);
       void __fastcall OnTimer (TObject *Sender);
    public:
       virtual __fastcall WImagePn(TComponent* Owner);
       virtual __fastcall ~WImagePn();
    __published:
       __property int Speed = {read = GetInterval, write = SetInterval};
       __property MImageType Type = {read = MType, write = SetImageType};
    };
     
    //---------------------------------------------------------------------------
    #endif


Все нормально рисуется, только задний фон - не прозрачный. Создавал компонент TPaintBox и рисовал на нем, но подменить вывод на канву панели с сохранением прозрачности не добился, также пробовал создать потомка TPaintBox - аналогично, потом формы и рисовать на ней - тот же результат. В какую сторону "копать"? Огромное спасибо за любой совет (или ответ), а то другой день ломаю голову.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)