[ Pobierz całość w formacie PDF ]
.Metoda ListDrawValue()Jak można siÄ™ spodziewać, jest to najbardziej skomplikowana metoda naszego edytora.Jest ona odpowiedzialna za caÅ‚ość reprezentacji każdej z pozycji rozwijalnej listy, a wiÄ™c przede wszystkim za poprawne narysowanie wszystkich obrazków.Jej treść przedstawia wydruk 10.22.Wydruk 10.22 Implementacja metody ListDrawValue()void __fastcall TImageIndexPropertyEditor::ListDrawValue(const AnsiString Value,Graphics::TCanvas* ACanvas,const Windows::TRect& ARect,bool ASelected){TRect ValueRect = ARect;try{TCustomImageList* ImageList = ComponentImageList;// wyczyść obszar podlegajÄ…cy wypeÅ‚nieniuACanvas->FillRect(ARect);if(ImageList != 0 && Value != ""){int ImageWidth = ImageList->Width;int ImageHeight = ImageList->Height;if(ImageWidth > MaxImageWidth || ImageHeight > MaxImageHeight){// rysowanie z przeskalowaniemstd::auto_ptr<Graphics::TBitmap> Image(new Graphics::TBitmap());// ustaw rozmiary bitmapy na identyczne z obrazkiemImage->Width = ImageWidth;Image->Height = ImageHeight;// skopiuj obrazek na płótno bitmapyImageList->Draw(Image->Canvas, 0, 0, StrToInt(Value), true);if(ImageWidth > MaxImageWidth) ImageWidth = MaxImageWidth;if(ImageHeight > MaxImageHeight) ImageHeight = MaxImageHeight;// okreÅ›l obszar płótna komórki na którym ma znaleźć siÄ™ obrazekTRect ImageRect = Rect( ARect.Left + Border,ARect.Top + Border,ARect.Left + Border + ImageWidth,ARect.Top + Border + ImageHeight );// wkomponuj obrazek w prostokÄ…t docelowyACanvas->StretchDraw(ImageRect, Image.get());}else{// rysowanie bezpoÅ›rednio na płótnie komórki,// z zachowaniem obrzeżaImageList->Draw( ACanvas,ARect.Left + Border,ARect.Top + Border,StrToInt(Value),true );}ValueRect = Rect( ARect.Left + ImageWidth + Border*2,ARect.Top,ARect.Right,ARect.Bottom );}}__finally{// wypisz tekst wartoÅ›ci bez wzglÄ™du na wynik rysowania obrazkainherited::ListDrawValue(Value, ACanvas, ValueRect, ASelected);}}Widzimy tu wiÄ™kszość znajomych elementów metody TShapeTypePropertyEditor:: ListDrawValue(), nowoÅ›ciÄ… jest natomiast przeskalowywanie „niewymiarowych” obrazków.Każdy taki obrazek kopiowany jest wpierw (w naturalnej wielkoÅ›ci) na roboczÄ… bitmapÄ™, skÄ…d kopiowany jest z przeskalowaniem do wyznaczonego obszaru na płótnie komórki.Obrazki nie wymagajÄ…ce przeskalowania rysowane sÄ… bezpoÅ›rednio na płótnie komórki.Na zakoÅ„czenie, niezależnie od ewentualnych wyjÄ…tków zwiÄ…zanych z rysowaniem obrazków, wypisywana jest tekstowa reprezentacja wartoÅ›ci.Metoda PropDrawValue()Jak wiadomo, bieżąca wartość wÅ‚aÅ›ciwoÅ›ci, wypisywana obok jej nazwy, musi zmieÅ›cić siÄ™ w standardowej wysokoÅ›ci komórki; jeżeli ma jej towarzyszyć jakiÅ› symbol graficzny, to co najwyżej w postaci maÅ‚ej ikony.Podobnie wiÄ™c jak w przypadku metody ListDrawValue() musimy uporać siÄ™ z wtÅ‚oczeniem obrazka w pewne maksymalne ramy, toteż kod obydwu funkcji jest dość podobny; zamiast wartoÅ›ci MaxImageWidth i MaxImageHeight używana jest jednak wartość CurrentMaxSide, obliczona na podstawi wysokoÅ›ci komórki z uwzglÄ™dnieniem 1-pikselowych odstÄ™pów od jej poziomych krawÄ™dzi.Oto treść metody PropDrawValue():Wydruk 10.23 Implementacja metody PropDrawValue()void __fastcall TImageIndexPropertyEditor::PropDrawValue(Graphics::TCanvas* ACanvas,const Windows::TRect& ARect,bool ASelected){TRect ValueRect = ARect;try{TCustomImageList* ImageList = ComponentImageList;// wyczyÅ›c obszar podlegajÄ…cy rysowaniuACanvas->FillRect(ARect);if(ImageList != 0&& GetVisualValue() != ""&& GetVisualValue().ToInt() >= 0&& GetVisualValue().ToInt() < ImageList->Count){int ImageWidth = ImageList->Width;int ImageHeight = ImageList->Height;// Calculate the MaxSide as we want a square to display our imageint CurrentMaxSide = ARect.Bottom - ARect
[ Pobierz całość w formacie PDF ]