1.1. Kontrolki ActiveX. Kontrolki ActiveX. Technologia ActiveX. Technologia ActiveX. Technologia ActiveX. Technologia ActiveX.



Podobne dokumenty
Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych

Programowanie składnikowe. Programowanie składnikowe w modelu COM. COM - Component Object Model. wprowadzenie. Programowanie składnikowe

Technologie COM i ActiveX COM - Component Object Model

Dodanie nowej formy do projektu polega na:

Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych

Zdarzenia (events, connection points)

Architektura składnikowa a architektura klient serwer. Programowanie składnikowe. Programowanie składnikowe w modelu COM

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Programowanie obiektowe

Komunikacja i wymiana danych

Obiekty w plikach wykonywalnych, marshaling

Agregacja. Wykorzystanie innego komponentu bez użycia agregacji. Simple calculator. Extended calculator

Microsoft Interface Definition Language

Dostrzeżenie ograniczeń schowka [koniec lat 80-tych] OLE 1.0 [1991]

Delphi podstawy programowania. Środowisko Delphi

Instrukcja laboratoryjna cz.3

Programowanie obiektowe

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Microsoft Visual C++

Multimedia JAVA. Historia

Programowanie obiektowe

4 bity zarezerwowane dla przyszłych zastosowań 11 bitów określających źródło błędu 16 bitów określających rodzaj błędu.

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Programowanie obiektowe

//////////////////////////////////////////////////////////// // Kalkulator (prosty) - wersja agregowalna import "unknwn.idl";

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

Visual Basic for Applications. Formatki tworzenie,

Wykład 8: klasy cz. 4

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

Zaawansowane aplikacje internetowe - laboratorium

Laboratorium 1 - Programowanie proceduralne i obiektowe

Programowanie obiektowe

Wykład 4: Klasy i Metody

PROE wykład 2 operacje na wskaźnikach. dr inż. Jacek Naruniec

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

// LISTING #2 DRUGIE PODEJŚCIE

Laboratorium 1. Wzorce oprogramowania lab1, Zofia Kruczkiewicz

Różne właściwości. Różne właściwości. Różne właściwości. C++ - klasy. C++ - klasy C++ - KLASY

Rozdział 4 KLASY, OBIEKTY, METODY

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Programowanie obiektowe

Układy VLSI Bramki 1.0

// LISTING #2 DRUGIE PODEJŚCIE

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Praca w środowisku Visual Studio 2008, Visual C

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Język programowania. Andrzej Bobyk

Język ludzki kod maszynowy

Henryk Budzisz. materiały przygotowane w ramach projektu ZPORR nr POKL /08-00

Visual Studio instalacja

Wykład 12. Programowanie serwera MS SQL 2005 w C#

OLE: Pojęcia podstawowe

Implementacja aplikacji sieciowych z wykorzystaniem środowiska Qt

INTENSE PLATFORM Zmiany w wersji Wersja 7.2

2. W oknie dialogowym Choose Toolbox Items w zakładce.net Framework Components naciskamy przycisk Browse...

Aplikacje w środowisku VBA. Visual Basic for Aplications

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Droga do DCOM DCOM (1996) Windows clipboard (1987) OLE 1 DDE (1992) OLE 2 (1993) COM (1995) Distributed computing (1980s)

Lokalizacja Oprogramowania

1 LINQ. Zaawansowane programowanie internetowe Instrukcja nr 1

JAVA W SUPER EXPRESOWEJ PIGUŁCE

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Pola i metody statyczne. Klasy zawierające pola i metody statyczne

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

1.1. System otwartych baz danych ODBC. System otwartych baz danych ODBC. Interfejs ODBC. Interfejs ODBC. System otwartych baz danych ODBC

Programowanie 2. Język C++. Wykład 3.

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Rozdział 3. Zapisywanie stanu aplikacji w ustawieniach lokalnych

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Podstawy programowania obiektowego

Laboratorium nr 12. Temat: Struktury, klasy. Zakres laboratorium:

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Podstawy Programowania Obiektowego

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

Co to jest klasa? Z programistycznego punktu widzenia klasa stanowi typ danych, który odwzorowuje wspólne cechy jakiegoś obiektu.

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

PHP 5 język obiektowy

VBA w Excel Lekcja ta ma przybliżyć pojęcia związane z programowaniem w pakiecie Office. Poniższe przykłady związane są z wersją Office2007.

Kompilacja javac prog.java powoduje wyprodukowanie kilku plików o rozszerzeniu.class, m.in. Main.class wykonanie: java Main

Politechnika Poznańska Wydział Budowy Maszyn i Zarządzania

Zaawansowane programowanie w C++ (PCP)

Wykład 5 Okna MDI i SDI, dziedziczenie

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Podstawy Rejestru systemu. Poddrzewa

Zaawansowane programowanie w języku C++ Klasy w C++

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów. C++ - przeciążanie operatorów

Interfejs użytkownika (ang. User Interface, UI) w technice część urządzenia odpowiedzialna za interakcję z użytkownikiem

Rys.1. Technika zestawiania części za pomocą polecenia WSTAWIAJĄCE (insert)

Laboratorium Systemów SCADA

Projekt Hurtownia, realizacja rejestracji dostaw produktów

Projektowanie klas c.d. Projektowanie klas przykład

Transkrypt:

1 Katedra Optoelektroniki i Systemów Elektronicznych 2 Kontrolki Oprogramowanie Systemów Elektronicznych Zagadnienia: Temat wykładu Kontrolki 1. Technologia 2. 3. Rejestrowanie kontrolek 4. Projektowanie kontrolki w Visual Studio C++ 5. Wykorzystanie kontrolek 3 Technologia 4 Technologia DDE OLE COM Interfejs zbiór logicznie powiązanych właściwości, metod i zdarzeń obejmujących określoną funkcjonalność (wygląd obiektu, współdziałanie z otaczającą aplikacją, wywoływanie zdarzeń). VBX OCX OLE (Object Linking and Embedding) osadzanie i łączenie obiektów. Technologia pozwalająca na umieszczanie jednego obiektu wewnątrz drugiego i prezentowania go w takiej formie, jak czyni to aplikacja macierzysta. COM (Component Object Model) model programowania zorientowanego obiektowo, udostępniającego programiście technologię OLE. VBX (Visual Basic Controls) kontrolki wizualne utworzone za pomocą Visual Basic (16-bitowe). OCX (OLE Control Extension) kontrolki wizualne przeniesione na platformę 32- bitową, wykorzystujące technologię OLE. promowana przez Microsoft technologia pozwalająca na stosowanie obiektów OLE wewnątrz innych dokumentów w sposób niezależny od systemu operacyjnego. Technologia COM określa, w jaki sposób aplikacje i pojedyncze komponenty mogą współpracować poprzez użycie interfejsów. Technologia definiuje z kolei płaszczyznę zbudowaną na szczycie modelu COM, określając jakiego typu interfejsy powinny wspierać różne obiekty, a także jak różne obiekty powinny ze sobą współpracować. 5 Technologia 6 Technologia Jedną z kluczowych technologii występujących w obiektach jest automatyzacja. Automatyzacja pozwala aplikacji, będącej serwerem (ang. server), na osadzanie się wewnątrz innej aplikacji stanowiącej kontener (ang. container), aktywowanie się i kontrolowanie należącej do niej części interfejsu użytkownika lub dokumentu. Kiedy użytkownik wykona niezbędne zmiany i przejdzie do innej części programu nie kontrolowanej przez aplikację osadzoną, ta samoczynnie kończy swoją pracę. Przykłady: - Edycja równania MS Equation lub arkusza MS Excel w dokumencie MS Word. -Przeglądanie plików pdf w przeglądarce internetowej. - Wykorzystanie komponentów graficznych CVI w aplikacjach Visual C++ Każdy obiekt, który może mieć osadzone w sobie inne obiekty, jest kontenerem. Zatem jedna aplikacja może być równocześnie kontenerem oraz serwerem. Kontener 3 Serwer 4 Kontener 1 Serwer 5 Kontener 2 Serwer 1 Serwer 2 Serwer 3 Kontrolka jest szczególnym przykładem serwera, który nie jest aplikacją i nie jest w stanie funkcjonować samodzielnie. Może być jednak osadzony w innej aplikacji, czyniąc ją automatycznie kontenerem. 1.1

7 Technologia 8 Technologia Każdy obiekt posiada właściwości, które określają jego wygląd oraz sposób interakcji z otoczeniem (kontenerem). Podstawowe grupy właściwości: Ambient zawierają informacje dotyczące parametrów kontenera związanych z jego wyglądem. Są one udostępniane kontrolce w celu umożliwienia dopasowania jej wyglądu do wyglądu kontenera. Kontrolka nie może zmieniać wartości tych właściwości. Przykładowe właściwości należące do tej grupy to BackColor, ForeColor, Font, ScaleUnits (nazwa jednostki odległości używanej przez kontener). Control właściwości ustawiane przez kontrolkę podczas jej osadzania w kontenerze. Zawierają podstawowe parametry związane z typem pracy i wyglądem, np. Enabled, Hwnd (uchwyt do okna kontrolki), Caption, Appearnace (FALSE dla kontrolki 2-D, TRUE dla kontrolki 3-D). Kontrolka utworzona w oparciu o bibliotekę MFC zawiera 9 podstawowych właściwości typu Control. Są to tzw. Stock Properties. Dodając funkcjonalność kontrolki programista określa natomiast nowe właściwości, czyli tzw. Custom Properties. Extended - dodatkowe właściwości ustawiane przez kontener np. Visible, Parent. Obiekt posiada metody, które pozwalają na sterowanie jego pracą z poziomu kontenera. Metody te definiowane są przez programistę. W MFC oprócz tego definiowane są dwie metody tzw. Stock Methods: Refresh() ( odświeżenie wyglądu kontrolki) oraz DoClick() (symulacja naciśnięcia klawiszem myszy na kontrolkę). Obie metody są metodami klasy ColeControl. Obiekt generuje zdarzenie (Event) w sytuacji, gdy odbierze określony komunikat kierowany do niej przez system lub gdy użytkownik wykona na obiekcie określoną operację. Zdarzenia generowane przez obiekt są przekazywane do kontenera, którego zadaniem jest ich obsługa. Typowe zdarzenia związane są z komunikatami generowanymi przez urządzenia peryferyjne (klawiatura, mysz). W MFC są to Click, DblClick, KeyDown, KeyPress, MouseDown, MouseMove. Programista może oczywiście dodawać nowe zdarzenia, które są generowane przez kontrolkę w różnych sytuacjach, np. kontrola zakresu wartości liczbowych, współpraca z inną kontrolką lub aplikacją, monitorowanie zdarzeń interfejsu szeregowego. 9 Kontrolki 10 Zagadnienia: 1. Technologia 2. 3. Rejestrowanie kontrolek 4. Projektowanie kontrolki w Visual Studio C++ 5. Wykorzystanie kontrolek Interfejs IUnknown jest wymagany w każdym obiekcie i służy do ustalenia jakie inne interfejsy są przez obiekt wspierane. Interfejs IUnknown udostępnia trzy podstawowe metody: QueryInterface zwrócenie tablicy wskaźników do wspieranych interfejsów. AddRef, Release Zwiększenie/zmniejszenie licznika odwołań do interfejsu. Jeżeli licznik odwołań zmniejszy się do zera interfejs jest usuwany z pamięci. Metody stosowane w celach diagnostycznych. Ponadto obiekty AvtiveX powinny posiadać zdolność do samorejestrowania się. 11 12 Rodzaje interfejsów: Kontener IOleInPlaceFrame IOleInPlaceUIWindow IOleInPlaceSite IOleClientSaite IAdviseSink IOleControlSite IDispatch (properties) IPropertyNotifySink IDispatch (events) Cztery obszary funkcjonalności: GUI Metody Zdarzenia Właściwości Serwer (kontrolka) IOleInPlaceActiveObject IOleInPlaceObject IOleObject IRunnableObject IDataObject IViewObject2 IOleCache2 IPersistStorage IPersistStreamInit ISpecifyPropertyPages IConnectionPointContainer IConnectionPoint IProvideClassInfo2 IDispatch (methods) IOleControl Wzajemne oddziaływanie między serwerem a kontenerem odbywa się głównie przez trzy interfejsy IDispatch. Jeden z tych interfejsów należy do kontrolki, pozostałe do kontenera. Kontener zdarzenia właściwości Serwer (kontrolka) metody 1.2

13 14 Podstawowym elementem umożliwiającym automatyzację jest interfejs IDispatch (dispinterface). Został utworzony, aby umożliwić nie obiektowym językom programowania (np. Visual Basic) odwoływanie się do obiektów COM. Interfejs IDispatch udostępnia cztery podstawowe metody: 1. GetTypeInfoCount służy do sprawdzania, ile typów zostało zadeklarowanych w bibliotece typów danego obiektu COM; 2. GetTypeInfo zwraca informacje, z których możemy dowiedzieć się, ile metod oferuje konkretny obiekt, jakie są ich nazwy i parametry ich wywołań; czasami zawiera opisy metod; 3. GetIDsOfNames zwraca uchwyt (wskaźnik) do metody, której nazwa została przekazana jako parametr wywołania funkcji; 4. Invoke powoduje wykonanie metody, odczyt lub zmianę wartości właściwości o identyfikatorze pobranym przez funkcję GetIDsOfNames. Interfejs IDispatch zawiera wskaźnik do tablicy aktywnych metod, które mogą być uruchamiane wewnątrz kontrolki lub osadzonej aplikacji. Każda metoda posiada identyfikator DISPID. Uruchomienie metody osadzonego obiektu odbywa się przez wywołanie funkcji Invoke z parametrem DISPID, identyfikującym metodę. Idispatch::Invoke(DISPID) Klient Tablica inentyfikatorów interfejsu IDispatch Obiekt Invoke() { switch (DISPID) { case 1: MetodaX(); case 2: MetodaY(); case 3: MetodaZ(); 15 16 HRESULT Invoke( DISPID dispidmember, REFIID riid, LCID lcid, WORD wflags, DISPPARAMS FAR* pdispparams, VARIANT FAR* pvarresult, EXCEPINFO FAR* pexcepinfo, unsigned int FAR* puargerr); Parametry funkcji Invoke: DISPID dispidmember - identyfikator (metody, właściwości) REFIID riid - IID_NULL LCID lcid - identyfikator narodowościowy, wykorzystywany przez funkcję GetIDsOfNames WORD wflags - przyczyna wywołania funkcji: DISPATCH_METHOD wywołanie metody DISPATCH_PROPERTYGET pobranie wartości właściwości DISPATCH_PROPERTYPUT ustawienie wartości właściwości DISPATCH_PROPERTYPUTREF - ustawienie wartości właściwości poprzez zmienną referencyjną Parametry funkcji Invoke cd.: DISPPARAMS FAR* pdispparams - wskaźnik do struktury DISPPARAMS, przez którą przekazywane są parametry VARIANT FAR* pvarresult - wskaźnik do obszaru pamięci gdzie ma zostać zapisany rezultat wykonania funkcji. Jeśli funkcja nic nie zwraca to NULL. Parametr jest ignorowany jeśli ustawiane są wartości właściwości. EXCEPINFO FAR* pexcepinfo - Wskaźnik do struktury zawierającej informacje o błędzie. Może być NULL. unsigned int FAR* puargerr pierwszy element w tablicy parametrów funkcji dla którego wystąpił błąd. Parametr jest aktualizowany jeśli funkcja Invoke zwróci DISP_E_TYPEMISMATCH lub DISP_E_PARAMNOTFOUND. 17 18 Przykładowe wartość zwracana przez funkcję Invoke: Parametry dla metody lub właściwości są przekazywane przez strukturę DISPPARAMS Return value S_OK DISP_E_BADPARAMCOUNT DISP_E_BADVARTYPE DISP_E_EXCEPTION DISP_E_MEMBERNOTFOUND DISP_E_NONAMEDARGS DISP_E_PARAMNOTFOUND Meaning OK Niewłaściwa liczba parametrów Niewłaściwy typ parametru Wystąpił wyjątek Właściwość nie istnieje, lub jest tylko do odczytu Implementacja interfejsu IDispatch nie zezwala na stosowanie nazw parametrów Nie znaleziono parametru typedef struct FARSTRUCT tagdispparams{ VARIANTARG FAR* rgvarg; // tablica argumentów DISPID FAR* rgdispidnamedargs; // Identyfikatory argumentów zdefiniowanych nazwami unsigned int cargs; // Liczba argumentów unsigned int cnamedargs; // Liczba argumentów zdefiniowanych nazwami DISPPARAMS; Parametry w tablicy rgvarg są przekazywane w odwrotnej kolejności, tj. rgvarg[cargs 1] pierwszy parametr rgvarg[0] ostatni parametr 1.3

19 20 Zmienna typu VARIANT: typedef struct FARSTRUCT tagvariant VARIANTARG; struct FARSTRUCT tagvariant{ VARTYPE vt; //typ parametru unsigned short wreserved1; unsigned short wreserved2; unsigned short wreserved3; union { short ival; /* VT_I2 */ // wartość parametru // The rest of this union specifies numerous other types. Zmienna typu VARTYPE: typedef unsigned short VARTYPE; enum VARENUM { VT_EMPTY = 0, VT_NULL = 1, VT_I2 = 2, VT_I4 = 3, VT_R4 = 4, VT_R8 = 5, VT_CY = 6, VT_DATE = 7, VT_BSTR = 8, VT_DISPATCH = 9, VT_ERROR = 10, VT_BOOL = 11, VT_VARIANT = 12, VT_UNKNOWN = 13, VT_UI1 = 17,... ; ; VARIANTARG; VT_RESERVED = 0x8000 VT_BYREF = 0x4000 VT_ARRAY = 0x2000 21 22 Przykład wywołania metody Simple klasy CMyObject (bez parametrów): Przykład wywołania metody Simple klasy CMyObject (bez parametrów) cd.: HRESULT hresult; // rezultat wykonania funkcji IUnknown FAR* punk; // wskaźnik do interfejsu IUnknown IDispatch FAR* pdisp = (IDispatch FAR*)NULL; // wskaźnik do interfejsu IDispatch OLECHAR FAR* szmember = "Simple"; // nazwa metody DISPID dispid; // identyfikator metody DISPPARAMS dispparams = {NULL, NULL, 0, 0; // struktura z parametrami dla metody Simple //Osadzenie obiektu klasy CMyObject i pobranie wskaźnika do interfejsu IUnknown (punk) hresult = CoCreateInstance(CLSID_CMyObject,NULL, CLSCTX_SERVER, IID_Unknown, (void FAR* FAR*)&punk); // Pobranie wskaźnika do interfejsu IDispatch (pdisp) hresult = punk->queryinterface(iid_idispatch, (void FAR* FAR*)&pdisp); // Pobranie identyfikatora metody Simple (dispid) hresult = pdisp->getidsofnames(iid_null, &szmember, 1, LOCALE_USER_DEFAULT, &dispid); // Wywołanie funkcji Simple hresult = pdisp->invoke( dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, NULL, NULL, NULL); 23 24 Przykład pobrania wartości właściwości On: VARIANT FAR *pvarresult; // wskaźnik do zmiennej typu VARIANT, // przechowującej wartość // odczytanej właściwości. //... szmember = "On"; hresult = pdisp->getidsofnames(iid_null, &szmember, 1, LOCALE_USER_DEFAULT, &dispid); hresult = pdisp->invoke( dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispparams, pvarresult, NULL, NULL); Przykład zmiany wartości właściwości On: // identyfikator reprezentujący zmianę wartości właściwości DISPID mydispid = DISPID_PROPERTYPUT dispparams.rgvarg[0].vt = VT_BOOL; // typ właściwości dispparams.rgvarg[0].bool = FALSE; // nowa wartość // Zmieniając wartość właściwości musimy podać argument // zdefiniowany nazwą reprezentujący przypisanie wartości // do właściwości. dispparams.rgdispidnamedargs = &mydispid; dispparams.cargs = 1; dispparams.cnamedargs = 1; // zmiana właściwości hresult = pdisp->invoke( dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYPUT, &dispparams, NULL, NULL, NULL); 1.4

25 Kontrolki 26 Rejestrowanie kontrolek Zagadnienia: 1. Technologia 2. 3. Rejestrowanie kontrolek 4. Projektowanie kontrolki w Visual Studio C++ 5. Wykorzystanie kontrolek Jeśli kontrolka nie posiada programu instalacyjnego to należy ją zarejestrować programem regsvr32.exe, np. regsvr32.exe MyCtrl.ocx. Rejestracja kontrolki polega na zapisaniu w rejestrze Windows większości informacji dotyczących obiektu (np. lokalizacja kontrolki na dysku). Informacje te są wykorzystywane za każdym razem, kiedy aplikacja używa obiektu. Program regsvr32.exe ponadto wywołuje funkcję DLLSelfRegister. Parametry programu regsvr32.exe: Regsvr32 [/u] [/s] [/n] [/i[:cmdline]] dllname /s - Silent; display no message boxes /u - Unregister server /i - Call DllInstall passing it an optional [cmdline]; when used with /u calls dll uninstall /n - do not call DllRegisterServer; this option must be used with /i 27 Rejestrowanie kontrolek 28 Kontrolki Każda kontrolka ma przypisany unikalny identyfikator (CLSID) class ID. Jest to liczba 128 bitowa zapisana heksalnie np. {03437DCB-1719-4119-B253-02B4939A2CF4 Zarejestrowane w systemie kontrolki są wyszczególnione w gałęzi HKEY_LOCAL_MACHINE\SOFTWARE\CLASSES\CLSID Zagadnienia: 1. Technologia 2. 3. Rejestrowanie kontrolek 4. Projektowanie kontrolki w Visual Studio C++ 5. Wykorzystanie kontrolek 29 Projektowanie kontrolki 30 Projektowanie kontrolki Liczba kontrolek w projekcie Czy będzie wymagana licencja? Czy w kodzie mają być zamieszczane komentarze? Czy mają być wygenerowane szkieletowe pliki pomocy? 1.5

31 Projektowanie kontrolki 32 Projektowanie kontrolki Klasy wykorzystywane do budowania kontrolki: CSimpleSliderApp:COleControlModule:CWnd Czy kontrolka ma się uaktywniać gdy staje się widoczna? Czy kontrolka może być niewidoczna w czasie działania? Czy kontrolka ma być dostępna z poziomu innych projektów? Czy kontrolka ma pełnić tylko funkcję pojemnika? Klasa zawiera dwie metody wykorzystywane przy ładowaniu i usuwaniu kontrolki z pamięci InitInstance(); ExitInstance(); CSimpleSliderCtrl:COleControl:CWnd Klasa zapewnia podstawową funkcjonalność kontrolki. Zawiera metody i właściwości oraz pozwala na generowanie zdarzeń. CSimpleSliderPropPage:COlePropertyPage:CWnd Klasa okna dialogowego właściwości kontrolki. 33 Projektowanie kontrolki 34 Projektowanie kontrolki /////////////////////////////////////////////////////////////// // CSimpleSliderCtrl::OnDraw - Drawing function void CSimpleSliderCtrl::OnDraw(CDC* pdc, const CRect& rcbounds, const CRect& rcinvalid) { // TODO: Replace the following code with // your own drawing code. pdc->fillrect(rcbounds, CBrush::FromHandle( (HBRUSH)GetStockObject(WHITE_BRUSH))); pdc->ellipse(rcbounds); 35 Projektowanie kontrolki 36 Projektowanie kontrolki Kontrolka SimpleSlider Kontrolka SimpleSlider m_min m_pos m_max Właściwości: m_min/m_max minimalna/maksymalna wartość m_pos położenie suwaka (m_min < m_pos < m_max) Metody: short GetPosition(); pobranie aktualnej pozycji suwaka void SetPosition(short nnewvalue); ustawienie nowej pozycji suwaka void GetRange(short *min, short *max); pobranie zakresu void SetRange(short min, short max); ustawienie zakresu void OnMaxChanged(); zmiana wartości maksymalnej void OnMinChanged(); zmiana wartości maksymalnej 1.6

37 Projektowanie kontrolki 38 Projektowanie kontrolki Dodawanie właściwości class CSimpleSliderCtrl : public COleControl { DECLARE_DYNCREATE(CSimpleSliderCtrl) public: CSimpleSliderCtrl(); virtual void OnDraw(CDC* pdc, const CRect& rcbounds, const CRect& rcinvalid); virtual void DoPropExchange(CPropExchange* ppx); virtual void OnResetState(); protected: ~CSimpleSliderCtrl(); private: short m_width; // szerokość kontrolki short m_pos; // aktualne położenie suwaka short m_pos0; // poprzednie położenie suwaka ; Dodawanie właściwości 39 Projektowanie kontrolki 40 Projektowanie kontrolki Dodawanie właściwości Dodawanie właściwości Właściwość: m_pos - Nazwa zewnętrzna Position Metody: short GetPosition(); void SetPosition(short nnewvalue); Właściwości: m_min, m_max Metody: void OnMinChanged(); void OnMaxChanged(); 41 Projektowanie kontrolki 42 Projektowanie kontrolki Dodawanie metod Dodawanie zdarzeń Metody: void GetRange(short *, short *); void SetRange(short, short); 1.7

43 Projektowanie kontrolki 44 Projektowanie kontrolki Dodawanie zdarzeń Edycja kodu źródłowego // dodatkowa funkcja kontroli zakresu BOOL CSimpleSliderCtrl::CheckValues() { BOOL modified = FALSE; if (m_min >= m_max) { m_min = 0; m_max = 100; modified = TRUE; if (m_pos < m_min) { m_pos = m_min; modified = TRUE; if (m_pos > m_max) { m_pos = m_max; modified = TRUE; return modified; 45 Projektowanie kontrolki 46 Projektowanie kontrolki Edycja kodu źródłowego short CSimpleSliderCtrl::GetPosition() { return m_pos; void CSimpleSliderCtrl::SetPosition(short nnewvalue) { m_pos = nnewvalue; if (CheckValues()) FireParamsModified(); InvalidateControl();//wymuszenie wykonania funkcji OnDraw void CSimpleSliderCtrl::GetRange(short *min, short *max) { *min = m_min; *max = m_max; void CSimpleSliderCtrl::SetRange(short min, short max) { m_min = min; m_max = max; if (CheckValues()) FireParamsModified(); Edycja kodu źródłowego void CSimpleSliderCtrl::OnResetState() { // Resets defaults found in DoPropExchange COleControl::OnResetState(); m_min = 0; m_max = 100; m_pos = 50; void CSimpleSliderCtrl::OnMinChanged() { if (CheckValues()) FireParamsModified(); InvalidateControl(); void CSimpleSliderCtrl::OnMaxChanged() { if (CheckValues()) FireParamsModified(); InvalidateControl(); 47 Projektowanie kontrolki 48 Projektowanie kontrolki Edycja kodu źródłowego void CSimpleSliderCtrl::OnDraw(CDC* pdc, const CRect& rcbounds, const CRect& rcinvalid) { // rcbounds wymiary okienka kontrolki // klasa CRect zawiera pola: left, top, right, bottom. // szerokość kontrolki m_width = rcbounds.right - rcbounds.left; // obliczenie położenia suwaka względem okienka kontrolki int centerpos = m_width * (m_pos-m_min) / (m_max-m_min); // Suwak stanowi dwa przylegające do siebie prostokąty CRect selbounds = rcbounds, notselbounds = rcbounds; //... Edycja kodu źródłowego //... selbounds.right = centerpos; CBrush lselbrush; lselbrush.createsolidbrush(rgb(0, 64, 224)); pdc->selectobject(&lselbrush); pdc->fillrect(selbounds,&lselbrush); notselbounds.left = centerpos; CBrush lnotselbrush; lnotselbrush.createsolidbrush(rgb(224, 224, 224)); pdc->selectobject(&lnotselbrush); pdc->fillrect(notselbounds,&lnotselbrush); 1.8

49 Projektowanie kontrolki 50 Projektowanie kontrolki Funkcje obsługi zdarzeń WM_MOUSEMOVE i WM_LBUTTONDOWN WM_MOUSEMOVE void CSimpleSliderCtrl::OnMouseMove(UINT nflags,cpoint point) { if ((nflags & MK_LBUTTON) == MK_LBUTTON) { m_pos = m_min + (m_max - m_min) * point.x / m_width; CheckValues(); if (m_pos!= m_pos0) { // wywołanie zdarzenia PosChanged FirePosChanged(m_pos); m_pos0 = m_pos; InvalidateControl(); COleControl::OnMouseMove(nFlags, point); Funkcje obsługi zdarzeń WM_MOUSEMOVE i WM_LBUTTONDOWN WM_LBUTTONDOWN void CSimpleSliderCtrl::OnLButtonDown(UINT nflags,cpoint point) { m_pos = m_min + (m_max - m_min) * point.x / m_width; FirePosChanged(m_pos); InvalidateControl(); COleControl::OnLButtonDown(nFlags, point); 51 Projektowanie kontrolki 52 Projektowanie kontrolki Edycja okna właściwości Edycja okna właściwości 53 Projektowanie kontrolki 54 Projektowanie kontrolki Funkcja obsługi okna właściwości void CSimpleSliderCtrl::DoPropExchange(CPropExchange* ppx) { ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wvermajor)); COleControl::DoPropExchange(pPX); PX_Short(pPX, _T("Position"), (short &)m_pos, 50); PX_Short(pPX, _T("Min"), (short &)m_min, 0); PX_Short(pPX, _T("Max"), (short &)m_max, 100); Testowanie kontrolki BOOL PX_Short( CPropExchange* ppx, //wskaźnik do obiektu klasy CPropExchange LPCTSTR pszpropname, // nazwa modyfikowanej właściwości short& svalue, // zmienna przechowująca wartość // właściwości w klasie COlePropertyPage sdefault // domyślna wartość właściwości ); 1.9

55 Projektowanie kontrolki 56 Kontrolki Testowanie kontrolki Zagadnienia: 1. Technologia 2. 3. Rejestrowanie kontrolek 4. Projektowanie kontrolki w Visual Studio C++ 5. Wykorzystanie kontrolek 57 58 z kontrolką SimpleSlider Klasa dodana do projektu po utworzeniu zmiennej m_slider class CSimpleSlider : public CWnd { public: CLSID const& GetClsid() { static CLSID const clsid = { 0x3437dcb, 0x1719, 0x4119, { 0xb2, 0x53, 0x2, 0xb4, 0x93, 0x9a, 0x2c, 0xf4 ; return clsid; // Attributes short GetMin(); short GetMax(); void SetMin(short); void SetMax(short); short GetPosition(); void SetPosition(short); // Operations void SetRange(short Min, short Max); void GetRange(short* Min, short* Max); ; 59 60 Przykładowe metody klasy CSimpleSlider w projekcie short CSimpleSlider::GetMin() { short result; GetProperty(0x1, VT_I2, (void*)&result); return result; void CSimpleSlider::SetMin(short propval) { SetProperty(0x1, VT_I2, propval); short CSimpleSlider::GetPosition() { short result; GetProperty(0x3, VT_I2, (void*)&result); return result; void CSimpleSlider::SetPosition(short propval) { SetProperty(0x3, VT_I2, propval); Przykładowe metody klasy CSimpleSlider w projekcie ///////////////////////////////////////////////////////////////// // CSimpleSlider operations void CSimpleSlider::SetRange(short Min, short Max) { static BYTE parms[] = VTS_I2 VTS_I2; InvokeHelper(0x4, DISPATCH_METHOD, VT_EMPTY, NULL, parms, Min, Max); void CSimpleSlider::GetRange(short* Min, short* Max) { static BYTE parms[] = VTS_PI2 VTS_PI2; InvokeHelper(0x5, DISPATCH_METHOD, VT_EMPTY, NULL, parms, Min, Max); 1.10

61 62 Uzupełnienie kodu źródłowego aplikacji testslider Dodanie funkcji obsługi zdarzeń PosChanged i ParamsModified void CTestSliderDlg::OnGet() { m_slider.getrange(&m_min, &m_max); m_pos = m_slider.getposition(); UpdateData(FALSE); void CTestSliderDlg::OnSet() { UpdateData(TRUE); m_slider.setrange(m_min, m_max); m_slider.setposition(m_pos); 63 64 Uzupełnienie kodu źródłowego funkcji obsługi zdarzeń kontrolki SimpleSlider Dynamiczne dodawanie kontrolek do aplikacji void CTestSliderDlg::OnPosChangedSimpleslider(short newpos) { m_pos = newpos; UpdateData(FALSE); void CTestSliderDlg::OnParamsModifiedSimpleslider() { m_pos = m_slider.getposition(); m_slider.getrange(&m_min, &m_max); UpdateData(FALSE); 65 Dynamiczne dodawanie kontrolek do aplikacji class CTestSliderDlg : public CDialog { //... // m_slider2 - zmienna kontrolki tworzonej dynamicznie CSimpleSlider m_slider, m_slider2; /... ; void CTestSliderDlg::OnCreateActivex() { m_slider2.createcontrol(m_slider2.getclsid(), NULL, WS_VISIBLE, CRect(20,200,320,260), this, 0); void CTestSliderDlg::OnDestroyActivex() { m_slider2.destroywindow(); 1.11