[ Pobierz całość w formacie PDF ]
.Przykładowo obiekt TImageList udostępnia w tym celu dwie następujące metody, wywoływane cyklicznie dla każdego ładowanego elementu listy:bool __fastcall ResourceLoad(TResType ResType,AnsiString Name,Graphics::TColor MaskColor);bool __fastcall ResInstLoad(int Instance,TResType ResType,System::AnsiString Name,Graphics::TColor MaskColor);Do użycia wewnątrz pakietu przydatna jest tylko druga z nich.Znaczenie parametru Instance jest takie samo, jak opisane przed chwilą.Drugi parametr określa typ ładowanego obrazka - rtBitmap oznacza bitmapę, rtIcon - ikonę, rtCursor - kursor.Ostatni parametr (MaskColor) ma znaczenie tylko wówczas, gdy właściwość Mask obiektu TImageList równa jest true.Jak więc widać, ładowanie zasobów nie jest czynnością zbyt skomplikowaną.Pozostaje jednak pytanie - w którym miejscu kodu ładowanie to ma być wykonywane? Wydruk 8.36 przedstawia jedno z możliwych rozwiązań - ładowanie zasobu w momencie, gdy okazuje się on niezbędny:Wydruk 8.36.Załadowanie i wyświetlenie obrazka z pliku zasobowegovoid __fastcall TImageComponentEditor::AdvancedDrawMenuItem3(System::TObject*Sender,Graphics::TCanvas*ACanvas,const Windows::TRect&ARect,TOwnerDrawState State){std::auto_ptr<Graphics::TBitmap>Logo(new Graphics::TBitmap());if(State.Contains(odSelected)){Logo->LoadFromResourceName(reinterpret_cast<int>(HInstance),"RESOURCE_ActiveWritersGuildLogo");}else{Logo->LoadFromResourceName(reinterpret_cast<int>(HInstance),"RESOURCE_InActiveWritersGuildLogo");}ACanvas->Draw(ARect.Left,ARect.Top,Logo);}Efektem wykonania powyższego kodu jest wyświetlenie logo przedstawionego na rysunku 8.12.Rozwiązanie to jest jednak o tyle niepraktyczne, iż ładowanie i wyświetlanie logo odbywa się każdorazowo, gdy kursor myszy wejdzie w jego obszar lub obszar ten opuści; roboczy obiekt bitmapy jest bowiem lokowany na stosie i niszczony po wyjściu z funkcji.Znacznie efektywniej byłoby załadować „na stałe” obydwie bitmapy logo w ramach konstruktora klasy TImageComponentEditor i zwolnić je dopiero w destruktorze.Rozwiązanie takie jest przedmiotem wydruku 8.37.Wydruk 8.37.Usprawnione zarządzanie zasobami// DEKLARACJA KLASY#include "dsgnintf.hpp"class TImageComponentEditor :public TDefaultEditor{typedef TComponentEditor inherited;private:virtual void __fastcall AdvancedDrawMenuItem3(System::TObject*Sender,Graphics::TCanvas*ACanvas,const Windows::TRect&ARect,TOwnerDrawState State);virtual void __fastcall MeasureMenuItem3(System::TObject*Sender,Graphics::TCanvas*ACanvas,int&Width,int&Height);// dane prywatneGraphics::TBitmap*ActiveWritersGuildLogo;Graphics::TBitmap*InActiveWritersGuildLogo;public:// Kliknięcie prawym przyciskiem// MENU KONTEKSTOWE// krok 1virtual int __fastcall GetVerbCount(void);//krok 2virtual AnsiString __fastcall GetVerb(int Index);//krok 3virtual void __fastcall PrepareItem(int Index,const Menus::TMenuItem*AItem);//krok 4virtual void __fastcall ExecuteVerb(int Index);// kopiowanie obrazka do Schowkavirtual void __fastcall Copy(void);//wklejanie obrazka ze Schowkavirtual void __fastcall Paste(void);public:__fastcall virtual TImageComponentEditor(Classes::TComponent*AComponent,di_IFormDesigner ADesigner);public:__fastcall virtual ~TImageComponentEditor(void);};// IMPLEMENTACJA//--------------------------------------------------------------------------//// KONSTRUKTOR ////--------------------------------------------------------------------------//__fastcall TImageComponentEditor::TImageComponentEditor(Classes::TComponent*AComponent,_di_IFormDesigner ADesigner):TDefaultEditor(AComponent,ADesigner){ActiveWritersGuildLogo =new Graphics::TBitmap();InActiveWritersGuildLogo =new Graphics::TBitmap();ActiveWritersGuildLogo->LoadFromResourceName(reinterpret_cast<int>(HInstance),"RESOURCE_ActiveWritersGuildLogo");InActiveWritersGuildLogo->LoadFromResourceName(reinterpret_cast<int>(HInstance),"RESOURCE_InActiveWritersGuildLogo");}//--------------------------------------------------------------------------//// DESTRUKTOR ////--------------------------------------------------------------------------//__fastcall TImageComponentEditor::~TImageComponentEditor(void){delete ActiveWritersGuildLogo;delete InActiveWritersGuildLogo;}//--------------------------------------------------------------------------//void __fastcallTImageComponentEditor::AdvancedDrawMenuItem3(System::TObject*Sender,Graphics::TCanvas*ACanvas,const Windows::TRect&ARect,TOwnerDrawState State){if(State.Contains(odSelected)){ACanvas->Draw(ARect.Left,ARect.Top,ActiveWritersGuildLogo);}else{ACanvas->Draw(ARect.Left,ARect
[ Pobierz całość w formacie PDF ]