Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.227.114.125] |
|
Сообщ.
#1
,
|
|
|
Всем привет. Не могу добиться желаемого результата для анимированной картинки с прозрачным задним планом (типа курсора мыши) для отображения хода выполнения запроса в программе.
Один из вариантов, рисование на потомке TPanel (пробовал сразу на TPaint и на форме - не получается, или я не мог понять из прочитанного ) //--------------------------------------------------------------------------- #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; } //--------------------------------------------------------------------------- ну и сам хеадер //--------------------------------------------------------------------------- #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 - аналогично, потом формы и рисовать на ней - тот же результат. В какую сторону "копать"? Огромное спасибо за любой совет (или ответ), а то другой день ломаю голову. |