OSA II LUKU 9 181 9 LUKU Kehittyneiden ActiveX-kontrollien lisääminen projektiisi Kontrollin ominaisuuksien ja tyylien muokkaaminen Kontrollista saadun tiedon hyödyntäminen ohjelmassa
182 ActiveX-kontrollit ja WWW Active Server Pages -toimintojen ansiosta webbisivuille voidaan lisätä ActiveX-kontrolleita ja palvelinpuolen skriptejä ja näin saada aikaan kehittyneitä webbipohjaisia sovelluksia. Valintaikkunat ja kontrollit Kuluneena vuosikymmenenä on ohjelmointimaailmassa keskitytty toipumaan 80-luvulla vaivanneesta pyörän uudelleen keksimisestä. Tuon vaivannäön tuloksena on yleistynyt olio-ohjelmointi (object oriented programming) ja syntynyt COM/OLE-tekniikka (COM = Komponenttiobjektimalli / OLE = Objektien linkitys ja upotus). Nykyään voit ostaa hyvinkin kehittyneitä ActiveX-kontrolleja, jotka voidaan helposti liittää sovellukseesi ja näin ne säästävät tuntien, viikkojen tai jopa kuukausien ohjelmointityön. Tarjolla on runsaasti erilaisia kontrolleja ilmaiseksi tai shareware-oikeuksilla hankittavaksi. Jos pidät kontrollien tekemisestä, voit levittää niitä ilmaiseksi tai myydä niitä muille kehittäjille. Näistä tekniikoista hyötyvät kaikki, koska ohjelmistot ovat nopeammin kehitettävissä, ne on edullisempia ja yhä kehittyneempiä. KATSO MYÖS Jos haluat tehdä itse ActiveX-kontrolleja, perehdy lukuun 26. Lisätietoja COMista ja OLEsta luvussa 25. ActiveX-kontrollien valitseminen ja lisääminen sovellukseen komponenttigalleriasta Komponenttigalleria (Component Gallery) on joukko komponentteja, joita voit lisätä sovelluksesi osiksi saadaksesi siihen lisäominaisuuksia. Visual C++:n mukana saat laajan valikoiman ActiveX-kontrolleja suoraan käytettäväksi ja voit lisätä itse niitä (milloin vain) valikoimaa laajentaaksesi. ActiveX-kontrollit perustuvat COM-tekniikkaan, joten niitä voidaan käyttää Visual C++:sta, Visual Basicista, Visual J++:sta ja monista muista COM-objekteja ymmärtävistä ohjelmointikielistä. Tästä syystä kontrollien dokumentoinnissa käytetään usein Visual Basic-esimerkkejä tästä ei pidä säikähtää, koska täysin samoja metodeja voidaan käyttää myös Visual C++-sovelluksissa. ActiveX-kontrollien selaaminen Voit luoda harjoittelua varten AppWizardilla valintaikkunasovelluksen, johon saat lisättyä ActiveX-kontrolleja. Tee siis uusi ActiveX-niminen projekti (luvussa 4 annettujen ohjeiden mukaan).
Uudesta sovelluksestasi voit hakea luettelon järjestelmääsi rekisteröidyistä ActiveX-kontrolleista seuraavassa esitettyjen vaiheiden avulla. OSA II LUKU 9 183 ActiveX-kontrollien selaaminen komponenttigalleriasta 1. Napauta Project-valikkoa ja valitse siitä Add to Project alivalikko. 2. Valitse Components and Controls komento alivalikosta. 3. Kaksoisnapauta Components and Controls Gallery ikkunassa Registered ActiveX Controls kansiota. 4. Nyt sinulla pitäisi olla esillä luettelo järjestelmääsi rekisteröidyistä ActiveX-kontrolleista, kuten kuvassa 9.1. KUVA 9.1 Komponenttigalleriassa esitettävät rekisteröidyt ActiveX-kontrollit. 1 ActiveX Calendar-kontrollin suoritettava koodi sijaitsee tässä.ocx-tiedostossa (tämä versio tuli Office97:n mukana, ja omasi saattaa olla vanhempaa versiota tai jopa puuttua, riippuen asennetuista ohjelmista). 1 Huomaa, että komponenttigalleriassa kontrollit esitetään tuttuina Windowsin pikavalintoina. Varsinainen kontrollin ohjelmatiedosto löytyy ikkunan alareunassa esitetyssä Path to Control -ruudusta. ActiveX-kontrollit sijaitsevat joko.ocx tai.dll-tiedostossa, joten jakaessasi sovellusta muista myös levittää nämä sovellukseen liittyvät tiedostot sekä rekisteröidä ne kohdekoneessa. Kontrollit rekisteröidään regsrv32.exe-ohjelmalla Windowsin Käynnistä-valikon Suoritakomennolla (Start/Run) tai suoraan komentokehotteesta esimerkiksi
184 Valintaikkunat ja kontrollit näin: Regsrv32 C:\Windows\System\mscal.ocx Tämä rekisteröi ActiveX-kalenterikontrollin ja on välttämätöntä tehdä ainoastaan, kun jakelet tai asennat uusia kontrolleja; juuri komponenttigalleriassa näkemäsi kontrollit on jo rekisteröity järjestelmääsi. Jos valitset jonkun kontrollin, saattaa More Info painike muuttua aktiiviseksi. Tällöin saat painiketta napauttamalla esiin tutun Ohjeikkunan, jossa kerrotaan kontrollista ja sen käytöstä. Ohjesivuilta näet, että ActiveX-kontrolleilla on tavallisten Windowskontrollien tavoin joukko tapahtumia (events), ominaisuuksia (properties) ja metodeja (method). Ominaisuuksia muokkaamalla muutat samalla kontrollin ulkoasua. Metodeilla voit lukea tietoa kontrolleista tai kirjoittaa tietoa niihin. Tapahtumat kutsuvat koodiasi, kun käyttäjä tekee jotain kontrollille (esimerkiksi napauttaa painiketta). Uusien kontrollien lisääminen projektiisi Saat lisättyä valintaikkunasovellukseesi kalenterikontrollin napauttamalla kontrollien valintaluettelossa Calendar Control 8.0 pikakuvaketta. Kun olet valinnut tämän kontrollin, voit lisätä sen sovellukseesi Insert-painikkeella. Developer Studio varmistaa vielä, haluatko lisätä kontrollin ( Insert This Component? ), jonka kuittaat OK-painikkeella. Saat esiin uuden Confirm Classes ikkunan (kuva 9.2). Tässä ikkunassa kerrotaan, mitä tiedostonimiä projektiisi lisätään kontrollin tarvitsemien liittymäluokkien lisäämiseen (interface classes, dispatch classes). Voit muuttaa näiden luokkien ja tiedostojen nimet tarvittaessa tässä ikkunassa. Yleensä oletusnimet kelpaavat, ellet jo ole käyttänyt saman nimisiä tiedostoja tai luokkia projektissasi. Voit myös poistaa lisättävien luokkien valinnan, mutta yleensä esitetyt luokat lisätään mukisematta.
OSA II LUKU 9 185 KUVA 9.2 Confirm Classes ikkunassa voit muuttaa kontrollin tiedostonimen. Jos jätät oletusasetukset ennalleen ja napautat OK-painiketta, uudet luokat ja vastaavat tiedostot lisätään projektiisi. Saat nämä luokat näkyviin valitessasi projektin työtilaikkunasta ClassView-näkymän suljettuasi Components and Controls Gallery ikkunan. Kaksi uutta luokkaa, CCalendar ja COleFont, sisältävät Calendar-kontrollin ja sen käyttämän fontin käyttämiseen tarvittavat funktiorungot. Mitä nämä funktiorungot ovat? Katsopa esimerkiksi CCalendarluokan viereistä plusmerkkiä ja sillä esiin tulevaa GetBackColor()- funktiota napauttamalla, miltä funktion toteutus näyttää: unsigned long CCalendar::GetBackColor() { unsigned long result; InvokeHelper(DISPID_BACKCOLOR, DISPATCH_PROPERTYGET, VT_I4, (void*)&result, NULL); return result; } Kaikki muut funktiot ovat myös tällaisia funktion pätkiä, stubeja, tai hakufunktioita (dispatch funktion). Voit kutsua niitä aivan tavallisten funktioiden tapaan, mutta funktiot toteuttava koodi sijaitsee joka tapauksessa kontrollin.ocx- tai.dll-tiedostossa. Nämä funktion pätkät kutsuvat oikeaa koodia COM-rajapinnan kautta InvokeHelper()-funktiolla. Funktiolle syötetyt parametrit muutetaan ennen lähettämistä tai palauttamista Variant-tyyppisiksi. Tästä on hyötyä kolmessa suhteessa. VBX:t, Visual Basic - kontrollit ja yhteensopivuus Olet ehkä kuullut joskus VBXkontrolleista - kyseessä olivat Visual Basicin kontrollit, OCX:ien edeltäjät. Vaikka nämä toimivat OCX:istä poikkeavasti, niitä voitiin käyttää 16-bittisen Visual C++ -kääntäjän kanssa.vbxkontrollit eivät kuitenkaan ole yhteensopivia32-bittisen Visual C++:n eikä 32-bittisten ohjelmien kanssa;joudut käyttämään nykyaikaisissa 32- bittisissä ohjelmistoissa OCXkontrolleja (ActiveX-kontrolleja).
186 Valintaikkunat ja kontrollit Ensiksikin se pienentää sovelluksen kokoa, koska koodia tarvitaan vain funktion pätkiin. Toiseksi oma koodisi on yhteensopiva kontrollien uudempiinkin versioihin (olettaen, että kontrollin tekijä säilyttää vanhat rajapinnat), joten käyttäjät voivat päivittää kontrolleja päivittämättä sovellusta. Kolmanneksi järjestely suojaa kontrollin tekijää, koska kontrollin lähdekoodi ei ole saatavilla. KATSO MYÖS Lisätietoja COMista ja OLEsta luvussa 25. ActiveX-kontrollien valitseminen, muokkaaminen ja testaaminen Control-palkista Projektiin ei lisätty pelkästään uuden kontrollin rajapintaluokkia, vaan koko kontrolli on myös lisätty resurssieditorin Controls-palkkiin. ActiveX-kontrollin lisääminen valintaikkunaan Voit käyttää uutta kalenterikontrollia omassa valintaikkunassasi. Valitse siis ResourceView-välilehti ja avaa ActiveX-projektin resurssit nähdäksesi resurssityypit. Avaa sitten Dialog-kansio ja kaksoisnapauta IDD_ACTIVEX_DIALOG nimeä ja pääset muokkaamaan projektin pääikkunaa. Kasvata valintaikkuna sopivan kokoiseksi ja poista sen keskeltä // TODO: Place dialog controls here teksti. Nyt Control-palkin viimeisenä kuvakkeena on uusi kuvake kalenterikontrollia varten (kuva 9.3). KUVA 9.3 Uusi ActiveX-kalenterikontrolli on lisätty Controls-palkkiin. 1 Calendar-kontrolli 8.0:n kuvake 1 Voit raahata tämän kontrollin valintaikkunaasi aivan muiden kontrollien tavoin. Kun kontrolli on valintaikkunassa, sen kokoa voidaan muuttaa aivan kuten muidenkin kontrollien. Tasaa kontrolli valintaikkunan vasempaan yläkulmaan. Saatat joutua vielä kasvattamaan valintaikkunankin kokoa, sillä Calendar-kontrolli on melko kookas.
ActiveX-kontrollien lisääminen valintaikkunaeditorista Voit lisätä ActiveX-kontrollin projektiin myös ilman komponenttigallerian käyttöä, suoraan valintaikkunaeditorissa. Napauta valintaikkunan päällä (ei kontrollin päällä) hiiren oikeaa painiketta ja saat esiin pikavalikon. Valitse tästä Insert ActiveX Control ja saat esiin vastaavat ikkunan. Insert ActiveX Control ikkunassa näet luettelon järjestelmään asennetuista ActiveX-kontrolleista, joista voit valita ikkunaan lisättävän kontrollin. Valitse tästä luettelosta Microsoft Multimedia Control, version 6.0. Napauttaessasi OK uusi kontrolli tulee näkyviin. MCI-kontrolli (Media Control Interface, multimediasovitin), joka näyttää valkoiselta suorakulmiolta valintaikkunan suunnittelun aikana, tulee sijoittaa ikkunan vasempaan alakulmaan. Tällä keinoin lisättyyn kontrolliin ei tehdä automaattisesti rajapintaluokkia, mutta ne voidaan lisätä ClassWizardilla liittämällä kontrolliin jäsenmuuttujan. Tämä toimenpide on esitetty myöhemmin tässä luvussa. MCI-kontrolli sisältää joukon painikkeita, jotka voidaan liittää eri multimedialaitteisiin. Tällaisia ovat esimerkiksi waveaudio.waväänitiedostojen esittämiseen, cdaudio CD-levyjen soittamiseen ja digitalvideo videopätkien esittämiseen. OSA II LUKU 9 187 Kontrollien testaaminen valintaikkunaeditorista Voit testata kontrollit aivan kuten valintaikkunan muutkin kontrollit. Napauta siis Layout-valikon Test-komentoa (tai näppäile Ctrl+T). Nyt ActiveX-kontrollit toimivat aivan kuin valmiissa sovelluksessa ja voit kokeilla niitä (kuva 9.4). KATSO MYÖS Lisätietoja valintaikkunan muokkaamisesta luvussa 3. Oppiaksesi lisää MCI:stä ja API-kirjastoista, katso lukua 28.
188 Valintaikkunat ja kontrollit KUVA 9.4 ActiveX-kontrolleja sisältävän valintaikkunan testaaminen Kontrollin ominaisuuksien muuttaminen resurssieditorissa ActiveX-kontrolleissa voidaan tavallisten kontrollien tavoin asettaa useita ominaisuuksia Properties-ikkunan välilehdiltä. Kun kontrolliin on liitetty jäsenmuuttuja, näihin ominaisuuksiin pääsee käsiksi ohjelmasta rajapintaluokan funktioiden kautta. Niitä voi käsitellä myös kontrollin itsensä luomien ominaisuussivujen kautta resurssieditorissa. Pääset näille sivuille valitsemalla kontrollin ja näppäilemällä Alt+Enter tai valitsemalla pikavalikosta Properties. Vakio-ominaisuuksien asettaminen Kontrollin ominaisuuksia muokatessa tarjolla on myös General-sivu. Tavallisten kontrollien tapaan voit asettaa tällä sivulla kontrollin IDtunnuksen yksilölliseksi sekä normaaleja sallinta- ja näkyvyyslippuja. Napauta hiiren oikealla painikkeella ActiveX-kalenterikontrollia ja valitse pikavalikosta Properties Calendar Control: näin saat esiin kalenterikontrollin ominaisuudet. Muuta sitten kontrollin ID-tunnus oletusarvosta IDC_CALENDAR1 tunnukseksi IDC_CALENDAR. Muuta samoin Microsoftin Multimediakontrollin tunnukseksi IDC_MMCONTROL. Kontrollin ominaisuussivujen käyttö Loput ominaisuussivut määrittää kontrolli itse. Valitse uudelleen kalenterikontrolli ja sen Control-välilehti. Nyt esillä on useita kontrolliin itseensä liittyviä ominaisuuksia (kuva 9.5).
OSA II LUKU 9 189 KUVA 9.5 Calendar-kontrollin ominaisuudet Näillä ominaisuuksilla määrätään, miltä kontrolli näyttää ja kuinka se käyttäytyy. Kokeile joidenkin ominaisuuksien muuttamista ja testaa, miten kontrollin toiminta ja ulkonäkö eroavat aiemmasta (voit joutua siirtämään Properties-ikkunaa, ettei se peitä kontrollia). Kalenterikontrollin attribuutit muuttavat kontrollinäyttöä varsin laajalla skaalalla. Valitse seuraavaksi Font-sivu. Huomaa, että tässä voit muuttaa kontrollissa käytettäviä fontteja ja niiden kokoja. Jos valitset Colorsivun, huomaat, että myös kontrollin värejä voidaan räätälöidä. Viimeinen välilehti on All-sivu. Tämä sivu on yhteinen kaikille ActiveX-kontrolleille ja siinä on lueteltu kaikki kontrollin ominaisuudet nykyisine asetuksineen. Tämä luettelo tehdään kontrollin julkaisemien OLE-ominaisuuksien perusteella; nämä ominaisuudet ovat käytettävissä myös kontrollin luokista Get- (lue) ja Set-funktioiden (aseta) kautta. Niinpä esimerkiksi BackColor-ominaisuutta voidaan käsitellä ohjelmasta vastaavilla GetBackColor()- ja SetBackColor()-funktioilla. Sulje Calendar Control 8.0 Properties ikkuna, napauta multimediakontrollia hiiren oikealla painikkeella ja valitse Properties MMControl Object ja saat esiin multimediakontrollin ominaisuudet. Jos tutkit ikkunasta eri välilehtiä, huomaat, että General- ja All-sivut ovat hyvin samankaltaisia kuin kalenterikontrollillakin, mutta muut sivut poikkeavat täysin. Esimerkiksi multimediakontrollin Controlssivulta voit ottaa käyttöön painikkeita yksitellen (Enabled) ja piilottaa ne (Visible = näkyvissä). Poista valinnat EjectVisible ja RecordVisible (kuva 9.6). Sulje ikkuna ja kokeile valintaikkunaasi näppäilemällä Ctrl+T. Huomaat, että kaksi painiketta on kadonnut ja että koko painikerivistö on lyhentynyt.
190 Valintaikkunat ja kontrollit KUVA 9.6 Microsoft Multimedia Control kontrollin Controls-sivulta voit valita esillä olevat painikkeet yksitellen. Kontrolliluokkien käyttö Tähän mennessä emme ole tarvinneet ActiveX-kontrollien kanssa riviäkään koodia ja voit tosiaankin testata sovellusta jo tässä vaiheessa ja kokeilla kontrolleja. Tavallisten kontrollien tavoin joudut kuitenkin lukemaan kontrollin tietoja ja asettamaan niitä ohjelmasta käsin. Yleensä kontrollin ID-tunnus liitetään kontrolliluokan jäsenmuuttujaan osaksi valintaikkunaluokkaa. ActiveX-kontrollit eivät poikkea tästä ja ClassWizardilla saat tarvittavat koodirivit. Kontrollin kutsuluokan jäsenmuuttujan lisääminen ClassWizard käynnistetään resurssieditorista Ctrl+W -näppäilyllä tai valitsemalla View-valikosta ClassWizard. Valitse MFC Class Wizard ikkunassa Member Variables välilehti ja saat esiin käytettävissä olevat kontrollien tunnukset Control IDs luettelona. Näet, että IDC_CALENDAR ja IDC_MMCONTROL -tunnukset valintaikkunasta voidaan liittää CActiveXDlg-valintaikkunaluokkaan. Jos valitset IDC_CALENDARin ja napautat Add Variable painiketta, saat esiin vastaavan ikkunan. Voit liittää ActiveX-kontrollin sitä vastaavaan kutsu- tai rajapintaluokkaan. Tästä syystä Category-yhdistelmäruudussa sallitaan ainoastaan Control-vaihtoehto ja kalenterikontrollille Variable Type voi olla ainoastaan CCalendar. Syötä jäsenmuuttujan nimeksi m_calendar ja napauta OK lisätäksesi
tämän jäsenmuuttujan. Tällä kertaa näet ikkunan, joka kertoo, että projektiisi ei ole lisätty multimediakontrollia ja jossa pyydetään lupaa lisätä se. (kuva 9.7). OSA II LUKU 9 191 KUVA 9.7 ClassWizard pyytää lupaa lisätä ActiveX C++ pakettiluokka. Napauta OK ja saat esiin saman varmistusikkunan (Confirm Classes), jonka näit valittuasi komponenttigalleriasta Calendar-kontrollin, tällä kertaa ikkunassa esitetään kuitenkin multimediakontrollin luokkia. Voit jälleen muuttaa halutessasi luokkien ja tiedostojen nimiä. Kun olet valmis, napauta OK ja voit jatkaa Adding Member Variable ikkunaan, jossa voit liittää Cmci-tyyppisen jäsenmuuttujan valintaikkunaluokkaan. Syötä Member Variable Name ruutuun m_mci ja lisää uusi jäsenmuuttuja napauttamalla OK. Liitettyäsi nyt kontrolleille jäsenmuuttujat valintaikkunaluokkaan, voit kutsua kontrolleja koodistasi lukeaksesi ja kirjoittaaksesi niiden arvoja. Kontrollin ominaisuuksien lukeminen ja asettaminen Nyt voit lisätä hieman koodia alustamaan kontrollit valintaikkunan OnInitDialog()-funktioon listauksen 9.1 mukaisesti. Kalenterikontrollilla on Today()-funktio, joka asettaa sen hetkisen päiväyksen. Multimediakontrolli voidaan asettaa esittämään.wav-tiedosto ääninäytteenä. LISTAUS 9.1 LST9_1.CPP ActiveX kalenteri- ja multimediakontrollien alustaminen OnInitDialog()-funktiossa. 1 // TODO: Add extra initialization here 2 3 // ** Set the calendar to today 4 m_calendar.today(); 5 6 // ** Set up the mci waveaudio device to play 7 // ** The Microsoft Sound.wav file 8 m_mci.setnotify(false); 9 m_mci.setwait(true); 10 m_mci.setshareable(false);
192 1 MCI-kontrolliin voidaan liittää medialeiketiedosto, jolloin painikkeet ohjaavat leikkeen esittämistä ja pysäyttämistä. Valintaikkunat ja kontrollit 11 m_mci.setdevicetype("waveaudio"); 12 m_mci.setfilename("c:\\windows\\media\\themic~1.wav"); 1 13 m_mci.setcommand("open"); 14 15 return TRUE; // return TRUE unless you set the focus 16 } Listauksessa 9.1 ActiveX kalenterikontrolli asetetaan tähän päivään kutsumalla kontrollin Today()-pätkäfunktiota. Multimediakontrollin asettaminen on hieman mutkikkaampaa, koska sitä voidaan käyttää ohjaamaa useita erilaisia laitteita ja se on näin ollen asetettavissa monella tavoin. Riveillä 8-13 asetetaan Multimediakontrolli esittämään.wav-tiedosto nimeltä Microsoft Sound MCI-laitteella waveaudio. Huomaa, että rivillä 12 annetussa tiedostonimessä käytetään kahta kenoviivaa (\\) yhden sijaan hakemistopoluissa. Tämä johtuu kenoviivan erikoismerkityksestä erikoismerkkien esittämisessä C++:ssa ja vasta kaksi peräkkäistä kenoviivaa merkitsee yhtä oikeaa. Tässä tiedostonimi on esitetty DOS-yhteensopivassa muodossa TheMic~1.wav. Löydät tiedoston helposti Resurssienhallinnalla hakemistosta C:\Windows\Media nimellä The Microsoft Sound. Hakemistojen nimet Windows NT:ssä Huomaa, että Windows NT:ssä hakemistopolun osa C:\Windows tulee korvata hakemistolla C:\WINNT, koska Windowstiedostot sijaitsevat siinä oletuksena. Ellet löydä tiedostoa Resurssienhallinnalla, mikä tahansa -Wav-tiedosto käy, kunhan tiedostonimi ja hakemisto ovat oikein. Joudut lisäämään vielä yhden toiminnon. Listauksen 9.1 rivillä 13 avattu waveaudio-multimedialaite tulee myös sulkea järjestelmäresurssien oikean ylläpidon mukaisesti. Paras hetki tähän on, kun valintaikkuna tuhotaan. Voit lisätä virtuaalisen jäsenfunktion DestroyWindow() seuraavasti: Virtuaalifunktion lisääminen valintaikkunaluokkaan 1. Napauta projektin työtilaikkunassa ClassView-välilehteä. 2. Napauta ylintä plusmerkkiä ja näet projektin luokat. 3. Napauta hiiren oikeaa painiketta CActiveXDlg-luokan päällä ja saat esiin pikavalikon. 4. Valitse Add Virtual Function komento ja saat esiin New Virtual Override ikkunan. New Virtual Functions luettelossa tulisi näkyä DestroyWindow-virtuaalifunktio. 5. Napauta Add and Edit painiketta ja pääset muokkaamaan uutta käsittelijää. Tätä funktiota tullaan kutsumaan, kun valintaikkuna tuhotaan; voit siis lisätä funktioon toisen ActiveX-multimediakontrolli m_mci:n SetCommand()-funktiokutsun sulkeaksesi waveaudio-laitteen näin:
OSA II LUKU 9 193 BOOL CActiveXDlg::DestroyWindow() { // TODO: Add your specialized code here and/or call the m_mci.setcommand( Close ); return CDialog::DestroyWindow(); } Multimedialaite suljetaan kunnolla, joten nyt voit kääntää ja suorittaa sovelluksesi. Huomaa, että kalenterikontrolli on nyt asetettu nykypäivään (kunhan koneesi kello on ajassaan) ja että Play-painike (>) on käytettävissä. Kun napautat Play-painiketta, ohjelma esittää Microsoft Sound ääninäytteen. Esittämisen aikana Pause-painike muuttuu käytettäväksi ja voit keskeyttää sillä äänen esittämisen. Esittämisen loputtua voit käynnistää toiminnon uudelleen vasta takaisinkelauksen (Rewind, <) jälkeen. ActiveX-luokkien CCalendar ja Cmci jälkeen esitetyistä löydät monta muutakin kontrollin käyttämiseen tarkoitettua funktiota. Muista myös, että saat lisätietoa kontrolleista Component and Controls Gallery ikkunassa napauttamalla More Info painiketta. Tässä oli ainoastaan kaksi niistä monista komponenttigalleriassa tarjolla olevista kontrolleista; lisää kontrolleja löydät Internetistä ja monia käytetään myös webbisivuillakin. Tämän yksinkertaisen koodin takaa löytyvä vahvuus alkanee vähitellen seljetä: se on COMin tarjoama uudelleenkäytettävyys. ActiveX-tapahtumankäsittelijöiden toteuttaminen ClassWizardilla Luonnollisesti olisi varsin rajoittunutta, ellet voisi käyttää käyttäjän aikaansaamia sanomia kontrolleista. Onneksi kontrollit voivat käynnistää tapahtumia myös sovelluksessasi. Voit lisätä käsittelijät näille tapahtumille tuttuun tapaan lisäämällä tapahtumankäsittelijän ClassWizardilla tai New Window Messages/ Events ikkunassa. Voit esimerkiksi lisätä käsittelijän havaitsemaan, milloin käyttäjä on napauttanut kalenterikontrollia. ActiveX-kontrollien luominen dispatch-luokassa Jos tutkit tarkempaan CCalendar ja Cmci-luokkien määrittelyjä (tiedostoissa calendar.h ja mci.h), huomaat, että molemmat on johdettu CWnd-luokasta. Tämä tarkoittaa, että säilösovellus voi käsitellä niitä aivan ikkunoiden tapaan (kuten muitakin kontrolleja). Create()- funktio, joka on CWnd-luokassa määritelty virtuaalifunktio, korvataan dispatch-luokissa kutsulla CWnd:n CreateControl()- funktioon, joka luo tavallisen ikkunan sijaan OLE-kontrollin (ActiveX-kontrollin).
194 Valintaikkunat ja kontrollit ActiveX-tapahtumankäsittelijä lisääminen ClassWizardilla 1. Käynnistä ClassWizard näppäilemällä Ctrl+W tai valitsemalla View-valikosta ClassWizard. 2. Varmista, että Message Maps välilehti on valittu. 3. Valitse Class Name yhdistelmäruudusta CActiveXDlg, ellei se ole jo valittu. 4. Valitse Object IDs luettelosta IDC_CALENDAR. 5. Kaksoisnapauta Messages-luettelossa Click-sanomaa ja saat esiin Add Member Function ikkunan. 6. Hyväksy oletusnimi OnClickCalendar napauttamalla OK. 7. Napauta Edit Code painiketta ja voit aloittaa uuden käsittelijäfunktion muokkaamisen. Nyt näkyvissä pitäisi olla editorin ikkunassa uusi OnClickCalendar()-funktio; tätä kutsutaan aina, kun kalenterikontrollia napautetaan ja päiväys muuttuu. Voisit esittää uuden päiväyksen valintaikkunasi otsikkopalkissa päiväyksen muuttuessa lisäämällä listauksessa 9.2 esitetyn koodin uuteen käsittelijäfunktioon. LISTAUS 9.2 LST9_2.CPP Käsittelijän lisääminen ActiveXkalenterikontrollin lähettämälle Click-tapahtumalle 1 VARIANT-tietorakenne muutetaan COleDateTimeksi muodostimella. 1 void CTestcalDlg::OnClickCalendar() 2 { 3 // TODO: Add your control notification handler code here 4 5 // ** Convert the VARIANT calendar value 6 COleDateTime dtchosendate(m_calendar.getvalue()); 1 7 8 // ** Format Ole date to a sensible default and display 9 // ** it in the dialog title bar. 10 SetWindowText(dtChosenDate.Format("You Chose %#x")); B} Listauksessa 19.2 käytetään rivillä 6 m_calendar-olion GetValue()- jäsenfunktiota hakemaan Calendar-kontrollista valittu päiväys. Jos napautat ClassView-sivulla CCalendar-luokan alta löytyvää GetValue()-jäsenfunktiota, näet, että se palauttaa VARIANT-tyyppisen paluuarvon:
OSA II LUKU 9 195 VARIANT CCalendar::GetValue() { VARIANT result; InvokeHelper(0xc, DISPATCH_PROPERTYGET, VT_VARIANT, (void*)&result, NULL); Return result; } VARIANTon struktuuri, jossa voi olla useita tietotyyppejä. Tämä on toteutettu siten, että struktuurissa on jokaisen tietotyypin tyyppinen muuttuja ja nämä on yhdistetty unioniksi (C++:n unioni tarkoittaa, että unionin jäsenet sijaitsevat samassa osoitteessa). Struktuurissa on myös VARTYPE-tyyppinen jäsen vt, joka esittää, minkä tyyppistä tietoa VARIANT-rakenteessa on. Tulet näkemään VARIANT-muuttujia ja sen paketoivaa MFC-luokkaa COleVariant useinkin COM/OLE-maailmassa. Tämä on keino saada eri sovellukset siirtämään tietoa, joka muuten saattaisi tarkoittaa eri ohjelmointikielillä eri asiaa ja näin mahdollistetaan tiedon tallettaminen ja lukeminen. Onneksi joudut käyttämään VARIANT-tyyppejä varsin harvoin, koska MFC-luokat tunnistavat VARIANT-tyyppiset muuttujat ja muuttavat ne tutummiksi MFC-luokiksi. Listauksessa 19.2 tämä muunnos tehdään rivillä 6, jossa GetValue()-funktion palauttama VARIANTsyötetään suoraan dtchosentime-olion muodostimelle käytettäväksi COleDateTime-oliona. VARIANTon olio, joka tallettaa ja muokkaa päiväyksiä ja kellonaikoja. Sillä on käyttökelpoinen Format()-funktio, jolla voidaan muotoilla olion tallettama aika CString-tekstiksi syöttämällä funktiolle sopivia lippuja. Rivillä 10 Format()-funktiolle syötetty %#x-lippu muuttaa VARIANT-olion tallettaman päiväyksen pitkään muotoon: viikonpäivä, kuukausi, päivä kuukaudesta, vuosi (esimerkiksi Wednesday, April 28, 1999). Tämä CString-tyyppinen muotoiltu päiväys voidaan välittää suoraan SetWindowText()-funktiolle, joka asettaa käyttäjän valitseman päiväyksen ikkunan otsikkopalkin tekstiksi. Kun käännät ja suoritat ohjelmasi lisättyäsi nämä rivit käsittelijäfunktioon, näet kalenterikontrollia napauttamalla valitun päiväyksen sovellusikkunasi otsikkopalkissa, kuten kuvassa 9.8. KATSO MYÖS Yksityiskohtia sanomien ja tapahtumien käsittelystä luvun 4 alussa. Tietoa omien ActiveX-kontrollien luomisesta luvussa 26. Lisätietoja COMista ja OLEsta luvusta 25. Aika/Päiväys-luokat MFC-kirjastossa on neljä luokkaa kaikenlaista ajan ja päiväyksen käsittelemistä ja tallentamista varten. Alkuaan luokkia oli vain kaksi, CTime ja CTimeSpan, jotka perustuivat UNIXin time_t-järjestelmään (4- tavuinen long-arvo), joka ilmaisi vuoden 1970 alusta kuluneiden sekuntien määrän. Yhden sekunnin tarkkuus ja rajallinen päiväyksenkäsittely rajoitivat sen soveltuvuuttaa joihinkin sovelluksiin. Tästä syystä uudemmissa OLE-sovelluksissa käytetään luokkia COleDateTime ja COleDateTimeSpan. COleDateTime perustuu piilotettuun DATE-tietorakenteeseen (joka on oikeastaan vain double-arvo). Tämän tietotyypin tallennuskapasiteetti mahdollistaa päiväykset vuodesta 100 vuoteen 9999 ja noin millisekunnin tarkkuuteen. Kahden COleDateTime-olion ilmaiseman ajan ero esitetään ja sitä muokataan COleDateTimeSpan-olion kautta.
196 Valintaikkunat ja kontrollit KUVA 9.8 ActiveX-kontrollin lähettämää tapahtumaa käytetään päivittämään ikkunaa.