kontrolki ActiveX
Transkrypt
kontrolki ActiveX
MICROSOFT FOUNDATION CLASSES TECHNOLOGIA COM – KONTROLKI ACTIVEX KONTROLKI ACTIVEX Od pozostałych typów obiektów COM kontrolki ActiveX odróżniają się na ogół faktem posiadania interfejsem użytkownika (choć oficjalna specyfikacja tak tego nie określa). Oprogramowanie korzystające z kontrolki (klient) nazywa się kontenerem. Kod wykonywalny kontrolek ActiveX umieszczany jest w specjalnym pliku o rozszerzeniu OCX. Technicznie rzecz biorąc nie różni się on zresztą od DLL. Projekt kontrolki ActiveX tworzy się wybierając odpowiedni typ projektu na pierwszej planszy AppWizarda. Kontrolka ActiveX jest reprezentowana przez obiekt klasy potomnej COleControl. Pod wieloma względami praca z kontrolkami jest zbliżona do pracy z serwerami automatyzacji. DODAWANIE WŁAŚCIWOŚCI I METOD Właściwości i metody dodaje się tak samo, jak do serwerów automatyzacji. Jedynym nowym elementem są tzw. właściwości i metody magazynowe (stock) i otaczające (ambient). Magazynowe właściwości i metody to standardowe elementy zrozumiałe zarówno dla kontrolki, jak i jej kontenera, i dla obu mający predefiniowane znaczenia. Mają one na celu zapewnienie elementarnej zgodności pomiędzy różnymi implementującymi je kontrolkami a kontenerami. W przypadku ActiveX pole do edycji nazwy zewnętrznej jest listą typu combo; aby stworzyć właściwość lub metodę magazynową należy wybrać jedną z proponowanych na tej liście nazw i włączyć opcję Stock. Odtąd będą one dostępne – za pośrednictwem Get/SetNazwa w przypadku właściwości lub pod swoją nazwą w przypadku metod. Właściwości otaczające są zaimplementowane w kontenerze kontrolki (stąd nazwa) i stąd zawsze dostępne – bez potrzeby wcześniejszego tworzenia czy deklarowania. Dostępne są poprzez odwołania do predefiniowanych funkcji klasy COleControl (np. AmbientBackColor) lub poprzez GetAmbientProperty. DODAWANIE ZDARZEŃ Zdarzenia informują kontener, w którym umieszczono kontrolkę, o zaistnieniu określonego warunku – są więc zgłaszane przez kontrolkę, i zazwyczaj dalej nieobsługiwane. Zdarzenia dodaje się za pomocą zakładki ActiveX Events ClassWizarda. Po użyciu przycisku AddEvent podaje się nazwę zdarzenia – zewnętrzną i wewnętrzną, a także listę przesyłanych parametrów. Istnieje też możliwość zadeklarowania zdarzenia magazynowego. Zgłoszenie zdarzenia odbywa się poprzez wywołanie funkcji o nazwie podanej w polu InternalName (zwykle FireNazwaZdarzenia). RYSOWANIE Rysowanie kontrolek ActiveX nie odbiega w zasadzie od rysowania zwykłych okien w MFC. Procedurę rysującą, OnDraw, tworzy AppWizard. Parametry jej wywołania są nieco bogatsze niż w przypadku konwencjonalnych okien. TRWAŁOŚĆ (PERSISTENCY) Trwałe właściwości (persistent properties) to właściwości, których wartości są przechowywane poza okresami aktywności kontrolki. Jeśli chcemy ustawić właściwości w arkuszu właściwości Visual Basica lub konfigurować je ze strony WWW, musimy uczynić je trwałymi. Z drugiej strony trwałość właściwości wydłuża czas ładowania i inicjalizacji kontrolek, tak więc nie należy mnożyć trwałych właściwości bez potrzeby. Aby włączyć trwałość dla dowolnej właściwości, należy odnaleźć funkcję DoPropExchange (jest ona tworzona przez AppWizarda) i dodać na jej końcu następujące wywołania (po jednym dla każdej trwałej właściwości): PX_TTT(pPX, _T("Nazwa"), zmienna, wart_domyślna); Klasa COleControl oferuje zestaw funkcji PX_TTT dla różnych typów danych (np. PX_Long, PX_String); należy wybrać właściwą spośród nich. Obiekt pPX steruje wymianą danych i jest dostarczany do DoPropExchange jako parametr. Nazwa odpowiada zewnętrznej nazwie właściwości. Dane będą wpisywane lub pobierane do lub z podanej zmiennej. Przy odczycie danych może zostać zastosowana wartość domyślna. Podana funkcja jest wywoływana zarówno przy zapisie wartości właściwości, jak i przy ich odtwarzaniu. To, który z tych dwóch przypadków występuje, można ustalić wywołując pPX->IsLoading(). TWORZENIE ARKUSZY WŁAŚCIWOŚCI Arkusze właściwości pomagają skonfigurować kontrolkę na etapie jej projektowania (np. w Visual Basic czy FrontPage). Służą do edycji wartości trwałych właściwości kontrolki. System uzupełnia arkusz o własną stronę pozwalającą edytować wszystkie trwałe właściwości. Jeśli to nie wystarcza, można skorzystać z własnej strony właściwości, której wstępny projekt dostarcza AppWizard. Należy użyć edytora zasobów by zaprojektować wygląd strony właściwości, a następnie ClassWizarda by dodać zmienne odpowiadające elementom okna. W polu optional property name wpisujemy zewnętrzną nazwę właściwości. UWAGI O AKTUALIZACJI WŁAŚCIWOŚCI W razie zmiany wartości trwałych wartości warto wprowadzić dwa dodatkowe wywołania w funkcji typu Set lub w funkcji notyfikacji: · funkcja SetModifiedFlag informuje system, że stan kontrolki został zmieniony i powinien zostać zapamietany, · funkcja BoundPropertyChanged informuje kontener o zmianie wartości właściwości; parametrem jest identyfikator dispinterfejsu o nazwie dispidNazwaWłaściwości. Wymagana m.in. do w pełni poprawnej współpracy z Visual Basic. Funkcja SetModifiedFlag jest automatycznie wstawiana przez ClassWizarda; dla kontrolek, które nie mają być trwałe, można ja usunąć. W pewnych przypadkach zmiana właściwości powinna natychmiast skutkować zmianą wyglądu kontrolki; w takim przypadku można wywołać InvalidateControl. PEWNE WSKAZÓWKI DOTYCZĄCE OPTYMALIZACJI KONTROLEK Aby przyspieszyć proces ładowania i inicjalizacji kontrolek można: · ograniczyć do minimum liczbę właściwości, metod i zdarzeń (kandydatem do usunięcia jest metoda About), · ograniczyć do minimum liczbę właściwości trwałych, · zlikwidować własne strony właściwości, poprzestając na standardowej, · ograniczać liczbę odwołań do MFC (można też przejść na ATL). KORZYSTANIE Z KONTROLEK Użycie kontrolek ActiveX w Visual C++ wymaga wprowadzenia kontrolki do projektu za pomocą opcji Project|Add to project|Components and controls. Kontrolka będzie w pełni obsługiwana zarówno przez ClassWizarda (tworzona jest klasa C++), jak i edytor zasobów (kontrolka jest wyświetlana na palecie obiektów, obsługiwane są arkusze właściwości itd.). Użycie kontrolek ActiveX w Visual Basic wymaga zaznaczenia kontrolki w okienku uzyskiwanym opcją Projects|Components. Powoduje to wprowadzenie kontrolki do palety dostepnych obiektów. Użycie kontrolek ActiveX w FrontPage wymaga użycia opcji Insert|Advanced|ActiveX control, zwykle w połączeniu z przyciskiem Customize. Możliwe jest edytowanie właściwości kontrolki za pomocą dostępnych arkuszy właściwości. Użycie kontrolek ActiveX w HTML wymaga zastosowania nastepującej konstrukcji: <object classid="clsid:0D276E33-465D-450D-B682-B296AD7DD9A7" id="OLECtrl1" width="206" height="174"> <param name="_Version" value="65536"> <param name="_ExtentX" value="5450"> <param name="_ExtentY" value="4604"> <param name="_StockProps" value="9"> <param name="ForeColor" value="0"> <param name="BackColor" value="16777215"> </object> Identyfikator klasy clsid można łatwo odnaleźć w pliku *.ODL (jako uuid ... coclass). Kontrolki łatwo współpracują z językami skryptowymi, szczególnie z VBScript. Do zdefiniowanej powyżej kontrolki można się odwoływać przez OLECtrl1.NazwaWłaściwości lub OLECtrl1.NazwaMetody(...), zaś funkcje zdefiniowane jako Sub OleCtrl1_NazwaZdarzenia(...) obsługują generowane zdarzenia.