-Поиск по дневнику

Поиск сообщений в rss_forum_sources_ru

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 29.07.2007
Записей:
Комментариев:
Написано: 80


Прозрачный компонент под анимацией

Среда, 06 Января 2021 г. 16:09 + в цитатник
Syslik: Всем привет. Не могу добиться желаемого результата для анимированной картинки с прозрачным задним планом (типа курсора мыши) для отображения хода выполнения запроса в программе.
Один из вариантов, рисование на потомке TPanel (пробовал сразу на TPaint и на форме - не получается, или я не мог понять из прочитанного :) )
    //---------------------------------------------------------------------------
    #include
    #pragma hdrstop
    #include "WaitBoxUnit.h"
    #include "math.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    __fastcall WImagePn::WImagePn(TComponent* Owner): TPanel(Owner)
    {
    this->Parent = dynamic_cast(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;
    }
    //---------------------------------------------------------------------------

ну и сам хеадер
    //---------------------------------------------------------------------------
    #ifndef WaitBoxUnitH
    #define WaitBoxUnitH
    //---------------------------------------------------------------------------
    #include
    #include
    #include
    //---------------------------------------------------------------------------
    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 - аналогично, потом формы и рисовать на ней - тот же результат. В какую сторону "копать"? Огромное спасибо за любой совет (или ответ), а то другой день ломаю голову.

https://forum.sources.ru/index.php?showtopic=421072&view=findpost&p=3843419

Метки:  

 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку