Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit

Samankaltaiset tiedostot
ActiveX-kontrollien käyttö

OpenOffice.org Impress 3.1.0

TIETOKONEEN ASETUKSILLA PARANNAT KÄYTETTÄVYYTTÄ

Visual C++ -ohjelman tekeminen ja suunnittelu

Hiirisanomiin vastaaminen

Valintaikkunoiden luonti ja suunnittelu

Jypelin käyttöohjeet» Miten saan peliin pistelaskurin?

Office 365:n kalenterin käyttäminen

Kehitysympäristö LUKU. Developer Studio kehitysympäristön alkeet. Liikkuminen projektin työtilassa ja sen eri näkymissä

Näkymien vierittäminen ja koon muuttaminen

TAULUKON TEKEMINEN. Sisällysluettelo

GeoGebra-harjoituksia malu-opettajille

Tulorekisteri: Vakuuttamisen poikkeustilanteet Visma Fivaldi

Taulukot Päivi Vartiainen 1

Muuttujien määrittely

KUVAN TUOMINEN, MUOKKAAMINEN, KOON MUUTTAMINEN JA TALLENTAMINEN PAINTISSA

Tekstikontrollit LUKU. Tekstin ja sanomien esittäminen valintaikkunoissa. Tekstin muokkaaminen suorituksen aikana. Tiedon tarkistaminen syötön aikana

Usean näkymän luominen

Oppilaan pikaopas. Project 2013 käyttöliittymä ja näkymät

Avaa ohjelma ja tarvittaessa Tiedosto -> Uusi kilpailutiedosto

1 Funktiot, suurin (max), pienin (min) ja keskiarvo

Sen jälkeen Microsoft Office ja sen alta löytyy ohjelmat. Ensin käynnistä-valikosta kaikki ohjelmat

Luettelo-, puu-, parannetun tekstiruutu- sekä HTML-näkymän käyttö

Ohje. ipadia käytetään sormella napauttamalla, kaksoisnapsauttamalla, pyyhkäisemällä ja nipistämällä kosketusnäytön

Sähköposti ja uutisryhmät

Jypelin käyttöohjeet» Ruutukentän luominen

Projektit. Pikaopas. Jaa projekti muiden kanssa Kutsu muita projektiyhteistyöhön valitsemalla Jaa.

OpeOodi Opiskelijalistojen tulostaminen, opiskelijoiden hallinta ja sähköpostin lähettäminen

FrontPage Näkymät

VATT Talouden rakenteet. Ohje: Pdf-dian liittäminen PowerPoint -esitykseen. Sisällys:

Osoitin ja viittaus C++:ssa

Lupa opetuskäyttöön pyydettävä. Näppäimistö. Kohdistimen ohjausnäppäimistö. Funktionäppäimistö. Kirjoitusnäppäimistö

AUTOCAD-TULOSTUSOHJE. Tällä ohjeella selitetään Autocadin mittakaavatulostuksen perusasiat (mallin mittayksikkönä millimetrit)

Toiminnallinen määrittely versio 1.2

TAULUKKO, KAAVIO, SMARTART-KUVIOT

CABAS. Release Notes 5.4. Uusi kuvien ja dokumenttien käsittely

OHJE EXCEL-MAKRON LUOMISEKSI JA MAKRON KÄYTÖSTÄ

ASIO-OHJE HENKILÖSTÖLLE.

Ohjelmoinnin perusteet Y Python

Visma Fivaldi -käsikirja MiniCRM

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Kun olet valmis tekemään tilauksen, rekisteröidy sovellukseen seuraavasti:

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Ohjelmoinnin perusteet Y Python

Facebook-sivun luominen

OpeOodi Opiskelijalistojen tulostaminen, opiskelijoiden hallinta ja sähköpostin lähettäminen

Microsoft Outlook Web Access. Pikaohje sähköpostin peruskäyttöön

Tilastokeskuksen rajapintapalveluiden käyttöönotto ArcGISohjelmistossa

1 Word- asiakirjan avaaminen Power Pointissa

TYYLIT. Word Tyylit

Ajokorttimoduuli Moduuli 2. - Laitteenkäyttö ja tiedonhallinta. Harjoitus 1

Ohje internetkarttapalveluun

Tietosuoja-portaali. päivittäjän ohje

Opiskelijalistojen tulostaminen, opiskelijoiden hallinta ja sähköpostin lähettäminen

T e k s t i n k ä s i t t e l y ä s e l k o k i e l e l l ä WORD

Outlook Web App ver 1.2

GEOS 1. Ilmastodiagrammi Libre Office Calc ohjelmalla

OKLV120 Demo 7. Marika Peltonen

Hops-ohjaajan ohje Opiskelijan hopsit.

Tukipyyntö-toiminnon ohje

Sonera Viestintäpalvelu VIP VIP Laajennettu raportointi Ohje

Skype for Business ohjelman asennus- ja käyttöohje Sisällys

TALLENNETAAN MUISTITIKULLE JA MUISTIKORTILLE

Condes. Quick Start opas. Suunnistuksen ratamestariohjelmisto. Versio 7. Quick Start - opas Condes 7. olfellows 1.

TIMMI-TILAVARAUSOHJELMISTO

Yrjö Määttänen Kokemuksia SuLVInetin käytön aloituksen

Pong-peli, vaihe Aliohjelmakutsu laskureita varten. 2. Laskurin luominen. Muilla kielillä: English Suomi

OptimePortal ja OptimeEvent versioiden yhteenveto joulukuu

Informaatiotekniikan kehitysyksikkö

HAMINETTI WLAN LIITTYMÄN KÄYTTÖÖNOTTO-OHJE

ITKP102 Ohjelmointi 1 (6 op)

Ohjelmoinnin perusteet Y Python

Pong-peli, vaihe Koordinaatistosta. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 2/7. Tämän vaiheen aikana

HRTM58. Windows 10 Resurssienhallinta

KAAVAT. Sisällysluettelo

Word 2010 Pikaopas Hannu Matikainen Päivitetty:

Sisältö. 2. Taulukot. Yleistä. Yleistä

Pong-peli, vaihe Aliohjelman tekeminen. Muilla kielillä: English Suomi. Tämä on Pong-pelin tutoriaalin osa 3/7. Tämän vaiheen aikana

E s i t y s g r a f i i k k a a s e l k o k i e l e l l ä MICROSOFT. PowerPoint. P e t r i V a i n i o P e t r i I l m o n e n TIKAS-SARJA

1 ClipArt -kuvan käyttö Paint-ohjelmassa

Ohjelmoinnin jatkokurssi, kurssikoe

Word 2003:n käyttötoimintojen muutokset Word 2010:ssä

Google-dokumentit. Opetusteknologiakeskus Mediamylly

Tekstinkäsittelyn jatko Error! Use the Home tab to apply Otsikko 1 to the text that you want to appear here. KSAO Liiketalous 1

SSH Secure Shell & SSH File Transfer

Skype for Business ohjelman asennus- ja käyttöohje Sisällys

Tällä harjoituskerralla on tarkoituksena harjoitella käyttötapaus-, luokka- ja tapahtumasekvenssikaavioiden luontia.

UpdateIT 2010: Editorin käyttöohje

TAULUKOINTI. Word Taulukot

Siirtyminen Outlook versioon

Sisältö. 22. Taulukot. Yleistä. Yleistä

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

MS Visio 2016 liiketoimintaprosessien piirtämisessä

2020 Fusion. What s New in Version 6? What s New in Version 6? 1 of Fusion

Taulukot, taulukkoryhmät Sisällysluettelo

OHJE ATERIAPÄIVÄKIRJAN MUOKKAUKSEEN

1. ASIAKKAAN OHJEET Varauksen tekeminen Käyttäjätunnuksen luominen Varauksen peruminen... 4

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Ohjelmoinnin perusteet Y Python

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

Transkriptio:

Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit OSA II LUKU 7 131 7 LUKU Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit Edistymispalkin käyttö näyttämään pitkien tehtävien etenemistä Liuku- ja vierityspalkkien käyttö rajatuissa valinnoissa ja paikantamisessa Uuden päiväys/aika kontrollin ja kuukausikalenterin käyttö määritettäessä päivämääriä, kellonaikoja sekä kestoa kalenterista

132 Valintaikkunat ja kontrollit Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit Lukualuekontrollit Usein käyttäjän halutaan syöttävän ohjelmalle luku tietyltä väliltä ja toisinaan ohjelman halutaan esittävän käyttäjälle tietoa käytettävästä lukualueesta. Liian usein tehtävien suoritus kestää kauan ja käyttäjälle halutaan tällöin kertoa suorituksen edistymisestä. Käytettävä lukualue saattaa olla tavallisten numeroiden lisäksi päiväys, aika tai ehkäpä joku mittayksikkö. Visual C++ 6 tarjoaa resurssieditorissaan käyttöön näitä tarpeita varten lukuisia kontrolleja MFC-luokkiin paketoituina. Tässä luvussa käsitellään lukualueiden esittämiseen käytettyjä kontrolleja sekä niiden liittämistä sovelluksiisi. Edistymispalkki Edistymispalkin (Progress) käyttötarkoitus on pitää käyttäjä selvillä pitkän tehtävän suorittamisen edistymisestä. Edistymispalkki esitetään ikkunaan piirrettävänä sinisenä viivana tai katkoviivana ja viivalle varattu suorakulmio täyttyy tehtävän edistyessä, kuten kuvassa 7.1 on esitetty. Edistymispalkki on käyttökelpoinen edistymisen seuraamisen isäksi myös lukualue-esitykseen. Esimerkiksi kuvan 7.2 ikkunassa edistymispalkeilla on rakennettu äänentoistojärjestelmistä tuttu äänensävynäyttö, ekvalisaattori. KUVA 7.1 Tyypillinen edistymispalkin käyttö tehtävän suorituksen seurannassa. KUVA 7.2 Edistymispalkilla esitetty lukualue muistuttaa tässä äänensävynäyttöä.

Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit OSA II LUKU 7 133 Edistymispalkin lisääminen valintaikkunaan Voit lisätä edistymispalkin valintaikkunaasi resurssieditorissa valitsemalla työkalupalkista Progress ja napauttamalla hiirellä valintaikkunassa haluamallasi paikalla. Tämän jälkeen voit muuttaa edistymispalkin koon mieleiseksesi. Kuvassa 7.3 on esitetty edistymispalkin kuvake hiiriosoittimen näyttämässä paikassa (missä työkaluohjekin näkyy). Kontrollien kopioiminen ja liittäminen Voit kopioida valmiin kontrollin valintaikkunastasi (tai toisesta valintaikkunasta) aivan tavallisilla kopiointikomennoilla (Ctrl+C kopioi, Ctrl+V liittää). Uusi kontrolli on kopioidun kokoinen ja sille on määritetty samat ominaisuudet. KUVA 7.3 Edistymispalkin lisääminen valintaikkunaan resurssieditorilla. Kuvassa 7.3 esitetään myös Progress Properties ikkunan Stylesvälilehti. Saat avattua kyseisen ikkunan valitsemalla kontrollin ja näppäilemällä Alt+Enter tai valitsemalla pikavalikosta Properties. Progress Properties ikkunassa voit muuttaa kontrollin ID-tunnuksen General-välilehdellä. Normaalisti muutat ID-tunnuksen käyttötarkoitukseen sopivammaksi sekä tarvittaessa muitakin välilehden valintoja. Styles-sivulla voit muuttaa kontrollin ulkonäköä seuraavia valintoja napauttamalla: Border. Jos tämä on valittuna, kontrollin reuna näytetään. Vertical. Tämän valitseminen muuttaa palkin pystysuuntaiseksi

134 Oletustyylilt Ellet muuta edistymispalkin oletustyylejä, jää Border-tyyli valituksi ja Vertical sekä Smooth asetukset jäävät valitsematta. Valintaikkunat ja kontrollit Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit normaalin vaakasuunnan sijaan. Smooth. Edistyminen esitetään katkoviivan sijaan jatkuvalla viivalla, jos tämä valitaan. Kuvan 7.1 esimerkki esittää, kuinka yksinkertainen AppWizardin tekemä valintaikkunasovellus voidaan räätälöidä näyttämään edistymispalkki, jonka arvo kasvaa, kun viereistä Step It? -painiketta napautetaan. Jos haluat seurata tätä esimerkkiä, luo ensin AppWizardilla valintaikkunasovellus (dialog-based) ja lisää siihen kuvan 7.3 mukaisesti edistymispalkki (Progress) sekä painike. Esimerkin edistymispalkin ID-tunnus on IDC_MY_PROGRESS ja painikkeen IDC_STEPIT. Seuraavassa kappaleessa kerrotaan, kuinka edistymispalkkiin liitetään MFC-luokka ja kuinka kontrollin palkkia päivitetään. Lisätietoja valintaikkunan kontrollien ominaisuuksien muokkaamisesta luvun 3 alusta. Muuttujan liittäminen edistymispalkkiin Voit liittää ClassWizardilla jäsenmuuttujan edistymispalkkiin. Edistymispalkkikontrollit liittyvät MFC:n CProgressCtrl-luokkaan. Jäsenmuuttujan liittäminen edistymispalkkiin 1. Valitse resurssieditorissa edistymispalkki, johon muuttuja tullaan liittämään. 2. Käynnistä ClassWizard näppäilemällä Ctrl+W tai valitsemalla View-valikosta ClassWizard. Valitse Member Variablesvälilehti ja varmista, että Class Name yhdistelmäruudussa on valittuna kontrollia vastaava oikea luokka (kuten CProgressDlg). 3. Voit kaksoisnapauttaa käsiteltävän edistymispalkin ID-tunnusta tai napauta Add Variable painiketta saadaksesi esiin vastaavan ikkunan. 4. Voit syöttää uuden muuttujan nimen Member Variable Name ruutuun (esimerkiksi tässä m_myprogress). 5. Huomaa, että Category-yhdistelmäruudussa on valittuna Control ja Variable Type on CProgressCtrl. Edistymispalkin

Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit OSA II LUKU 7 135 kohdalla et muuta voi näihin ruutuihin valitakaan. 6. Sulje Add Member Variable ikkuna ja varmenna muuttujan liittäminen kontrolliin napauttamalla OK. Uuden jäsenmuuttujan nimen tulisi olla nyt esillä Control ID s luettelossa vastaavan kontrollin ID-tunnuksen oikealla puolen. 7. Sulje ClassWizard napauttamalla OK. Liitettyäsi muuttujan kontrolliin voit muuttaa kontrollin näyttöä jäsenmuuttujaa muokkaamalla seuraavan kappaleen ohjeiden mukaisesti. Edistymispalkki Windowsin yleisenä kontrollina Koska edistymispalkki kuuluu Windowsin uusiin kontrolleihin, se on käytettävissä ainoastaan Windows 95/NT 3.51 käyttöjärjestelmissä tai uudemmissa. Yksityiskohtaisempi kuvaus jäsenmuuttujien liittämisestä luvussa 10. Edistymispalkin muokkaaminen ja päivittäminen Voit muokata edistymispalkkeja kutsumalla niihin liittyvän CProgressCtrl-tyyppisen jäsenmuuttujan metodeja. Edistymispalkilla on lukualue, jonka rajoiksi määritellään tyhjää (0 %) ja täyttä (100 %) edistymispalkkia vastaavat kokonaislukuarvot. Lisäksi kontrollilla on nykyistä palkin asemaa vastaava arvo. Lopuksi voit asettaa vielä käytetyn lisäysarvon, joka lisätään palkin paikkaan joka kerta, kun kontrollin StepIt()-jäsenfunktiota kutsutaan. Edistymispalkin lukualueen määrittäminen Aluksi joudut asettamaan edistymispalkille käytettävän lukualueen (range). Tämä onnistuu kutsumalla kontrollin SetRange()-jäsenfunktiota ja syöttämällä parametreiksi kokonaislukuina lukualueen alaja yläraja. Normaalisti nämä arvot ovat täysin sovelluksestasi riippuvia. Jos esimerkiksi olet laskemassa alkulukuja arvojen 3000 ja 7000 väliltä, voivat lukualueen rajat olla juuri nuo luvut. Useimmiten lukualue asetetaan kontrollia alustettaessa (vaikka se onnistuu milloin vain). Tällöin luonnollinen paikka suorittaa alustaminen on valintaikkunan OnInitDialog()-funktion lopussa. Esimerkkiohjelmassa voit asettaa edistymispalkin lukualueeksi 0-10. Jos palkin paikka on 0, tulee kontrollin olla tyhjä ja arvolla 10 palkin tulee olla kokonaan näkyvissä. Napauttamalla projektin työtilaruudussa ClassView-välilehteä ja vielä projektin nimen viereistä plusmerkkiä, saat esiin kaikki projektin luokat ja niiden jäsenet. Jos 32-bittisten lukualueiden käyttäminen edistymispalkeissa SetRange()-funktio on rajoitettu 16-bittisiin arvoihin. Tällöin pienin käytettävä luku on -32768 ja suurin 32767. Jos suurempia lukurajoja tarvitaan, tulee käyttää 32-bittiset arvot hyväksyvää SetRange32()-funktiota. Tällöin lukualue on enimmillään -2 147 483 648... 2 147 483647.

136 Valintaikkunat ja kontrollit Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit valintaikkunasovelluksesi nimi olisi Progress, käsittelisi vastaava CProgressDlg-luokka sovelluksen pääikkunaa. Tästä luokasta löytyy myös OnInitDialog()-jäsenfunktio, jonka saat muokattavaksi kaksoisnapauttamalla sen nimeä ClassView-ruudussa. Alusta siis edistymispalkin lukualue lisäämällä seuraava rivi OnInitDialog()- funktioon juuri ennen return-lausetta: m_myprogress.setrange(0,10); Edistymispalkin lukualueeksi on nyt asetettu 0 10. Asetusfunktiolle on olemassa myös vastinpari GetRange(), joka lukee kahteen syötettyyn muuttujaan edistymispalkin sen hetkisen lukualueen ala- ja ylärajan. Lisätietoja valintaikkunan alustamisesta luvusta 6. Fire-esimerkkisovellus Fire-esimerkki havainnollistaa hyvin edistymispalkin ja liukusäätimen käyttöä. Tämä esimerkki löytyy MSDN CDlevyltä tai Microsoftin sivustosta msdn.microsoft.com hakusanalla FIRE. Edistymispalkin aseman asettaminen Asetettuasi edistymispalkin lukualueen voit päivittää esitettävää palkin asemaa kutsumalla SetPos()-jäsenfunktiota. Tämä päivittää palkin aseman SetPos()-funktiolle syötettyyn kokonaislukuarvoon ja piirtää kontrollin uuden arvon mukaiseksi. Jos annettu arvo on ylärajaa suurempi, palkki esitetään täydessä mitassaan ja vastaavasti alarajaa pienempi arvo saa aikaan tyhjän palkin. Esimerkkiohjelmassa voit lisätä koodirivin asettamaan palkin alkuarvon nollaksi välittömästi lukualueen alustamisen jälkeen näin: m_myprogress.setpos(0); Tämä alustus ei ole aivan välttämätön, koska kontrollin asema alustetaan oletuksena lukualueen alarajaan. Voisit sitten esittää kontrollin puoliksi täytettynä seuraavasti: m_myprogress.setpos(5); Ellet halua syöttää kontrollin absoluuttista asemaa, voit muuttaa arvoa myös vanhan arvon suhteen OffsetPos()-funktiolla. Funktiolle syötetty arvo lisätään palkin nykyiseen asemaan ja kontrolli piirretään uudelleen. Askelarvon asettaminen ja käyttö Voit asettaa kontrollille arvon, jolla sitä kasvatetaan automaattisesti

Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit päivityssignaalilla. Funktiolle SetStep() voit syöttää kokonaislukuarvon ja kontrollin asemaa lisätään aina tällä arvolla kutsuttaessa funktiota StepIt() ilman parametrejä. Esimerkissämme voisit lisätä rivin funktion OnInitialUpdate()- funktion loppuun asettamaan kontrollin askelarvon ykköseksi näin: m_myprogress.setstep(1); Tämän jälkeen voit lisätä käsittelijäfunktion StepIt?-painikkeelle (kaksoisnapauttamalla painiketta resurssieditorissa), joka kutsuu edistymispalkin StepIt()-funktiota, näin: void CProgressDlg::OnStepIt() { m_myprogress.setstep(1); } Kun koostat ja ajat esimerkkiohjelmasi lisättyäsi tämän painikkeen käsittelijäkoodin, huomaat, että voit kasvattaa edistymispalkin asemaa napauttamalla StepIt?-painiketta. Todennet myös, että painikkeen napauttaminen 11. kerran (ja StepIt()-funktion käyttö) tyhjentää palkin ja aloittaa palkin päivittämisen alusta. OSA II LUKU 7 137 Vierityspalkkien käyttö Vierityspalkkien (scrollbar) yleisin paikka Windows-ohjelmissa on ikkunakehyksessä vierittämässä ikkunan sisältöä (tästä yksityiskohtia luvussa 18). Niitä voidaan käyttää myös itsenäisinä kontrolleina lukualue-esityksissä. Nykyään vierityspalkkimainen lukualueen esitys on yhä useammin annettu liukukontrollille (Slider), mutta liukukontrolli on ominut varsin paljon vierityspalkin ominaisuuksia ja näin ollen on hyvä tuntea niiden perusteita. Lisätietoja vierityspalkin käytöstä ikkunan vierityksessä luvussa 18. Vierityspalkin lisääminen valintaikkunaan Voit lisätä vierityspalkin valintaikkunaan yksinkertaisesti

138 Valintaikkunat ja kontrollit Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit resurssieditorissa valitsemalla työkaluriviltä Scroll Bar ja vetämällä sen haluttuun paikkaan valintaikkunassa. Controls-työkalupalkissa on kaksi erilaista vierityspalkkikuvaketta toinen vaakasuuntaista (Horizontal), toinen pystysuuntaista (Vertical) vierityspalkkia varten (kuten kuvan 7.4 kuvakkeen ohjeteksti osoittaa). Vierityspalkkien kokoa ja paikkaa voidaan muuttaa valintaikkunaan asettamisen jälkeen ja vierityspalkin tunnustakin voidaan vaihtaa Scrollbar Properties ikkunan Generalvälilehdeltä (saat ikkunan esiin valitsemalla kontrollin ja näppäilemällä Alt+Enter). KUVA 7.4 Vaaka- ja pystysuuntaisten vierityspalkkien lisääminen resurssieditorissa. Scrollbar Properties ikkunan Styles-välilehdellä on vain yksi muutettavissa oleva valinta, jolla voidaan säätää vierityspalkin sijoittelua sille varatun nelikulmion sisällä. Tämä Align-valinta voi saada kolme eri arvoa: None. Oletusasetus, jolla vierityspalkki esitetään juuri sille varatun nelikulmion kokoisena. Top/Left. Vierityspalkki on vakiokokoinen ja se tasataan palkille varatun nelikulmion vasempaan yläkulmaan. Bottom/Right. Toimii kuten Top/Left, paitsi että tasaus tehdään nelikulmion oikeaan alakulmaan. Lisätietoja valintaikkunan muokkauksesta ja kontrollien ominaisuuksista luvun 3 alussa. Muuttujan liittäminen vierityspalkkiin Voit liittää muuttujan vierityspalkkiin aivan edistymispalkin kohdalla annettujen ohjeiden mukaan hieman aiemmin tässä luvussa. Ainoa mainittava ero on vaiheessa 5 mainituissa Category- ja Variable Type yhdistelmäruuduissa. Vierityspalkilla Category-valinta voi olla vain Control, mutta liukukontrollilla se voi olla joko Controltai Value. Jos valitset tähän Value, asetetaan Variable Type ruutuun int.

Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit Tällöin liukukontrolliin liitetty kokonaislukumuuttuja liitetään valitsemaasi kohdeluokkaan. Kontrolliin liitettyä muuttujaa päivitetään sitten kontrollin aseman mukaan aivan kuten tekstiruutuunkin liitettyä kokonaislukua (tästä enemmän luvussa 10). OSA II LUKU 7 139 Jos sen sijaan valitset Category -ruutuun Control, asetetaan Variable Type automaattisesti kontrolliin liittyvään MFC-luokkaan CScrollBar. Jatka tästä edistymispalkkia koskevien ohjeiden mukaan ja sulje Add Member Variable ikkuna ja ClassWizard. Yksityiskohtaisempi kuvaus jäsenmuuttujien liittämisestä luvussa 10. Vierityspalkin alustaminen Voit alustaa vierityspalkin edistymispalkin tavoin funktiossa OnInitDialog(). Vierityspalkille määritetään myös lukualue (range), jonka voit asettaa CScrollBar-luokan SetScrollRange()-funktiolla syöttämällä sille lukualueen ala- ja ylärajan. Voit määrittää myös valinnaisen kolmannen syöttöparametrin, uudelleenpiirtolipun (tämän oletusarvo on TRUE). Jos olet esimerkiksi liittänyt kuvan 7.4 vierityspalkit kahteen CScrollBar-luokan jäsenmuuttujaan m_scrollbar1 (pysty) ja m_scrollbar2 (vaaka), voisit alustaa ne OnInitDialog()-funktion lopussa seuraavasti: m_scrollbar1.setscrollrange(0,100); m_scrollbar2.setscrollrange(0,200); Tässä tapauksessa pystysuuntaisen vierityspalkin (m_scrollbar1) lukualue olisi nollasta sataan ja vaakasuuntaisen 0 200. Kolmatta parametriä ei ole syötetty, joten molemmat vierityspalkit uudelleenpiirretään (kolmas parametri FALSE estäisi tämän). Vastaavasti GetScrollRange()-funktiolla, jolle syötetään kaksi kokonaislukuosoitinta, saataisiin luettua nykyinen lukualue näin: Control-kategorian käyttö Kun kontrolli liitetään muuttujaan Category-asetuksen Controlvalinnalla, liitetty kontrolliluokka (kuten CScrollBar) johdetaan aina CWnd-luokasta. Tällöin kaikki ikkunalle tehtävissä olevat toimet, kuten sen koon ja paikan muuttaminen, voidaan suorittaa ohjelmakoodista liitetyn kontrollimuuttujan kautta. Esimerkki tekstiruudun koon muuttamisesta löytyy luvusta 18. Vierityspalkin lukualueen rajoitukset Voit syöttää vierityspalkin vähimmäis- ja enimmäisarvot vapaasti, kunhan niiden erotus ei ylitä 32767:ää. int nmin, nmax; m_scrollbar2.getscrolrange(&nmin, &nmax); TRACE( Range = %d to %d)\n, nmin, nmax); Jos haluat estää vierityspalkin nuolien piirtämisen palkin päihin, voit kutsua EnableScrollBar()-funktiota ja välittää sille jonkun taulukon 7.1 lipuista.

140 Valintaikkunat ja kontrollit Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit TAULUKKO 7.1 EnableScrollBar()-funktiolle syötettävät liput vierityspalkin nuolien poistamiseksi Lipun arvo ESB_DISABLE_BOTH ESB_DISABLE_LTUP ESB_DISABLE_RTDN ESB_ENABLE_BOTH parametrejä). Kuvaus Poistaa molemmat nuolet Poistaa vasemmanpuoleisen tai ylemmän nuolen (riippuu palkin suunnasta). Poistaa oikeanpuoleisen tai alemman nuolen (riippuu palkin suunnasta). Näyttää molemmat nuolet (tämä on oletus, ellei EnableScrollBar()-funktiolle syötetä Edistymispalkin tavoin voit asettaa vierityspalkin arvon kutsumalla vierityspalkin SetScrollBar()-funktiota ja syöttämällä sille lukualueeseen kuuluvan kokonaisluvun. Vastaavasti voit lukea vierityspalkin arvon GetScrollPos()-funktiolla. SCROLLINFO-tietorakenne Yksityiskohtia vierityspalkista voidaan asettaa ja lukea SCROLLINFO-tietorakenteen kautta SetScrollInfo() ja GetScrollInfo()-funktioilla. GetScrollInfo() käyttää kahta parametriä: osoitinta SCROLLINFO-tietorakenteeseen ja lippumaski tietorakenteesta luettavista arvoista. Tämä lippuarvo voi olla yhdistelmä lipuista SIF_RANGE, SIF_POS, SIF_TRACKPOS ja SIF_PAGE, jotka käsittelevät SCROLLINFOtietorakenteen jäseniä nmin ja nmax, npos, ntrackpos sekä npage. SIF_ALL käsittelee näitä kaikkia. Jos haluat asettaa vierityspalkissa käytetyn suorakulmion koon esittämään näkyvän osan kokoa lukualueeseen (esimerkiksi yhden sivun koko suhteessa koko asiakirjan kokoon), voit käyttää SetScrollInfo()- funktiota syöttämällä sille SCROLLINFO-struktuurin. Suuri osa tästä tietorakenteesta käsittelee juuri käsiteltyjen funktioiden toimintoja, kuten paikan ja lukualueen asettamista. SCROLLINFO-rakenteen merkittävä jäsen on npage. Sen arvona tulee käyttää kokonaislukua, joka kuvaa näkyvän sivun kokoa suhteutettuna vierityspalkin lukualueeseen. Esimerkiksi tekstinkäsittelysovelluksessa vierityspalkkisi lukualue saattaisi olla 0 100 ja näytöllä näkyisi yksi sivu kerrallaan. Näin kaksisivuisella asiakirjalla npage-jäsenen arvona käytettäisiin lukua 50, eli yksi sivu olisi puolet koko asiakirjasta. 20- sivuisella asiakirjalla npage:n arvoksi sopisi 5 eli yksi sivu olisi vain 1/ 20 koko asiakirjasta (siis lukualueesta 0-100). Joudut asettamaan myös fmask-jäsenen arvoon SIF_PAGE, jotta SetScrollInfo()-funktio tietäisi npage-jäsenen olevan käytössä sekä lopuksi cbsize-jäsenen (tämä on yhteinen Win32 struktuureille). Jos esimerkiksi haluat asettaa pystysuuntaisen vierityspalkin sivun kooksi 30, lisäät seuraavat rivit alustuskoodiin SetScrollRange()-funktion kutsun jälkeen:

Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit OSA II LUKU 7 141 SCROLLINFO si; si.cbsize = sizeof(scrollinfo); si.npage = 30; si.fmask = SIF_PAGE; m_scrollbar1.setscrollinfo(&si); Näiden rivien suorituksen jälkeen vierityspalkin asemaa esittävä suorakulmio on pystysuuntaisessa vierityspalkissa suurempi kuin vaakasuuntaisen palkin oletuskokoinen nelikulmio. Lisätietoja TRACE-makrosta luvussa 27. Vierityspalkin ilmoitussanomien käsittely Kun käyttäjä käyttää vierityspalkkia siirtämällä suoraan vieritysruutua, napauttamalla vieritysnuolta tai näppäilemällä Page Up/Page Down tai nuolinäppäintä, lähettää vierityspalkki isäikkunalleen ilmoitussanoman. Nämä sanomat ovat Windowsin WM_HSCROLL vaakavierityspalkille ja WM_VSCROLL pystyvierityspalkille. Voit lisätä sanomankäsittelijät näille New Windows Messages/Events valintaikkunassa normaaliin tapaan. Valintaikkunasovelluksessa pääikkunan luokka käsittelee vierityspalkin isäikkunan, joten sinne käsittelijäfunktio kuuluukin sijoittaa. Jos esimerkiksi sovelluksesi nimi olisi Scroll, olisi pääsovellusluokka CScrollDlg ja se juuri tulisi valita New Windows Messages/Events ikkunan Class or Object to Handle luettelosta. (Tarkemmat ohjeet toimenpiteeseen löytyvät luvusta 18). Muutat vain sovellusluokan oman sovelluksesi pääikkunaluokan nimiseksi sekä käytät WM_VSCROLL-sanomaa WM_HSCROLL-sanoman sijaan. Lisättyäsi uuden WM_VSCROLL-sanoman käsittelijäfunktion näet seuraavan ClassWizardin tekemän koodin käsittelijäfunktiossa: void CScrollDlg::OnVScroll(UINT nsbcode, UINT npos, CScrollBar* pscrollbar) { // TODO: Add your message handler code here and/or call CDialog::OnVSCroll(mSBCode, npos, pscrollbar); } WM_HSCROLL-sanoman käsittelijä on samanlainen rakenteeltaan ja määrittelyltään, ainoastaan funktion nimi on muutettava OnHScroll():ksi. Jos käytät sekä vaaka- että pystyvierityspalkkeja, tarvitset molempien sanomien käsittelijäfunktiot.

142 Vierityspalkin negatiivinen asema Jos vierityspalkin lukualue sallii, npos saattaa sisältää negatiivisen arvon. Tämä arvo välitetään kuitenkin UINT-tyyppisenä (etumerkitön kokonaisluku), jolloin negatiivisia lukuja merkitään suurilla positiivisilla arvoilla. Jos tiedät näin meneteltävän, voit muuttaa nposmuuttujan tyypin int-tyyppiseksi negatiivisten arvojen käyttämiseksi. Valintaikkunat ja kontrollit Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit Ensimmäinen käsittelijäfunktiolle välitetty parametri (nsbcode) on lippu, joka kertoo millaisesta käyttäjän suorittamasta vierityksestä on kyse. Tämä riippuu tavasta, jolla vierityspalkkia käytettiin (raahattiinko vieritysruutua, napautettiinko palkkia tai nuolia vai painettiinko näppäintä). Tämän lipun eri arvot on esitetty taulukossa 7.2. Joudut ensiksi päättämään, haluatko yleensä käsitellä vierityspalkkia (jos kyseessä on ikkunan vierityspalkki, se käsitellään CDialog-luokan OnVScroll()-funktiossa). Sitten voit päättää tämän lipun perusteella, kuinka vierityspalkin asemaa tulisi siirtää. Ellet tarkoituksella muuta vierityspalkin asemaa vierityspalkin SetScrollPos()-funktiolla, käyttäjän vapauttaessa vieritysruudun se palaa vierityspalkin alkuun. TAULUKKO 7.2 Vierityspalkin käsittelijän nsbcode-parametrin välittämät lipputiedot Lipun arvo SB_THUMBTRACK SB_THUMBPOSITION SB_ENDSCROLL SB_LINEUP SB_LINELEFT SB_LINEDOWN SB_LINERIGHT SB_PAGEUP SB_PAGELEFT SB_PAGEDOWN SB_PAGERIGHT Tarkoitus Käyttäjä on raahannut vieritysruudun tiettyyn paikkaan. Saat paikan selville toisesta nposparametristä. Käyttäjä on raahannut vieritysruudun tiettyyn paikkaan ja vapauttanut hiiren painikkeen. Saat paikan selville toisesta npos-parametristä. Käyttäjä on vapauttanut hiiren painikkeen painettuaan sitä vieritysnuolen tai vierityspalkin päällä (ei vieritysruudun). Vieritysruudun paikkaa tulee vähentää yhdellä. Sama kuin SB_LINEUP, mutta vaakavierityspalkille. Vieritysruudun paikkaa tulee kasvattaa yhdellä. Sama kuin SB_LINEDOWN, mutta vaakavierityspalkille. Vieritysruudun paikkaa tulee vähentää yhdellä (sovelluskohtaisella) sivunkoolla. Sama kuin SB_PAGEUP, mutta vaakavierityspalkille. Vieritysruudun paikkaa tulee kasvattaa yhdellä (sovelluskohtaisella) sivunkoolla. Sama kuin SB_PAGEDOWN, mutta vaakavieritys palkille.

Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit OSA II LUKU 7 143 Saat selville, mikä vierityspalkki sanoman lähetti tutkimalla kolmatta OnVScroll()-funktiolle välitettyä parametriä, joka on osoitin siihen vierityspalkkiin, jota käytettiin. Ehkä helpoin tapa tunnistaa vierityspalkki on käyttää sen ID-tunnusta. Sen saat selville syöttämällä GetDlgCtrlID()-funktiolle pscrollbar-osoittimen. Tämä funktio palauttaa kontrollia vastaavan ID-tunnuksen, jota voit verrata tunnettuihin kontrolleihisi ja päättää, tuleeko sanoma käsitellä (ja jos, niin miten). Listauksessa 7.1 esitettävä koodi esittää WM_VSCROLL-sanoman esimerkkikäsittelijän. Kun oikea vierityspalkki on tunnistettu, käyttäjän tekemiset selvitetään ja käsitellään asianmukaisesti siirtämällä vierityspalkin asemaa. Vaakavierityspalkin paikka päivitetään myös pystyvierityspalkin mukaiseksi, joten jos käyttäjä vierittää pystysuunnassa, myös vaakavierityspalkin asema muuttuu. LISTAUS 7.1 LST7_1.CPP Vierityspalkin sanoman käsittely ja aseman päivitys 1 void CScrollDlg::OnVScroll(UINT nsbcode, UINT npos, CScrollBar* pscrollbar) 2 { 3 if (pscrollbar->getdlgctrlid() == IDC_SCROLLBAR1) 1 4 { 5 int ncurrentpos = pscrollbar->getscrollpos(); 6 switch(nsbcode) 7 { 8 case SB_THUMBTRACK: 9 case SB_THUMBPOSITION: 10 pscrollbar->setscrollpos(npos); 2 11 break; 12 case SB_LINEUP: 13 pscrollbar->setscrollpos(ncurrentpos-1); 14 break; 15 case SB_LINEDOWN: 16 pscrollbar->setscrollpos(ncurrentpos+1); 17 break; 18 case SB_PAGEUP: 19 pscrollbar->setscrollpos(ncurrentpos-5); 20 break; 21 case SB_PAGEDOWN: 22 pscrollbar->setscrollpos(ncurrentpos+5); 23 break; 24 } 25 m_scrollbar2.setscrollpos( 26 2 * pscrollbar->getscrollpos()); 3 27 } 28 29 CDialog::OnVScroll(nSBCode, npos, pscrollbar); 30 } WM_VSCROLL ja WM_HSCROLL-sanomat Muista, että pystyvierityspalkki lähettää WM_VSCROLLsanoman, jonka käsittelijäfunktio on OnVScroll(). Vaakavierityspalkki lähettää puolestaan WM_HSCROLLsanoman ja tämä käsitellään funktiossa OnHScroll(). Yleinen virhe on toteuttaa ainoastaan yksi käsittelijäfunktio vain jomman kumma sanoman käsittelemiseen. Ehkä Windowsiin olisi alkuaankin pitänyt tehdä vain yksi vierityspalkkisanoma, mutta 16- bittisyys pakotti aikanaan käyttämään kahta. 1 Tarkista ID-tunnus, jotta ilmoitus olisi oikealle vierityspalkille. 2 Päivitä vierityspalkin asema vierityspalkin käyttäjän toimien seurauksena lähettämän sanoman mukaisesti. 3 Tämä rivi päivittää toisen vierityspalkin kaksinkertaiseen arvoon ensimmäiseen verrattuna, koska toisen lukualuekin on kaksinkertainen.

144 Valintaikkunat ja kontrollit Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit Rivillä 3 listauksessa 7.1 tunnistetaan vierityspalkki tutkimalla, onko GetDlgCtrlID()-funktion palauttama arvo sama kuin pystyvierityspalkin (IDC_SCROLLBAR1) ID-tunnus. Jos näin on, vierityspalkin asema selvitetään vierityspalkin GetScrollPos()- funktiolla ja se asetetaan ncurrentpos-muuttujan arvoksi rivillä 5. Rivin 6 switch-lause erottelee eri käyttäjän toimet nsbcodemuuttujassa olevan koodin perusteella. Jos vieritysruutua on raahattu tai sitä on raahattu ja hiirinäppäin vapautettu, asetetaan vierityspalkin asema käyttäjän asettamaksi npos-muuttujassa olevaksi asemaksi funktiolla SetScrollPos() rivillä 10. Jos vieritysruutua siirretään ylös tai alaspäin vieritysnuolilla, kasvatetaan tai vähennetään nykyistä asemaa yhdellä riveillä 12-17. Jos käyttäjä on napauttanut vierityspalkin pohjaa ilmoittaakseen, että vierityspalkin asemaa on siirrettävä sivun verran, nykyistä asemaa siirretään (tässä) hatusta temmatut 5 yksikköä, joka edustaa sovelluksen sivun pituutta, riveillä 18 23. Lopuksi toinen (vaakasuuntainen) m_scrollbar2-muuttujaan liitetty vierityspalkki asetetaan pystyvierityspalkista riippuvaan asemaan kutsumalla palkin SetScrollPos()-funktiota ensimmäisen vierityspalkin mukaisen arvon mukaisesti riveillä 25 26. Huomaa, että tuo arvo kerrotaan kahdella rivillä 26. Tämä johtuu siitä, että vaakavierityspalkin lukualue on kaksinkertainen pystyvierityspalkkiin nähden (muistanet OnInitDialog()-funktiossa käytetyn SetScrollRange(0,200) kutsun). Rivillä 29 kutsuttu valintaikkunan kantaluokan käsittelijäfunktio CDialog()::OnVScroll() sallii valintaikkunan itsensä käsitellä sen mahdollisesti omistamat vierityspalkit ja näin vierittää itse valintaikkunaa (tästä lisää luvussa 18). Lisätietoja vierityspalkin ilmoitussanomista luvun 18 lopussa. Liukukontrollin käyttö Liukukontrollilla (liukusäädin, slider) käyttäjä voi asettaa arvon raahaamalla palkin ilmaisinta lineaarisella lukualueella ja pudottamalla sen sopivaan paikkaan (kts. kuva 7.5), kuten joidenkin äänentoistolaitteiden säädöissä.

Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit OSA II LUKU 7 145 KUVA 7.5 Liukukontrolli, jonka yläpuolella on pienet askelmerkit; asema on esitetty myös edistymispalkilla alla. Liukukontrolli on hienostuneempi vaihtoehto vierityspalkille, koska silläkin on säädettävä lukualue sekä määritelty nykyinen asema. Liukukontrollia voidaan kuitenkin räätälöidä vieläkin paremmin kuin vierityspalkkia. Liukukontrollin lisääminen valintaikkunaan Voit raahata liukukontrollin valintaikkunaan valitsemalla ensin työkalupalkista Slider. Kuten muitakin kontrolleja, myös liukusäätimen kokoa ja paikkaa voidaan muuttaa sen valintaikkunaan sijoittamisen jälkeen ja sen ID-tunnus voidaan muuttaa Slider Properties ikkunan General-välilehdeltä. Styles-välilehdellä (kuvassa 7.6) voit asettaa useita käyttäytymiseen ja ulkonäköön liittyviä yksityiskohtia. KUVA 7.6 Liukukontrollin Styles-valinnat resurssieditorin Slider Properties-ikkunassa. Styles-välilehdellä on kaksi yhdistelmäruutua. Ensimmäisen, Orientation, voit valita asetettavaksi arvoon Horizontal (vaakasuuntainen) tai Vertical (pysty). Oletuksena liukukontrolli on vaakasuuntainen jos muutat sen pystyyn, voit joutua muuttamaan kontrollin kokoa. Toinen yhdistelmäruutu, Point, on osoittimen asettamista varten. Tämä on oletuksena Both, mutta muuttamalla sen arvoon Top/Left, saat muutettua laatikkomaisen osoittimen yläpuolelta teräväpäiseksi (tai vasemmalta) tai vastaavasti Bottom/Rightvalinnalta päinvastoin. Liukukontrollin tyylivalinnoissa ovat lisäksi käytettävissä seuraavat asetukset: Tick Marks. Tällä valinnalla saadaan näkyviin pienet apuviivat liukukontrollin aseman paikantamisen avuksi.

146 Valintaikkunat ja kontrollit Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit Auto Ticks. Tällä valinnalla saadaan apuviivat kaikkiin liukukontrollin käyttämiin asemiin (Tick Marks on oltava valittu). Enable Selection. Liukusäätimen alle sijoitetaan valkoinen palkki, josta osoitetaan liukusäätimen valinta-alueen rajat pienin kolmioin. Border. Liukukontrolli ympäröidään rajaavalla nelikulmiolla. Lisätietoja valintaikkunan kontrollien ominaisuuksien muokkaamisesta luvun 3 alusta. Kontrollien salliminen ja poistaminen käytöstä dynaamisesti Voit sallia kontrollin tai poistaa sen käytöstä uuden kontrolliin liitetyn muuttujan avulla (kuten CSliderCtrl). Tämä tehdään käyttämällä liitetyn muuttujan EnableWindow()-funktiota, jolle syötetään joko TRUE tai FALSE (esimerkiksi m_mysliderctrl.enablewindow(false). Tällä voidaan estää käyttäjää muuttamasta kontrollia tietyissä tilanteissa. Muuttujan liittäminen liukukontrolliin Voit liittää muuttujan liukukontrolliin aivan edistymispalkin kohdalla annettujen ohjeiden mukaan hieman aiemmin tässä luvussa. Ainoa mainittava ero on vaiheessa 5 mainituissa Category- ja Variable Type yhdistelmäruuduissa. Vierityspalkin tavoin liukukontrollilla Category-valinta voi olla joko Control tai Value. Jos valitset tähän Value, asetetaan Variable Type ruutuun int. Tällöin liukukontrolliin liitetty kokonaislukumuuttuja liitetään valitsemaasi kohdeluokkaan. Kontrolliin liitettyä muuttujaa päivitetään sitten kontrollin aseman mukaan aivan kuten vierityspalkkiin liitettyä kokonaislukua. Loput tästä osasta keskittyy Category-valinnan Control -asetukseen, joka asettaa automaattisesti Variable Type -kontrolliin liukukontrolleihin liittyvän MFC-luokan CSliderCtrl. Jatka tästä edistymispalkkia koskevien ohjeiden mukaan ja sulje Add Member Variable ikkuna ja ClassWizard. Yksityiskohtia jäsenmuuttujan liittämisestä luvusta 10. Liukukontrollin alustaminen Voit asettaa liukukontrollin lukualueen sen SetRange()-funktiolla syöttämällä funktiolle lukualueen ala- ja ylärajan. Valinnaisella kolmannella parametrillä voit estää liukukontrollin uudelleenpiirtämisen käyttämällä arvoa FALSE. Kontrollin lukualueen alaraja voidaan asettaa

Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit myös erikseen funktioilla SetRangeMin() ja yläraja vastaavasti funktiolla SetRangeMax() syöttämällä niille vastaavan kokonaislukuarvon. Rajat voidaan puolestaan lukea kontrollin funktioilla GetRangeMin() ja GetRangeMax(). OSA II LUKU 7 147 Voit asettaa liukukontrollin aseman syöttämällä vastaavan kokonaislukuarvon kontrollin funktiolle SetPos() ja myös lukea nykyisen aseman funktiolla GetPos(). Vierityspalkin tavoin käyttäjä voi kasvattaa liukukontrollin arvoa nuolitai sivunvaihtonäppäimillä. Näiden näppäinpainallusten käsittelemien ilmoitussanomien käsittely ei kuitenkaan ole välttämätöntä kontrollin aseman päivittämiseksi. Voit ohjelmallisesti asettaa halutun rivin ja sivun koon funktioilla SetLineSize() ja SetPageSize() ja vastaavasti lukea ne jäsenfunktioilla GetLineSize() ja GetPageSize(). Voit asettaa myös apumerkkien (tick marks) paikat syöttämällä SetTickFreq()-funktiolle arvon, joka kertoo, kuinka tiheästi apumerkkejä käytetään. Jos haluat esimerkiksi joka viidennen lukualueen arvon kohdalle apumerkin, kirjoita: Liukukontrollin channelalueen löytäminen Channel-alue on liukukontrollin osa, jossa liukusäädin liikkuu. Tämän paikka ja koko saadaan selville CSliderCtrl-luokan GetChannelRect()-funktiolla. m_slider.settickfreq(5); Jotta SetTickFreq()-funktio toimisi, tulee resurssieditorissa valita liukukontrollin Properties-ikkunan Styles-välilehdellä Auto Ticks. Saat halutessasi selville apumerkkien määrän funktiolla GetNumTicks(). Jos Styles-välilehdellä on valittuna Enable Selection, voit näyttää liukukontrollin valinta-alueen funktiolla SetSelection(). Tämä näkyy liukukontrollin alla olevassa valkoisessa palkissa tummana alueena (kuva 7.5). Voit syöttää SetSelection()-funktiolla valintaalueen ala- ja ylärajan, jotka edustavat valittua aluetta liukupalkin esittämän lukualueen sisällä. Nykyiset valinta-alueen arvot saat luettua syöttämällä GetSelection()-funktiolle kaksi kokonaislukuviittausta. Funktio palauttaa arvot näissä kokonaisluvuissa. Voit myös poistaa liukupalkin valinta-alueen jäsenfunktiolla ClearSel(). Lisätietoja valintaikkunoiden alustamisesta luvusta 10. Liukukontrollin ilmoitussanomiin vastaaminen Liukukontrollit lähettävät isäikkunalleen vierityspalkeista tuttuja sanomia WM_VSCROLL ja WM_HSCROLL. Ainoa ero vierityspalkkeihin on, ettet joudu asettamaan liukukontrollin uutta asemaa itse, vaan se Apumerkkien poistaminen ohjelmasta manuaalisesti Voit poistaa liukusäätimen apumerkit kontrollista ClearTics()-funktiolla. TRUEparametrillä kontrolli piirretään tämän jälkeen välittömästi uudelleen.

148 Valintaikkunat ja kontrollit Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit tehdään automaattisesti. Näiden sanomien avulla voit kuitenkin tehdä valitsemiasi toimia käyttäjän muuttaessa liukukontrollin asemaa. Jos haluat esimerkiksi liukukontrollin avuksi edistymispalkin (kuva 7.5), voit aluksi lisätä kontrollit ikkunaan resurssieditorissa. Liitä sen jälkeen molempiin kontrolleihin muuttuja liukukontrollin IDC_SLIDER1 luokan CSliderCtrl kontrollimuuttuja m_slider ja edistymispalkkiin IDC_PROGRESS1 luokan CProgressCtrl kontrollimuuttuja m_progress. Voit sitten päivittää edistymispalkkia, kun liukukontrollin asemaa muutetaan lisäämällä seuraava OnHScroll()-käsittelijäfunktio ja sen koodi: void CSliderDlg::OnHScroll(UINT nsbcode, UINT npos, CScrollBar* pscrollbar) { if (pscrollbar->getdlgctrlid() == IDC_SLIDER1) m_progress.setpos(m_slider.getpos()); CDialog::OnHScroll(nSBCode, npos, pscrollbar); } Funktiolla GetDlgCtrlID() tunnistetaan liukukontrolli ja edistymispalkin asema asetetaan jäsenfunktiolla SetPos(). Oikea asema saadaan liukukontrollin GetPos()-funktiolla. Jos haluaisit tutkia liukukontrollia koskevia näppäinpainalluksia tai käyttäjän hiirellä tekemiä toimia, tutkisit aluksi muuttujaa nsbcode taulukon 7.2 mukaan, kuten vierityspalkeillakin tehtiin. Lisätietoja kontrollien ID-tunnuksista ja ilmoitussanomista luvusta 4. Kontrollin löytäminen valintaikkunatunnuksen perusteella GetDlgItem() on näppärä vastinefunktio GetDlgCtrlID()- funktiolle, joka palauttaa IDtunnuksella määritetyn kontrollin CWnd-osoittimella. Ellei nykyisestä valintaikkunasta kyseistä ID-tunnusta löydy, funktio palauttaa arvon NULL. Jos haluat käyttää palautettua CWndosoitinta kontrollin tavoin, joudut muuttamaan sen tyypin kontrollia vastaavaan MFC-luokkaan. Päiväys/Aika-kontrollin käyttö Harva käyttäjä suostuisi syöttämään päivämäärää tai kellonaikaa liukupalkista, mutta ennen Visual C++ 6.0:aa ei ollut olemassa sisäänrakennettuja päiväys/aika-kontrolleita; jouduit joko kirjoittamaan sellaisen itse tai käyttämään ActiveX-kontrolleita. Microsoft on lisännyt kaksi toisiinsa liitettyä kontrollia Controls-työkaluriviin: päiväys/aikakontrollin (date time picker) sekä kuukausikalenterin (month calendar, käsitellään seuraavassa kappaleessa). Päiväys/aika-kontrolli käyttää automaattisesti kuukausikalenteria päiväyksen hakemiseen, kun kontrollin yhdistelmäruudun nuolta napautetaan. Olet ehkä nähnyt näitä kontrolleja Microsoft Outlook sähköposti-

Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit ohjelmassa. Päiväys/aika-kontrollilla voit valita sen nimen mukaisesti joko päiväyksen tai kellonajan. Jos tarvitset molempia, käytä kahta kontrollia. Kun kontrollia käytetään päiväyksen valitsemiseen, esitetään kontrolli yleensä yhdistelmäruutuna, jossa valittu päiväys näkyy lyhennetyssä tai pidemmässä muodossaan. Kun yhdistelmäruudun nuolta napautetaan, ponnahtaa esiin kuukausikalenterikontrolli (kuva 7.7), josta päiväys voidaan valita. Kontrollin kellonaikaversiossa (Time, kuvassa 7.7 oikeanpuoleinen), esitetään valittuna oleva kellonaika, jota voidaan muuttaa kirjoittamalla päälle uusi tai muuttamalla aikaa askellusruudun avulla. OSA II LUKU 7 149 KUVA 7.7 Päiväys/aika-kontrollilla valitaan päiväys tai kellonaika. Esimerkki ActiveX-päiväyskontrollista luvun 9 alussa. Päiväys/aika-kontrollin lisääminen valintaikkunaan Päiväys/aika-kontrolli saadaan valintaikkunaan valitsemalla Controlstyökalupaletista Date Time Picker (esitetty kuvassa 7.8) ja raahaamalla se valintaikkunaan. Kontrollin kokoa ja paikkaa voidaan sitten muuttaa tuttuun tapaan samoin kuin kontrollin ID-tunnusta kontrollin Properties-ikkunan General-sivulta (valitse kontrolli ja näppäile Alt+Enter) kuvan 7.8 mukaisesti.

150 Valintaikkunat ja kontrollit Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit KUVA 7.8 Päiväys/aika-kontrollin lisääminen valintaikkunaan resurssieditorissa. Date Time Picker Properties ikkunan Styles-välilehdellä voit asettaa kontrollin esittämään joko päiväyksen tai kellonajan valitsemalla jonkun seuraavista Format-yhdistelmäruudussa: Short Date. Tämä esittää päiväyksen lyhennetyssä muodossaan (esimerkiksi 28.4.1999) ja näyttää valitsemista varten kuukausikalenterin napauttaessasi yhdistelmäruudun avaavaa nuolta. Long Date. Tämä esittää päiväyksen täysimittaisena (esimerkiksi 28. huhtikuu ta, 1999) ja näyttää valitsemista varten kuukausikalenterin napauttaessasi yhdistelmäruudun avaavaa nuolta. Time. Päiväys/aika-kontrollissa esitetään kellonaika (esimerkiksi 13:19:24) sekä yhdistelmäruudun sijaan askellusruutu, jolla voidaan askeltaa valittuna olevia tunteja, minuutteja tai sekunteja. Voit valita kontrollissa myös seuraavia tyylisivulta löytyviä lippuasetuksia napauttamalla vastaavaa valintaruutua: Right Align. Esittää yhdistelmäruudun avaavaa nuolta

Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit napautettaessa kalenterin päiväysruudun oikeaan reunaan tasattuna. Muutoin kalenteri esitettäisiin suoraan päiväysruudun alle. Use Spin Control. Käytetään päiväyksen valinnassa askellusruutua kellonajan tapaan. Valittuna olevia vuosia, kuukausia tai päiviä voidaan askeltaa kontrollilla. Show None. Käyttäjä voi jättää päiväyksen pois napauttamalla päiväysruudun vieressä olevasta valintaruudusta. Allow Edit. Voit muokata ja tarkistaa kontrollin syötettä käyttäjän toimien aikana käsittelemällä kontrollin lähettämän DTN_USERSTRING-sanoman. OSA II LUKU 7 151 Lisätietoja valintaikkunan kontrollien ominaisuuksien muokkaamisesta luvun 3 alusta. Muuttujan liittäminen päiväys/aika-kontrolliin Voit liittää muuttujan päiväys/aika-kontrolliin aivan edistymispalkin kohdalla annettujen ohjeiden mukaan hieman aiemmin tässä luvussa. Jos valitset vaiheessa 5 Category-yhdistelmäruudussa Value, voit valita Variable Type ruudussa joko CTime tai COleDateTime. Kumman tahansa näistä valitsetkin, saat helposti luettua ja asetettua arvon päiväys/aika kontrolliin käyttämällä jommankumman tyyppistä kontrolliin liitettyä muuttujaa, aivan kuten tekstiruudussa käytettiin CString-tyyppistä muuttujaa. Jos haluat hallita paremmin kontrollia ohjelmastasi, valitse Category - yhdistelmäruutuun Control, jolloin Variable Type ruutuun asetetaan automaattisesti CDateTimeCtrl-luokka (joka käsittelee päiväys/aikakontrollia myöhemmin tässä kappaleessa esitettävällä tavalla). Mikään ei estä myöskään liittämästä (tunnuksen perusteella) samaan kontrolliin useampaa muuttujaa, jolloin saat parhaan hyödyn molemmista tavoista: täydellisen hallinnan CDateTimeCtrl-luokan kautta ja helpon käytettävyyden COleDateTime-luokan muuttujasta. Valittuasi muuttujat voit sulkea Add Member Variable ikkunan ja ClassWizardin napauttamalla OK. Tällöin kaikki määrittämäsi uudet muuttujat liitetään niille määrättyyn luokkaan (tavallisesti valintaikkunan käsittelijään). Nyt voit liittää tässä kappaleessa käsiteltyyn AppWizardin tekemään CTime:n ja COleDateTime:n käyttö COleDateTime-luokan käyttö päiväyksissä on suositeltavampaa CTime-luokan sijaan, koska se kykenee käsittelemään päiväyksiä välillä 1.1.100-31.12.9999, mutta CTime ainoastaan välillä 1.1.1970-19.1.2038. Luokan nimikin paljastaa, että COleDateTime sopii paremmin yhteen OLE- ja COM-ohjelmien kanssa.

152 Valintaikkunat ja kontrollit Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit valintaikkunasovellukseen kaksi kontrollia kuvan 7.8 mukaisesti (toinen päiväykselle, toinen ajalle). Kontrollin päiväysversioon viitataan ID-tunnuksella IDC_MYDATE ja siihen liitetään m_mydate-muuttuja ja kellonaikaversioon ID-tunnuksella IDC_MYTIME ja muuttujalla m_mytime. Molemmat muuttujat ovat kotoisin CDateTimeCtrlluokasta. Yksityiskohtia jäsenmuuttujan liittämisestä luvusta 10. Päiväys/aika-kontrollin alustaminen Liukukontrollin ja vierityspalkin tavoin voit asettaa päiväys/aikakontrollille lukualueen. Ala- ja ylärajat esitetään aikaisimman ja myöhäisimmän sallitun päiväyksen ja kellonajan muodossa. Rajat asetetaan syöttämällä CDateTimeCtrl-luokan SetRange()-funktiolle kaksi osoitinta COleDateTime (tai CTime) luokan olioihin, joissa kyseiset arvot ovat. Jos esimerkiksi haluat käyttää päiväyksiä vain vuodelta 1999, voisit lisätä seuraavat rivit OnInitDialog()-funktiosi loppuun: COleDateTimen kelpoisuus Jos olet muodostanut COleDateTime-olion kelpo päiväyksellä, olio saa tilalipun kelpoisuudesta (COleDateTime::valid). Muussa tapauksessa tilalippu on invalid. Tämä tila voidaan tarkistaa GetStatus()-jäsenfunktiolla. Lippu voidaan myös asettaa SetStatus()-funktiolla. COleDateTime dtmin(1999,1,1,0,0,0); COleDateTime dtmax(1999,12,31,23,59,59); m_mydate.setrange(&dtmin,&dtmax); // asettaa kontrollin // aika-alueen Kaksi ensimmäistä riviä muodostavat COleDateTime -oliot parametrien järjestys on alkuarvo vuodelle, kuukaudelle, päivälle, tunneille, minuuteille ja sekunneille. Sitten kontrolliin liitetylle m_mydate-muuttujalle (tyyppiä CDateTimeCtrl) syötetään osoittimet noihin olioihin SetRange()-funktion kautta. Ohjelmaa suoritettaessa käyttäjä voi syöttää päiväyksen ainoastaan vuodelta 1999 ja aika-alueen ulkopuoliset (kalenterissa) esitetään himmennettyinä. Aika-alue voidaan vastaavasti lukea syöttämällä GetRange()-funktiolle osoittimet kahteen COleDateTime (tai CTime) olioon. Voit myös määrittää, kuinka päiväys tai kellonaika esitetään muuttamalla sen esitysformaattia (oletusmuoto saadaan Ohjauspaneelin paikallisasetuksista). Voit syöttää esitysmuotomerkkijonon funktiolle SetFormat(), jolloin saat muodostettua haluamasi esitysmuodon merkkikoodin osista taulukon 7.3 mukaisesti.

Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit TAULUKKO 7.3 Päiväys/aika-kontrollin muotoilukoodit OSA II LUKU 7 153 Muotoilukoodi Kuvaus yyy Näyttää vuoden neljällä numerolla (esim. 1998 ) yy Näyttää vuoden kaksi viimeistä numeroa (esim. 98 ) y Näyttää vuoden viimeisen numeron numerolla (esim. 8 ) MMMM Näyttää kuukauden koko nimen (esim. huhtikuu ) MMM Näyttää kuukauden nimen lyhennettynä (esim. huhti ) MM Näyttää kuukauden kahdella numerolla (esim. 04 ) M Näyttää kuukauden yhdellä tai kahdella numerolla (esim. 4 tai 11 ) dddd Näyttää viikonpäivän koko nimen (esim. keskiviikko ) ddd Näyttää viikonpäivän nimen lyhennettynä (esim. ke ) dd Näyttää päivän kahdella numerolla (esim. 28 ) d Näyttää päivän yhdellä tai kahdella numerolla (esim. 7 tai 28 ) HH Näyttää tunnit kahdella numerolla 24-tuntinäytöllä (esim. 16 ) hh Näyttää tunnit kahdella numerolla 12-tuntinäytöllä (esim. 04 ) H Näyttää tunnit yhdellä tai kahdella numerolla 24- tuntinäytöllä (esim. 4 tai 16 ) h Näyttää tunnit yhdellä tai kahdella numerolla 12- tuntinäytöllä (esim. 4 tai 4, olipa kyse aamusta tai iltapäivästä) tt Näyttää aamu/iltapäivämerkinnän kahdella merkillä, JOS se on käytössä kansallisissa asetuksissa. t Näyttää aamu/iltapäivämerkinnän yhdellä merkillä, JOS se on käytössä kansallisissa asetuksissa. mm Näyttää minuutit kahdella numerolla (esim. 07 tai 59 ) m Näyttää minuutit yhdellä tai kahdella numerolla (esim. 7 tai 59 ) ss Näyttää sekunnit kahdella numerolla (esim. 07 tai 59 ) COleDateTime-tulostuksen muotoilu Voit käyttää samanlaisia muotoilukoodeja myös COleDateTime-olioille (päiväys/ aika-kontrollista saatuja) COleDateTime-luokan Format()- funktiolla. Muotoilukoodit annetaan Format()-funktiolle ensimmäisenä parametrinä. Muotoilukoodeja on runsaasti kuukauden, vuoden, päivän, tuntien, minuuttien ja sekuntien esittämiseen. Esimerkiksi %c esittää päiväyksen ja ajan paikallisesti muotoiltuna ja %#c saman pidemmässä muodossa. Voit lisätä esitysmuotoon myös omia merkkejäsi ympäröimällä ne heittomerkillä. Jos esimerkiksi haluat esittää päiväyksen ja kellonajan samassa päiväys/aika-kontrollissa antaaksesi käyttäjän määrittää niistä

154 Valintaikkunat ja kontrollit Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit molemmat, käyttäisit ehkä seuraavanlaista lausetta OnInitDialog()- funktiossa: m_mydate.setformat( d. M. yyyy H : mm. ss ); Huomaa, että pisteiden, välilyöntien ja kaksoispisteen ympärillä on heittomerkit. Ohjelmaa suoritettaessa voit valita päiväyksen kuukausikalenterista ja syöttää kellonajan samassa ruudussa (kuva 7.9). KUVA 7.9 Räätälöity päiväys/aikakontrolli esittää alustetun ajan. Usein halutaan asettaa myös päiväys ja kellonaika oletuksena olevan järjestelmäajan sijaan. Voit syöttää kontrollin SetTime()-funktiolle kyseisen päiväyksen COleDateTime-oliossa. Jos esimerkiksi haluat asettaa alkuperäiseksi ajaksi 15 minuuttia yli viiden iltapäivällä tammikuun 24 päivänä vuonna 1992, koodaisit sen seuraavasti: m_mydate.settime(coledatetime(1992,1,24,17,15,0)); Kun kontrolli näytetään, siinä on valmiina tuo alkuperäinen päiväys ja aika (kuva 7.9). Voit myös lukea kontrollista siihen asetetun ajan ja päiväyksen syöttämällä GetTime()-funktiolle COleDateTime-olion. Aika ja päiväys saadaan funktion suorittamisen jälkeen luettua oliosta olion omilla lukumetodeilla. Seuraava koodi esimerkiksi esittäisi sanomaruudussa valitun ajan ja päiväyksen sen jälkeen, kun valintaikkunan OK-painiketta napautetaan (lisää aivan ensin painikkeelle OnOK()-käsittelijäfunktio): void CDtpickerDlg::OnOK() { COleDateTime dtchosentime; m_mydate.gettime(dtchosentime); AfxMessageBox(dtChosenTime.Format( %#x ));

Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit OSA II LUKU 7 155 CDialog::OnOK(); } Nykyinen aika ja päiväys haetaan ja asetetaan dtchosentimemuuttujaan, joka muotoillaan esittämistä varten COleDateTimeluokan Format-metodilla ja esitetään sanomaruudussa. Päiväys/aika-kontrollissa voit asettaa myös alasvetokalenterin värin ja fontin. Voit syöttää muokattavan kalenterin osan indeksin (taulukon 7.4 mukaan) ja värin funktiolle SetMonthCalColor(). Kun syötät fontin kahvatunnisteen (HFONT) funktiolle SetMonthCalFont(), voit muuttaa myös kalenterin fonttia. Lisätietoja fonttien käsittelystä luvussa 17. Päiväys/aika-kontrollin ilmoitussanomiin vastaaminen Kun käyttäjä muuttaa aikaa tai päiväystä päiväys/aika-kontrollissa, voit suorittaa toimia pääikkunassa tällöin lähetettävän DTN_DATETIMECHANGE-ilmoitussanoman ohjaamana. Saat lisättyä sanomankäsittelijän seuraavasti. Arvojen hakeminen COleDateTime-oliosta Saantifunktioita on useita päiväyksen ja ajan eri osien hakemiseen, esimerkiksi GetYear(), GetMonth(), GetDay(), GetMinute() ja GetSecond(). Käytössä on myös useita näistä johdettuja funktioita, kuten GetDayOfWeek() viikonpäivän hakemiseksi ja GetDayOfYear(). GetDayOfWeek() palauttaa viikonpäivän koodina 1-7, missä 1 tarkoittaa sunnuntaita. GetDayOfYear() palauttaa arvon 1-366, alkaen tammikuun ensimmäisestä. Ajan muuttamisen ilmoitussanoman käsittelijän lisääminen 1. Napauta resurssieditorissa käsiteltävän aika/päiväys-kontrollin päällä hiiren oikeaa painiketta. 2. Valitse pikavalikosta Events ja saat esiin New Window Message and Event Handlers ikkunan. 3. Valitse New Window Messages/Events luettelosta DTN_DATETIMECHANGE (tai halutessasi joku muu luettelon ilmoitussanomista). 4. Napauta Add and Edit painiketta ja saat esiin Add Member Function ikkunan, jossa lisättävän funktion oletusnimi on jo valmiina. 5. Muuta halutessasi funktion nimeä ja napauta OK, jolloin pääset suoraan muokkaamaan uutta käsittelijäfunktiota editorin ikkunassa. Tämän funktion pitäisi muistuttaa listauksessa 7.2 esitettyä koodia.

156 Valintaikkunat ja kontrollit Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit Lisättyäsi käsittelijäfunktion, voit suorittaa siinä muuttuneen päiväyksen vaatimat toimet. Käsittelijäfunktio saa ensimmäisenä parametrinään osoittimen NMHDR-struktuuriin. Tavallisesti kullekin päiväys/aikakontrollille käytetään omaa käsittelijäänsä, mutta saat selville lähettäjäkontrollin ID-tunnuksen NMHDR-struktuurin idfrom-jäsenestä. Näin voit käyttää samaa käsittelijää usealle eri päiväys/aika-kontrollille. Listauksessa 7.2 on esitetty tällainen jaettu käsittelijäfunktio ja sen kaksi ON_NOTIFYsanomakartan alkiota, joilla on sama käsittelijäfunktio. Listauksen 7.2 koodi muuttaa isäikkunan otsikkopalkin esittämään nykyisen päiväyksen tai ajan, kun käyttäjä muuttaa sitä päiväys/aika-kontrollissa. LISTAUS 7.2 LST7_2.CPP Kahden päiväys/aika-kontrollin yhteinen DTN_DATETIMECHANGE-ilmoitussanoman käsittely 1 Toinen sanomakartan käsittelijä lisätään manuaalisesti. 2 Riiippuen sanoman lähettäneestä kontrollista päivitetään valintaikkunan otsikkopalkki päiväys- (rivi 16) tai aikakeskeisellä päiväys/aikakontrollilla. 1 BEGIN_MESSAGE_MAP(CDtpickerDlg, CDialog) 2 //{{AFX_MSG_MAP(CDtpickerDlg) 3 ON_WM_SYSCOMMAND() 4 ON_WM_PAINT() 5 ON_WM_QUERYDRAGICON() 6 ON_NOTIFY(DTN_DATETIMECHANGE, IDC_MYDATE, OnDatetimechangeMydate) 7 //}}AFX_MSG_MAP 8 ON_NOTIFY(DTN_DATETIMECHANGE, IDC_MYTIME, OnDatetimechangeMydate) 1 9 END_MESSAGE_MAP() 10 11 void CDtpickerDlg::OnDatetimechangeMydate(NMHDR* pnmhdr, LRESULT* presult) 12 { 13 COleDateTime dtsel; 14 switch(pnmhdr->idfrom) 15 { 16 case IDC_MYDATE: 2 17 m_mydate.gettime(dtsel); 18 SetWindowText("Date:"+dtSel.Format("%#x")); 19 break; 20 case IDC_MYTIME: 21 m_mytime.gettime(dtsel); 22 SetWindowText("Time:"+dtSel.Format("%H:%M:%S")); 23 break; 24 } 25 *presult = 0; 26 } Listauksessa 7.2 rivillä 6 esitetty sanomakartan alkio on normaali ClassWizardin tekemä osa (käsittelijäfunktion lisäämisen jälkeen). Rivillä 8 esitetty alkio tulee kuitenkin lisätä manuaalisesti, jotta se voisi

Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit käyttää samaa käsittelijäfunktiota (OnDatetimechangeMydate()). OSA II LUKU 7 157 Itse OnDatetimechangeMydate()-käsittelijäfunktio on toteutettu riveillä 11 26. Valittua päiväystä/aikaa varten on määritelty COleDateTime-tyyppinen muuttuja (dtsel) rivillä 13. Rivin 14 switch-lauseessa tutkitaan, mikä kontrolli sanoman lähetti. Jos sanoma tuli IDC_MYDATE-kontrollilta, aika haetaan kontrolliin liitetyltä muuttujalta m_mydate rivillä 17 ja esitetään päiväyksenä valintaikkunan otsikkopalkissa rivillä 18. Jos sanoma tuli IDC_MYTIME-kontrollilta, aika haetaan kontrolliin liitetyltä muuttujalta m_mytime rivillä 21 ja esitetään kellonaikana valintaikkunan otsikkopalkissa rivillä 22. Lisätietoja kontrollien ID-tunnuksista ja ilmoitussanomista luvussa 4. Kuukausikalenterikontrolli Kuukausikalenterikontrollia (Month Calendar) voit käyttää myös itsenäisenä kontrollina. Tutustuit tämän kontrollin käyttöön jo päiväys/ aika-kontrollin yhteydessä se tuli esiin, kun päiväyskontrollin yhdistelmäruudun avaamisnuolta napautettiin. Kontrolli esittää kalenterin näköisen näytön, kuukausi kerrallaan, josta käyttäjä voi valita päivän tai tarvittaessa vaihtaa kuukautta ja vuotta. Tavallisesti kuukausikalenterista valitaan yksi päiväys, mutta siitä saadaan valittua myös ajanjakso. Sanomakartan alkioiden lisääminen manuaalisesti Aina, kun sanomakarttaan lisätään rivejä manuaalisesti, ne tulee sijoittaa //{{AFX_MSG_MAP -kommenttien ulkopuolelle. ClassWizard käyttää ja päivittää kommenttien välistä osaa ja sekoaa, mikäli sitä muutetaan halllitsemattomasti. Omat rivit sopivatkin parhaiten toisen //{{AFX_MSG_MAP-kommentin jälkeen, mutta ennen END_MESSAGE_MAP()-riviä. Kuukausikalenterin lisääminen valintaikkunaan Kuukausikalenteri saadaan valintaikkunaan valitsemalla Controlstyökalupaletista Month Calendar ja raahaamalla se valintaikkunaan. Kontrollin kokoa ja paikkaa voidaan sitten muuttaa tuttuun tapaan samoin kuin kontrollin ID-tunnusta kontrollin Properties-ikkunan General-sivulta (valitse kontrolli ja näppäile Alt+Enter). Stylesvälilehdeltä (kuva 7.10) voit valita seuraavat asetukset: Day States. Tämä valinta ilmoittaa, että korostettu päiväys asetetaan ohjelmastasi, muuten korostettuna esitetään järjestelmän päiväys. Multi Select. Valittuna käyttäjä voi valita kalenterista ajanjakson, muuten käyttäjä voisi valita vain yhden päivän.

158 Kuukausikalenterin tyylit Nämä tyylit vastaavat tyylilippuja MCS_DAYSTATE, MCS_MULTISELECT, MCS_NOTODAY, MCS_NOTODAYCIRCLE ja MCS_WEEKNUMBERS. Näitä lippuja tarvitaan, jos kontrolli luodaan ajon aikana jollain Create()-funktiolla eikä resurssieditorilla. KUVA 7.10 Kuukausikalenterin lisääminen valintaikkunaan resurssieditorissa. Valintaikkunat ja kontrollit Edistymis-, vieritys- ja liukupalkit sekä päiväys/aika -kontrollit No Today. Tällä valinnalla estetään kalenterista tämän päivän punaisella ympäröiminen. Week Numbers. Valitseminen esittää myös viikkojen numerot (1-53) kalenterin vasemmassa reunassa. Lisätietoja valintaikkunan ja kontrollien ominaisuuksien muokkaamisesta luvun 3 alussa. Muuttujan liittäminen kuukausikalenteriin Voit liittää muuttujan kuukausikalenteriin päiväys/aika-kontrollin tavoin. Voit liittää kontrolliin CTime tai COleDateTime muuttujan, kun valitset Add Member Variable -ikkunan Category-ruudussa Value. Jos haluat hallita paremmin kontrollia ohjelmastasi, valitse Category -yhdistelmäruutuun Control, jolloin Variable Type ruutuun asetetaan automaattisesti käsittelevän valintaikkunan luokkaan CDateTimeCtrl-tyyppinen jäsenmuuttuja.