Rozdział 9
Stosowanie kontrolek ActiveX
Umieszczanie zaawansowanych kontrolek ActiveX we własnym projekcie
Konfigurowanie właściwości i stylu kontrolek Użycie w programie
danych pochodzÄ…cych z kontrolek
Cały wysiłek programistów ubiegłej dekady skoncentrowany był w dużej mierze na
rozwiązywaniu problemu ponownego wymyślania koła i trwał przez całe lata 80-te. Techniki
takie jak programowanie obiektowe oraz COM/OLE (Component Object Model/ Object
Linnking Embedding) są wynikiem tych wysiłków. W obecnej chwili możemy zakupić bardzo
zaawansowane, gotowe obiekty w postaci kontrolek ActiveX i w łatwy sposób zintegrować je
z własną aplikacją, zaoszczędzając tym samym długie godziny, dni, a może nawet i miesiące
pracy programistycznej.
Dostępnych jest również wiele kontrolek za darmo, a niektóre rozprowadzane są jako
oprogramowanie typu shareware. Jeśli jednak ktoś chciałby pisać własne kontrolki, nie ma
problemu, można je później rozpowszechnić jako darmowe lub sprzedać innym twórcom
oprogramowania.
PATRZ TAKŻE
• O tworzeniu wÅ‚asnych kontrolek ActiveX możesz przeczytać w rozdziale 26.
• By dowiedzieć siÄ™ wiÄ™cej na temat COM oraz OLE przejdź do rozdziaÅ‚u 25.
Kontrolki ActiveX a Intemet
Dzięki rozwojowi technologii Active Server Pages, kontrolki ActiveX oraz skrypty serwera mogą być
umieszczane na stronach Web w celu zwiększenia ich atrakcyjności i rozszerzenia możliwości
przeglÄ…darek.
206 Poznaj Visual C++ 6
Wybór kontrolek ActiveX z galerii Component Gallery
Component Gallery jest kolekcją gotowych komponentów, które możemy pobrać i
włączyć do własnej aplikacji w celu rozszerzenia jej możliwości. Visual C++ dostarczany jest
wraz z wieloma obiektami ActiveX, które dołączać można do swej aplikacji w każdym
momencie. Kontrolki ActiveX oparte są o technikę COM, w związku z czym można je wy-
korzystywać nie tylko w Visual C++, ale także w Visual Basie czy Visual J++, jak również w
każdym innym języku programowania, który umożliwia współpracę z obiektami COM. Z tego
powodu dokumentacja tych kontrolek posługuje się najczęściej przykładami zaczerpniętymi z
Visual Basica. Jednakże w Visual C++ obowiązują dokładnie te same metody.
PrzeglÄ…danie kontrolek ActiveX
Aby sprawdzić działanie kontrolek ActiveX w działaniu, utworzymy nową aplikację
opartą o architekturę okna dialogowego, w którym będziemy mogli następnie umieścić takie
obiekty. NaszÄ… nowÄ… aplikacjÄ™, utworzonÄ… za pomocÄ… AppWizard nazwiemy ActiveX.
Po utworzeniu aplikacji możemy obejrzeć listę zarejestrowanych w systemie kontrolek
ActiveX, wykonując poniższe czynności:
PrzeglÄ…danie kolekcji kontrolek ActiveX w Component Gallery
1. Kuknij menu Project, a z niego wybierz pozycjÄ™ Add to Project.
2. Z menu podrzędnego wybierz Components and Controls.
3. Kliknij dwukrotnie katalog Registered ActiveX Controls.
4. Powinieneś ujrzeć okno listy podobne do widocznego na rysunku 9. l.
-3 Ej a-J fiijHJ
Ctioose a component to
inserttntoyourproject Look )n: j -^
Registered Actr^eX Cantrols
llffiDBGnd Central
S3Marqu@eCtl Obje
O
IsllMicrosoflAnimation Confrol vefsion
5.0 SSMIcrosottCommon Dialog
CorHrol.version 5.0 ^Miciosott
Communicotions Control, veision 5.0
BMicrosott DBCombo Control.
',/er^.ion c BMiaosott DBList
Control. version 5.0 :
iMicrosott Fle?(Grid ConIroL
yersion 5.0:; l KMicrosofl Forms
2.0 CheckBon 1
|)MicrosoftFoiTns2.0 ComboBox
:|
.iMicfosoflFormsS.OComrriaridBu
tton s ^MicrosoftFDrms2.0Frame
'.. fiMicrosoft Folms 2.0 Image
Filenome^ |CalendafConfrol
B.O.Ink
O
Rysunek 9.1. Zarejestrowane w systemie kontrolki ActiveX wyświetlone w Component and Controls
Gallery
Stosowanie kontrolek ActiveX 207
O Wykonywalny kod kontrolek ActiveX zapisywany jest w plikach .ocx (widoczny tu kalendarz
dołączany jest do pakietu MS Office 97, lecz może to być również wersja wcześniejsza lub późniejsza,
w zależności od zainstalowanego oprogramowania),
Zauważmy, iż w oknie Components and Controls Gallery wylistowane obiekty są wyświetlane
jako typowe skróty Windows Explorera. Nazwa pliku, w którym zapisany jest kod danego obiektu,
wyświetlona zostaje w polu Path to Control u dołu okna. Kody kontrolek ActiveX zapisywane są
obecnie w plikach .ocx, jak również .DLL. W przypadku dystrybucji naszego oprogramowania musimy
pamiętać zatem o dołączeniu tych plików do innych, zawierających kod aplikacji i zarejestrowaniu ich w
systemie. Obiekty kontrolne mogą zostać zarejestrowane przez program regsvr32.exe, wywołanym
poleceniem Run z menu systemowego Start lub z linii poleceń:
regsvr32 C:\Windows\System\mscal.ocx
Procedura ta dokona zarejestrowania obiektu w systemie i wymagana jest w przypadku instalowania
nowego oprogramowania. Obiekty widoczne na liście Components and Controls Gallery są obiektami
już zarejestrowanymi.
Po wybraniu interesującego nas obiektu, skorzystać możemy z uaktywnionego przycisku Morę
Info. Jego użycie spowoduje wyświetlenie systemowego okna pomocy, zawierającego informacje o
obiekcie i sposobie jego wykorzystania.
Z informacji tam zawartych dowiedzieć się możemy, iż kontrolki ActiveX, podobnie do innych
obiektów sterujących, posiadają właściwości, metody i zdarzenia. Konfiguracja właściwości umożliwia
zmianę wizualnych aspektów obiektu, metody pozwalają na wymianę informacji z innymi obiektami, a
zdarzenia wywołują nasze własne kody, które współdziałają z kontrolkami (np. w przypadku naciśnięcia
przycisku).
Włączanie nowego obiektu do bieżącego projektu
Aby umieścić obiekt kalendarza w oknie dialogowym naszej aplikacji, musimy w oknie
Components and Controls kliknąć reprezentującą go pozycję Calendar Control 8.0. Po zaznaczeniu
właściwej pozycji, należy kliknąć przycisk Insert, po czym ukaże się okno z zapytaniem Insert This
Component? (Czy umieścić ten komponent?), na co odpowiadamy kuknięciem OK.
Kolejne okno dialogowe, które zostanie wyświetlone, przedstawione jest na rysunku 9.2. Podaje ono
nazwy plików, które zostaną włączone do projektu, w celu zaimplemen-towania klas interfejsu
niezbędnych do działania kontrolki. Wewnątrz tego okna możemy zmieniać nazwy zarówno klas, jak i
dołączanych plików. W normalnych sytuacjach jednak nie czyni się tego; jedynie gdy dołączane pliki lub
klasy pozostają w konflikcie nazw z innymi, już wykorzystywanymi. Możemy także zmienić selekcję
dołączanych klas, lecz w większości wypadków należy pozostawić wszystko w stanie, jaki zaproponuje
program.
208 Poznaj Visual C++ 6
Rysunek 9.2. Okno dialogowe Confirm CIasses umożliwia zmianę nazw plików implementacyjnych
Gdy zatwierdzimy bieżący wybór i klikniemy OK, wymienione klasy wraz z ich plikami
implementacyjnymi zostaną dołączone do projektu. Od tej chwili nowe klasy powinny być uwidocznione
na karcie ClassView w panelu Project Workspace. Klasy ccalendar i coleFont dostarczajÄ… nam jedynie
atrap funkcji dla obiektu kalendarza i użytych w nim czcionek.
Czym są atrapy funkcji? Jeśli klikniemy znak plusa widoczny obok pozycji ccalen-dar w celu
wyświetlenia funkcji składowych tej klasy, a następnie funkcję GetBackCo-lor (), zobaczymy że jej
implementacjÄ™ stanowi zaledwie kilka linii w edytorze:
unsigned long CCalendar::GetBackColor() ( unsigned long result ;
InvokeHelper(DISPID_BACKCOLOR , DISPATCH_PROPERTYGET , VT_I4, (void*)&result , NULL) ;
return result ;
Pozostałe funkcje mają postać podobną do powyższej. Są to właśnie atrapy funkcji lub inaczej
funkcje odsyłające. Możemy je wywoływać w taki sam sposób jak zwykłe funkcje, jednakże ich
właściwy kod implementacyjny zapisany jest w plikach .OCX lub .DLL. Te atrapy funkcji używają
interfejsu COM do wywoływania właściwego kodu, za pomocą funkcji invokeHelper(). Parametry
przekazywane funkcji lub z niej pobierane zostają skon-wertowane na parametry variant i wysyłane do
lub odbierane z właściwego kodu. Takie rozwiązanie przynosi nam trzy korzyści. Po pierwsze,
umożliwia zmniejszenie rozmiarów naszej aplikacji, gdyż do własnego kodu nie musimy włączać
pełnego zapisu funkcji, a jedynie ich trzon. Po drugie, zapewnia naszemu kodowi kompatybilność z
przyszłymi wersjami użytych kontrolek (zakładając, iż ich autor utrzyma dotychczasowy interfejs).
Możemy w związku z tym uaktualniać użyte kontrolki bez konieczności tworzenia nowej wersji aplika-
cji. Po trzecie wreszcie, zapewnia to ochronę własności intelektualnej autora obiektu, gdyż właściwy kod
jest dla nikogo niewidoczny.
r mm. \ HIV.C
^ By dowiedzieć się, co oznaczają skróty COM oraz OLE, przejdź do rozdziału 25.
Kontrolki VBX i Visual Basie sÄ… kompatybilne
Kontrolki Visual Basie są przodkami kontrolek OCX i choć funkcjonują odmiennie, mogą być użyte
przez 16-bitowy kompilator Visual C++. Kontrolki VBX nie sÄ… jednak kompatybilne z 32-bitowym
C++ i programy 32-bitowe muszą korzystać z kontrolek OCX (ActiveX).
Wybór, skalowanie i testowanie kontrolek ActiveX z paska narzędziowego
Controls
Oprócz umieszczenia w projekcie klas interfejsu dla nowych obiektów, dodana zostaje do
paska narzędziowego Controls w edytorze zasobów nowa ikona, reprezentująca kon-trolki
ActiveX.
Umieszczenie kontrolki ActiveX w oknie dialogowym
Kontrolka kalendarza jest już gotowa do użycia w oknie dialogowym naszej aplikacji.
Otwórzmy zatem panel ResourceView, w którym widoczne są rodzaje zasobów użytych w
projekcie ActiveX. Po otwarciu katalogu Dialog, dwukrotnym kuknięciem pozycji
IDD_ACTIVEX_DIALOG w oknie edytora zasobów otwarty zostanie szablon okna dialogowego
aplikacji. Zwiększamy wymiary szablonu i usuwamy widoczny pośrodku napis TODO: Place
dialog controls here. Na pasku narzędziowym Controls powinna być widoczna nowa ikona,
wskazana na rysunku 9.3.
1 >t @ Aa abl
Q a lx (?. II m
a ż
^ EE3 fl- E^
^ F:' Q H
o^S
Rysunek 9.3. Nowa pozycja, ActiveX Calendar, umieszczona na pasku narzędziowym Controls
O Ikona kontrolki Calendar Control 8.0.
210_____________________________________Poznaj Visual C++ 6
Kontrolkę tę możemy umieścić na szablonie w taki sam sposób, jak wszelkie inne
kontrolki, czyli przeciągając ją z paska narzędziowego bezpośrednio w obręb szablonu. Także
operacja wymiarowania przebiega tak samo, jak w wypadku innych obiektów.
Prawdopodobnie będzie konieczne zwiększenie rozmiarów nowego obiektu w bieżącym
przykładzie.
Dodawanie kontrolek ActiveX z edytora
Zamiast wybierać kontrolki ActiveX z kolekcji Component Gallery, jeśli znamy obiekt, o
który nam chodzi, możemy go pobrać bezpośrednio z edytora. Poprzez kliknięcie prawym
klawiszem myszy w obrębie szablonu okna dialogowego otwieramy menu skrótów, w którym
znajdujemy pozycjÄ™ Insert ActiveX Control. Jej wybranie spowoduje otwarcie okna
dialogowego o tym samym tytule.
Okno to wyświetla listę kontrolek ActiveX zainstalowanych w systemie, które możemy
wybrać stąd bezpośrednio i umieścić w oknie dialogowym tworzonej aplikacji. Z listy tej
wybierzmy Microsoft MCI Control, version 5 (pamiętajmy, iż numer wersji mógł ulec
zmianie). Gdy klikniemy OK, na szablonie okna dialogowego powinien pojawić się nowy
obiekt. Będzie to obiekt typu MCI (Media Control Interface), który podczas prac projek-
towych nad 'oknem dialogowym ma postać białego prostokąta. Przesuniemy go w lewy dolny
róg okna.
Przy użyciu tej metody interfejs dla tego obiektu nie został dodany. Możemy to jednak
nadrobić za pomocą CIassWizard, przypisując obiektowi zmienną składową, co zostanie
opisane nieco dalej.
Kontrolka typu MCI daje nam do dyspozycji zestaw przycisków, które możemy połączyć
z urządzeniami multimedialnymi, na przykład waveaudio dla odtwarzania plików ,WAV,
cdaudio dla odtwarzania CD bądź digitalvideo, odtwarzający sekwencje wideo.
Testowanie kontrolki w edytorze okna dialogowego
Funkcjonowanie obydwóch umieszczonych w oknie dialogowym kontrolek możemy
przetestować korzystając ze zwykłego trybu testującego edytora. Z menu Layout wybierzemy
zatem pozycję Test lub użyjemy skrótu klawiaturowego Ctri+T. Powinniśmy ujrzeć okno
dialogowe takie jak na rysunku 9.4, zawierające umieszczone działające kontrolki ActiveX.
PATRZ TAKŻE
• WiÄ™cej szczegółów na temat edycji okien dialogowych znajdziesz w rozdziale 3.
• By dowiedzieć siÄ™ wiÄ™cej o MCI i stosowaniu bibliotek API, zajrzyj do rozdziaÅ‚u 28.
Stosowanie kontrolek ActiveX 211
Zmiana właściwości kontrolki w edytorze zasobów
Tak jak w przypadku innych obiektów sterujących, właściwości kontrolek ActiveX mogą
być zmieniane w panelu właściwości, podzielonym na kilka kart. Właściwości można
zmieniać również w sposób programowy, używając do tego funkcji klasy interfejsu, gdy do
obiektu zostanie przypisana zmienna. Okno właściwości możemy otworzyć naciskając
Alt+Enter lub wybierając pozycję Properties z menu skrótów.
Ustalanie właściwości standardowych
Korzystając z karty Generał podobnie jak w przypadku innych obiektów, możemy ustalić
identyfikator dla nowej kontrolki oraz dokonać kilka innych ustawień, korzystając z
dostępnych pól wyboru. Klikniemy zatem prawym klawiszem myszy kontrolkę kalendarza, a
z menu skrótów wybierzmy pozycję Properties Calendar Object, co otworzy okno
właściwości tego obiektu. Zmienimy identyfikator ID z IDC_CALENDARI na IDC_CALENDAR.
Podobnie w oknie właściwości obiektu MCI zmienimy jego identyfikator na
IDC_MMCONTROL.
Korzystanie z kart właściwości
Pozostałe karty umożliwiają dokonanie zmian właściwości specyficznych dla danego typu
obiektu. W oknie właściwości kalendarza wybierzemy kartę Control. Ujrzymy na niej kilka
charakterystycznych dla tego obiektu opcji, widocznych na rysunku 9.5.
Rysunek 9.5. Właściwości kontrolki kalendarza
Opcje te wpływają na wygląd i styl kontrolki. Spróbujmy zatem pozmieniać kilka z nich,
obserwując zachodzące w obiekcie zmiany (być może trzeba będzie przesunąć nieco okno
właściwości, aby nie przesłaniało widoku kontrolki).
Następnie wybierzemy kartę Font. Zauważmy, iż umożliwia ona zmianę zarówno kroju,
jak i rozmiaru stosowanej czcionki użytej w obiekcie. Po wybraniu karty Color, stwierdzimy,
iż wpływać możemy na użyte kolory.
Ostatnia z kart Ali, zawiera listę właściwości. Listę taką posiada każda kontrolka Ac-
tiveX. Lista generowana jest na podstawie zamieszczonych właściwości OLĘ, a wymie-
212 Poznaj Visual C++ 6
nione opcje dostępne są w klasach obiektu przy użyciu funkcji Get i Set dla każdego typu
właściwości. W związku z tym na przykład właściwość BackColor posiada dwie kore-
spondujące funkcje GetBackColor () oraz SetBackColor (), których możemy użyć do zmiany
wartości na drodze programowej.
Zamkniemy okno właściwości kalendarza i klikniemy prawym klawiszem myszy obiekt
MCI, a następnie z menu skrótów wybierzemy Properties MMControl Objęci, co otworzy
okno właściwości tego obiektu. Otwierając karty Generał i Ali stwierdzimy, że są one
podobne do tych samych kart właściwości obiektu kalendarza, pozostałe karty mają jednak
zdecydowanie inną zawartość. Gdy otworzymy kartę Control właściwości obiektu MCI,
zobaczymy, iż każdy przycisk użyty w tym obiekcie może być indywidualnie uaktywniany i
ukrywany. Usuwamy znaczniki z pól wyboru EjectVisible i RecordVisible (jak na rysunku
9.6). Zamykamy okna właściwości i naciskamy CtrI+T dla ponownego przetestowania okna
dialogowego aplikacji. Zauważmy, iż z zestawu przycisków zniknęły dwa spośród nich, a cały
panel stał się odpowiednio mniejszy.
Microsoft MCI Ctintrol. versian 5,0 Propertifis
•W
1
? Ga
fiefal | Controt ^ Contiols
j
F PrevEnabled ff
Pre\Msible F
He^Enobled f?
Neyf/tsible r
StepEnabted f7
SlepV'isibIe
r &ackEnabled ^
Bad-Yisible r
PflUseEnabled p'
PauseYisible
PiCt
ure
Ali
r pis
17
Pla
FBe
r RS
r so
[y
sio
rEje
r
Eje
lyEnabled styYisibte
cordEnabled cofdYisible
pEnabled pVisibie c1En
obleci cłV] Eible
K
>•
>1
9
1^
•
-<1
A
11
Rysunek 9.6. Karta Controls właściwości obiektu MCI pozwala na ustalenie widocznego zestawu
przycisków
Stosowanie klas dostarczonych z kontrolkÄ…
Dokonaliśmy zatem pewnych zmian w obrębie kontrolek ActiveX, nie dopisując ani
jednej linii kodu, a mimo to możemy skompilować i uruchomić program oraz przetestować
sposób wyświetlania obiektów oraz ich interakcje z użytkownikiem. Jak w przypadku innych
kontrolek, musimy jednak programowo określić rodzaj danych wysyłanych do kontrolki i z
niej pobieranych. Normalnie robi się to poprzez przypisanie do obiektu zmiennej składowej
klasy obiektu i włączenie jej do klasy okna dialogowego. W wypadku kontrolek ActiveX
czyni się dokładnie tak samo, możemy zatem użyć CIassWizard do dodania niezbędnego
kodu.
Stosowanie kontrolek ActiveX 213
Dodanie zmiennej składowej dla kontrolki
CIassWizard wywołujemy z okna edytora zasobów naciskając Ctri+W lub wybierając pozycję
CIassWizard z menu View. MajÄ…c otwarte okno CIassWizard otwieramy kartÄ™ Member Variable,
gdzie znajdziemy listę identyfikatorów kontrolek, którym możemy przydzielić zmienne.
Stwierdzimy tutaj, iż obiekty IDC_CALENDAR oraz IDC_MMCONTROL mogą posiadać przydzielone
zmienne klasy okna dialogowego CActiveXDlg. Gdy oznaczymy pozycjÄ™ IDC_CALENDAR i klikniemy
przycisk Add Variable, otwarte zostanie zwykłe okno dialogowe Add Member Variable.
Kontrolkom ActiveX przydzielać możemy zmienne wyłącznie ich klasy przesyłającej lub interfejsu.
Dlatego też pole listy Category dopuszcza jedynie wybór Control, a pole Variable Type nie daje
wyboru innego niż klasy CCalendar, oczywiście w przypadku obiektu kalendarza.
Wprowadzamy m_Calendar jako nazwę nowej zmiennej i klikamy OK, aby ją zatwierdzić.
Następnie wybieramy identyfikator IDC_MMCONTROL i ponownie klikamy przycisk Add Variable. Tym
razem ukaże się okno dialogowe, które poinformuje o tym, że kontrolka Microsoft MCI nie została
włączona do projektu i zapyta o zezwolenie na wykonanie tego zadania (rysunek 9.7).
Microsoft Developer Studio
Trie ActiveX Control "Microsoft MCI Control. version 5.0"
has not been inserted into the project. Developer Studio
will do this nów and generale aC++wrapperclassforit.
OK Cancel
Rysunek 9.7. CIassWizard proponuje utworzenie klasy dla nowej kontrolki
Kliknijmy OK, po czym otwarte zostanie okno dialogowe Confirm Ciasses podobne do okna
widocznego podczas pobierania obiektu kalendarza z kolekcji Component Galle-ry, lecz tym razem dla
kontrolki MCI. Możemy tu dokonać zmian nazw klas i plików implementacyjnych. Po kuknięciu OK
będziemy mogli kontynuować proces przydzielania zmiennych klasy Cmci do klasy okna dialogowego,
posługując się oknem dialogowym Add Member Variable. Wprowadzamy nazwę zmiennej składowej:
m_Md.
Mając już przydzielone zmienne do kontrolek możemy wywoływać ich funkcje w celu wysyłania i
pobierania z nich wartości.
Programowe pobieranie i ustalanie właściwości kontrolki
Zainicjalizujemy teraz kontrolki ActiveX dopisując kod z listingu 9. l do treści funkcji
OninitDialogO. Kontrolka kalendarza posiada funkcję TodayO służącą do ustalania bieżącej daty.
Kontrolkę MCI możemy z kolei skonfigurować do odtwarzania pliku .WAV.
214_____________________________________Poznaj Visual C++ 6
Listing 9.1. LST9_1.CPP - inicjalizacja kontrolek Calendar i MCI w funkcji OninitDialog ()
1 // TODO: Tu umieść dodatkowy kod incjalizacyjny
2
3 II ** Ustaw kalendarz na datę bieżącą
4 m_Calendar.Today() ;
5
6 // ** Skonfiguruj obiekt mci waveaudio do odtwarzania
7 // ** pliku Microsoft Sound.wav
8 m_MCI.SetNotify(FALSE);
9 m_MCI.SetWait(TRUE);
10 m_MCI.SetShareable(FALSE);
11 m_MCI.SetDeviceType("waveaudio") ;
12 m_MCI.SetFileName("C:\\Windows\\Media\\TheMic~l.wav"); O
13 m_MCI.SetCommand("Open") ;
14
15 return TRUE;
16 }
O Kontrolka MCI może zostać skojarzona z plikami multimedialnymi, w związku z czym jej przyciski
będą służyły do obsługi odtwarzania: startowania, zatrzymywania i wstrzymywania.
Na powyższym listingu kontrolka ActiveX Calendar przyjmuje bieżącą datę poprzez wywołanie jej
funkcji Today (). Kontrolka MCI jest nieco trudniejsza do konfigu-rowania, albowiem może być
używana przez kilka urządzeń i stąd opcje konfiguracyjne są rozleglejsze. W liniach od 8 do 13
następuje skonfigurowanie tej kontrolki do zadania odtwarzania pliku o nazwie The Microsoft Sound, za
pomocą urządzenia MCI waveaudio. Zauważmy, iż w specyfikacji ścieżki dostępu do pliku występuje
podwójny odwrotny uko-śnik. Dzieje się tak dlatego, gdyż ukośnik ma w języku C++ specjalne
znaczenie w łańcuchach znakowych. Natomiast podwójny odwrorny ukośnik służy do ustanowienia
znaku odwotnego ukośnika w znaczeniu, do którego jesteśmy przyzwyczajeni. Nazwa pliku jest
skrócona do postaci dosowej, czyli TheMic~l.wav. Za pomocą Eksploratora Windows plik ten możemy
odnaleźć w katalogu C:\Windows\Media pod nazwą The Microsoft Sound.
W przypadku kontrolki MCI musimy wykonać jeszcze jedną procedurę. Otóż urządzenie waveaudio,
które zostaje otwarte w linii 13 listingu 9.1, musi zostać zamknięte po wykonaniu zadania, by przekazać
systemowi kontrolę nad nim. Najlepszym momentem na zamknięcie urządzenia jest usunięcie okna
dialogowego. W tym celu posłużyć się należy wirtualną funkcją składową DestroyWindow () według
poniższego schematu.
Stosowanie kontrolek ActiveX 215
Nazwy katalogów w Windows NT
Należy zauważyć, iż nazwa katalogu C:\WINDOWS powinna być zastąpiona przez C:\WINNT w
Windows NT, ponieważ jest to domyślny katalog przechowujący dane systemowe.
Dodanie wirtualnej funkcji składowej do klasy okna dialogowego
1. Kliknij kartÄ™ ClassView w panelu Project Workspace.
2. Kliknij znak + u góry karty, by wyświetlić użyte w projekcie klasy.
3. Prawym klawiszem myszy kliknij pozycję CActiveXDlg, by otworzyć menu skrótów dla tej klasy.
4. Wybierz pozycjÄ™ Add Virtual Function, po czym otwarte zostanie okno dialogowe New Virtual
Override. Na liście New Virtual Function powinna być widoczna funkcja wirtualna
DestroyWindow.
5. Kliknij przycisk Add and Edit, by rozpocząć edycję funkcji.
Funkcja ta wywoływana będzie w momencie usuwania okna dialogowego. Możemy umieścić
jeszcze jedną funkcję odwołującą się do obiektu ActiveX, powodującą zamknięcie urządzenia wraz z
wywołaniem funkcji DestroyWindow ():
BOOL CActiveXDlg::DestroyWindow()
{
// Tutaj umieść specjalny kod i/lub wywołaj
m_MCI.SetComaand("Close") ;
return CDialog::DestroyWindow() ;
}
Urządzenie MCI zostanie prawidłowo zamknięte, możemy zatem skompilować i uruchomić
aplikację. Zauważmy, iż kontrolka Calendar wyświetla datę bieżącą (jeśli data systemowa ustawiona jest
prawidłowo), a przycisk Play (w postaci strzałki 4) jest dostępny do użycia. Gdy klikniemy ten przycisk,
usłyszymy The Microsoft Sound. Podczas jego odtwarzania, dostępny staje się również przycisk Pause
(pauza), pozwalający wstrzymywać odtwarzanie i wznawiać od miejsca zatrzymania. Po odtworzeniu
całego dźwięku, możemy odtworzyć go jeszcze raz, przyciskając najpierw przycisk przewijania 9.
Przeglądając funkcje składowe w ramach klas ActiveX CCalendar oraz Cmci, stwierdzimy
obecność znacznie większej liczby funkcji, niż możemy wywołać w ramach dwóch obecnych kontrolek.
Pamiętajmy również, iż pomoc dotycząca kontrolek dostępna jest w oknie dialogowym Component and
Controls Gallery, po naciśnięciu przycisku Morę Info.
Obecnie użyliśmy jedynie dwóch kontrolek spośród dostępnych w oknie Component Gallery; o
wiele więcej dostępnych jest Internecie na istniejących stronach WWW moż-
216_____________________________________Poznaj Visual C++ 6
na je stamtąd pobierać. Powinniśmy zająć się więc wykorzystaniem tej potęgi, wykorzystując kontrolki
dostępne poprzez COM.
Tworzenie kontrolek ActiveX w klasie odsyłającej
Studiując definicje klas CCalendar oraz Cmci (w modułach Calendar.h oraz mci .h) możemy
zauważyć, że obie wyprowadzone są z klasy cwnd. Pozwala to wykorzystującej je aplikacji traktować
je jako osobne okna (inne kontrolki). Cała sztuczka tkwi w funkcji create (), zdefiniowanej jako
funkcja wirtualna klasy cwnd i wykorzystywanej w klasach odsyłających do wywołania funkcji
CreateControl () klasy CWnd. To z kolei służy tworzeniu kontrolek ActiveX zamiast zwykłych okien.
Implementacja funkcji obsługi zdarzeń ActiveX za pomocą CIassWizard
Kontrolka ActiveX będzie w znacznym stopniu ograniczona w działaniu, jeśli nie jest w stanie
wykorzystać informacji o zmianie jej stanu przez użytkownika. Należy zatem dodać funkcje obsługujące
zdarzenia wywołane przez kontrolki. Czyni się to w taki sam sposób, jak w przypadku innych kontrolek,
czyli za pomocÄ… CIassWizard lub poprzez okno dialogowe New Windows Messages/Event Handlers.
Utwórzmy zatem funkcję obsługi, stwierdzającej fakt kliknięcia przez użytkownika kontrolki
Calendar.
Dodanie funkcji obsługi zdarzenia ActiveX za pomocą CIassWizard
1. Wywołaj CIassWizard naciskając Ctri+W lub wybierając pozycję CIassWizard z menu View.
2. Upewnij się, iż wybraną kartą jest Message Maps.
3. Z pola listy Ciass Name wybierz CActiveXDlg, jeśli jeszcze ta pozycja nie jest wybrana.
4. Z listy identyfikatorów Object IDs wybierz IDC_CALENDAR.
5. Z listy Messages wybierz i dwukrotnie kliknij pozycjÄ™ Click, co otworzy okno dialogowe Add
Member Function.
6. Zaakceptuj domyślną nazwę funkcji OnClickCalendar() poprzez kliknięcie OK.
7. Kliknij przycisk Edit Code, by przejść do edycji treści nowej funkcji.
W oknie edytora umieszczona zostanie treść funkcji obsługi OnClickCalendarO, która będzie
wywoływana za każdym razem, gdy użytkownik kliknie w obrębie kontrolki w celu zmiany daty. Celem
funkcji obsługi będzie wyświetlenie wybranej daty w pasku tytułowym okna dialogowego. Musimy
zatem wpisać odpowiedni kod, przedstawiony na listingu 9.2.
Stosowanie kontrolek ActiveX 217
Listing 9.2. LST9_2.CPP - dodanie funkcji obsługi zdarzenia Click wysyłanego przez kon-trolkę
ActiveX, Calendar
1 void CTestcalDlg::OnClickCalendar()
2 (
3 // TODO: Tutaj umieść treść funkcji obsługi
4
5 // ** Skonwertuj wartość VARIANT kalendarza
6 COleDateTime dtChosenDate(m_Calendar.GetValue()); O
7
8 // ** Sformatuj datę Ole do wyświetlenia
9 II ** w pasku tytułowym okna dialogowego.
10 SetWindowText(dtChosenDate.Format("You Chose %#x")) ;
11 l
O Struktura VARIANT zamieniona zostaje przez konstruktor na COleDateTime.
Na powyższym listingu w linii 6 funkcja składowa GetValue () obiektu m_Calendar zostaje użyta
do pobrania aktualnie wyznaczonej daty w obiekcie Calendar. Gdy klik-niemy dwukrotnie pozycjÄ™
funkcji GetValue () wyświetloną jak składowa klasy CCalen-dar w panelu Project Workspace,
zobaczymy, iż funkcja owa zwraca wartość VARIANT:
VARIANT CCalendar::GetValue() {
VARIANT result;
InvokeHelper(Oxc, DISPATCH_PROPERTYGET, VT_VARIANT, (void*)Sresult, (NULL)
;
return result;
}
VARIANT jest strukturą, w której przechowywane mogą być różne rodzaje danych. Przechowuje ona
dane w składowych, odrębnych dla każdego typu danych. Składowe te z kolei zebrane są w unię (unia w
języku C++ służy do przechowywaniu wszystkich jej składowych pod tym samym adresem, w celu
zaoszczędzenia przestrzeni). Struktura posługuje się także składową VARTYPE vt, która zawiera znacznik
informujÄ…cy o typie danych.
Możemy zobaczyć, iż struktury te oraz klasy MFC C0levariant zawierają nieco z technik
COM/OLE. Pozwalają aplikacjom na wymianę danych, które mogą mieć różne znaczenia w różnych
językach programowania, dostarczając jednocześnie prostych mechanizmów przechowywania i
pobierania danych. Na szczęście, nie musimy operować bezpośrednio na strukturach VARIANT, albowiem
wiele spośród klas MFC rozpoznaje je i potrafi skonwertować do postaci znacznie przyjaźniejszych klas
MFC. Na listingu 9.2 w linii 6 zostaje przeprowadzona taka właśnie konwersja, gdzie wartość VARIANT
zwraca-
218_____________________________________Poznaj Visual C++ 6
na przez funkcję GetValue () przekazana zostaje bezpośrednio do konstruktora obiektu
dtChosenDate, który występuje jako obiekt COleDateTime.
Tworzenie kontrolek ActiveX w klasach odsyłających
MFC dostarcza czterech klas umożliwiających manipulowanie i przechowywanie danych dotyczących
daty i godziny. Oryginalnie istniały tylko dwie klasy, CTime oraz CTimeSpan bazujące na zmiennej
systemu UNIX time_t (4-bajtowa wartość typu long), zliczającej sekundy, które upłynęły od początku
1970 roku. Jednakże dokładność jednej sekundy i ograniczony zakres obsługiwanych dat (1970
2038) stanowi dla wielu aplikacji przeszkodę. Dlatego też powstały dwie nowe klasy, COleDateTime
oraz COleDateTimeSpan, używane w nowszych aplikacjach OLE.
COleDateTime opiera się na strukturze DATĘ (która reprezentuje wartości double). Możliwości
przechowywania pozwalają tej klasie pokrywać zakres dat od l stycznia 100 do 31 grudnia 9999, z
dokładnością do l milisekundy. Odstęp pomiędzy dwoma wartościami reprezentowana jest przez
obiekt COleDateTimeSpan, który może również manipulować danymi.
Jest to obiekt przechowujÄ…cy i operujÄ…cy danymi dotyczÄ…cymi dat i godzin. Posiada przydatnÄ…
funkcję Format (), pozwalającą na utworzenie z posiadanych danych łańcucha znakowego CString, na
podstawie przekazanych jej znaczników formatowania. Znacznik %#x użyty w linii 10 powoduje
utworzenie z danych zapisanych w obiekcie COleDateTime łańcucha znakowego zawierającego
informacje: dzień tygodnia, dzień miesiąca oraz rok (na przykład: Poniedziałek, 21 kwietnia, 1998).
Tak utworzony łańcuch CString może zostać następnie przekazany funkcji SetWin-dowText () w
celu wyświetlenia wybranej przez użytkownika daty na pasku tytułowym okna dialogowego.
Po skompilowaniu i uruchomieniu programu zawierajÄ…cego podane kody kontrolka kalendarza
powinna pozwalać na wybór daty, wyświetlając ją na pasku tytułowym okna dialogowego, jak na
rysunku 9.8.
PATRZ TAKŻE
• O ustanawianiu obsÅ‚ugi komunikatów i zdarzeÅ„ czytaj w rozdziale 4.
• By nauczyć siÄ™ tworzenia wÅ‚asnych kontrolek ActiveX, zajrzyj do rozdziaÅ‚u 26.
• Aby dowiedzieć siÄ™ wiÄ™cej na temat technik COM i OLE, przejdź do rozdziaÅ‚u 25.
Stosowanie kontrolek ActiveX
219
leSfeYouChQseThursday.March19.1998 i& E3|
Ms
r
c
h1
<
i)8 -
OK
998 March .•J |l9
Cancel
Suń
Mon
Tu e
Wed
Thu
Fri
Sat
1
2
3
4
5
6
7
8
9
10
11
12
13
•14
15
16
17
13
2G
20
21
22
23
24
25
27
2B
29
30
31
!-<
M
> I
j
Rysunek 9.8. Obsługa zdarzeń w kontrolce ActiveX pozwala na wyświetlenie wybranej daty
Wyszukiwarka
Podobne podstrony:
09 Stosowanie zasad higieny i ochrony zdrowia09 Globalna kontrola rządów i korporacji nad żywnością i zdrowiem05 Stosowanie kontrolek tekstowych09 Stosowanie podstawowych technik wytwarzaniaid?0809 Kontrowersje doktrynalne na wschodzie 3Stosowanie technik kierowania ciągnikiem rolniczym i wykonywanie czynności kontrolno obsługowych09 10 Monitorowanie stanu BHP przeglady i kontroleKontrola tworzenia i stosowania prawa podatkowego pod rządami Konstytucji RPpref 09amd102 io pl092002 09 Creating Virtual Worlds with Pov Ray and the Right Front Endwięcej podobnych podstron