[ Pobierz całość w formacie PDF ]
.Najpierw wklasie edytora komponentu zdefiniowaæ nale¿y metodê o nazwieAdvancedDrawMenuItem1 (zak³adamy, i¿ rzecz dotyczy opcji o indeksie 1, choænazwa metody nie jest tu specjalnie istotna):// w pliku nag³Ã³wkowymprotected:virtual void __fastcall AdvancedDrawMenuItem1(System::TObject* Sender,Graphics::TCanvas* ACanvas,const Windows::TRect& ARect,TOwnerDrawState State);.// w pliku implementacyjnymvirtual void __fastcall TMyCustomEditor::AdvancedDrawMenuItem1(System::TObject* Sender,Graphics::TCanvas* ACanvas,const Windows::TRect& ARect,TOwnerDrawState State);{.tutaj scenariusz obs³ugi zdarzeniaSender wskazuje na odnosny obiekt TMenuItem.}Nastêpnie w treœci metody PrepareItem() nale¿y przypisaæ wskaŸnik tej metody doodpowiedniej w³aœciwoœci obiektu TMenuItem (zak³adamy, i¿ dotyczy to opcji oindeksie 1):void __fastcall TMyCustomEditor::PrepareItem(int Index, const Menus::TMenuItem* AItem){switch(Index){.case 1 :{TMenuItem* MenuItem = const_cast(AItem);MenuItem­–>OnAdvancedDrawItem = AdvancedDrawMenuItem1break;}.}}Mo¿na by w ten sposób potraktowaæ pozosta³e zdarzenia zwi¹zane z opcjami menukontekstowego: OnMeasureItem, OnDrawItem i OnClick.Nie zaleca siê jednakprzedefiniowywania zdarzenia OnClick, bowiem obs³ug¹ klikniêcia opcji zajmujesiê metoda ExecuteVerb() i nie ma raczej powodu, by to zmieniaæ.Tak¿ezdarzenie OnDrawItem jest starsz¹ i mniej elastyczn¹ wersj¹ zdarzeniaOnAdvancedDrawItem, którego przedefiniowanie pokazaliœmy przed chwil¹.Zdarzenie OnMeasureItem umo¿liwia okreœlenie wysokoœci i szerokoœciwyœwietlanej opcji, poprzez modyfikacjê ich ustawieñ standardowych:.protected void __fastcall MeasureItem1(System::TObject* Sender,Graphics:TCanvas::ACanvas,int& Width,int& Height);Zmiana domyœlnej szerokoœci opcji odniesie jednak skutek tylko w dwóchprzypadkach – je¿eli jest to najszersza opcja menu i jej szerokoœæ zostaniezmniejszona, b¹dŸ te¿ szerokoœæ innej opcji zwiêkszona zostanie ponad aktualn¹szerokoœæ ca³ego menu.Je¿eli opcji towarzyszy ikona, wyjœciowa wartoœæ parametru Width nie powinnaobejmowaæ jej szerokoœci, odnosi siê bowiem tylko do samego tekstu opcji;nale¿y zatem nadaæ parametrowi Width wartoœæ stanowi¹c¹ ró¿nicê pomiêdzyca³kowit¹ szerokoœci¹ opcji a szerokoœci¹ ikony – ta ostatnia równa jestwysokoœci okreœlonej przez parametr Height, co ilustruje rysunek 8.11 dla opcjiFlip Children.Rysunek 8.11.Wymiarowanie opcji menu kontekstowegoZmieniaj¹c standardow¹ obs³ugê zdarzenia OnAdvancedDrawItem, mo¿emy nadaæodnoœnej opcji menu kontekstowego zupe³nie niestandardowy wygl¹d, o czymœwiadczy chocia¿by rysunek 8.12, przedstawiaj¹cy menu kontekstowe edytoraTImageComponentEditor w odniesieniu do komponentu TImage.Rysunek 8.12.Menu kontekstowe edytora TImageComponentEditorDodawanie podmenu do opcji menu kontekstowegoObiekt TMenuItem posiada metodê Add(), umo¿liwiaj¹c¹ do³¹czanie kolejnychpodopcji do jego (pocz¹tkowo pustego) podmenu.Metoda ta (jako przeci¹¿ona)posiada tak¿e aspekt umo¿liwiaj¹cy dodanie ca³ej tablicy opcji (TMenuItems) wpojedynczym wywo³aniu.Opcje podmenu, same bêd¹c obiektami TMenuItem, podlegaj¹tym samym zasadom, co opcje „g³Ã³wnego” menu kontekstowego.Oto przyk³ad do³¹czania podmenu do opcji o indeksie 1.Dla uproszczeniazak³adamy, i¿ liczba opcji podmenu zawarta jest w statycznej zmiennejNoOfSubMenusForItem1, zaœ treœci¹ kolejnych opcji s¹ kolejne liczby nieujemnepoprzedzone identyfikatorem „Sub-Menu”.Na pocz¹tku nale¿y oczywiœcie przydzieliæ tablicê obiektów TMenuItem; najlepiejby tablica ta by³a prywatnym (private) polem klasy edytora:TMenuItem* SubMenuItemsFor1[NoOfSubMenusForItem1];Kolejna rzecz to przedefiniowanie konstruktora edytora.Jest on pust¹ funkcj¹„wstawialn¹” (inline), któr¹ nale¿y przekszta³ciæ do nastêpuj¹cej postaci:__fastcall TCustomComponentEditor::TCustomComponentEditor(Classes::TComponent*AComponent,_di_IFormDesigner ADesigner):TComponentEditor(AComponent,ADesigner){for(int i=0;iCaption.sprintf(“Sub-Menu %d ”,i);.}.}W pliku nag³Ã³wkowym nale¿y tak¿e usun¹æ towarzysz¹ce deklaracji konstruktoradyrektywy #pragma option push i #pragma option pop.Utworzona tablica opcji podmenu powinna zostaæ zwolniona w destruktorzeedytora, który na podobnej zasadzie nale¿y przekszta³ciæ do poni¿szej postaci:__fastcall TCustomComponentEditor::~TCustomComponentEditor(void){for(int i=0;iAdd(SubMenuItemsFor1, NoOfSubMenusFor1–1)}}}Przypisywanie podmenu opcjom menu kontekstowego nie mo¿e odbywaæ siê w ramachmetody ExecuteVerb(), gdy¿ grozi to nieprzewidywalnymi skutkami.Metoda ExecuteVerb()Metoda ta obejmuje sw¹ treœci¹ czynnoœci, które maj¹ byæ wykonane w wynikuwybrania okreœlonej opcji menu kontekstowego; jedyny parametr wywo³ania zawieraindeks wybranej opcji.Oto przyk³ad:void __fastcall TMyCustomEditor::ExecuteVerb(int Index){switch(Index){case 0 : // "&Edytuj Komponent."EditComponent();break;case 1 : // "&O komponencie."EditComponent();break;case 2 : // nic nie rób – separator opcjibreak;case 3 : // "&Przywróæ standardowe"ResetComponent();break;default : break;}}Z poszczególnymi opcjami menu kontekstowego mog¹ byæ zwi¹zane pewne funkcjedialogowe.Na szczególn¹ uwagê zas³uguje sytuacja, kiedy to metoda Edit()oferuje ju¿ niezbêdny dialog, który bezsensownie by³oby implementowaæ jeszczeraz w ramach obs³ugi którejœ z opcji (jak opcja o indeksie 0 w powy¿szymfragmencie).Najwygodniej wówczas wydzieliæ ca³y dialog w ramach odrêbnejprywatnej metody i wywo³ywaæ j¹ zarówno wewn¹trz metody Edit(), jak i wmetodzie ExecuteVerb() w zwi¹zku z konkretn¹ opcj¹.Metoda Copy()Metoda ta umo¿liwia utworzenie w schowku dodatkowego obrazu komponentu, wspecyficznym formacie przydatnym dla jakiejœ zewnêtrznej aplikacji.Metoda tanie musi byæ implementowana, ów dodatkowy obraz komponentu nie bêdzie wówczastworzony.Poni¿szy fragment przedstawia schemat kopiowania do schowka grafiki stanowi¹cejzawartoœæ komponentu TImage.#include "Clipbrd [ Pobierz caÅ‚ość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • luska.pev.pl
  •