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



Samankaltaiset tiedostot
Visual C++ -ohjelman tekeminen ja suunnittelu

Hiirisanomiin vastaaminen

Usean näkymän luominen

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

1. HARJOITUS harjoitus3_korjaus.doc

Tärkeimmät toiminnot. Kertausta ja uusia toimintoja Wordistä sekä tiedostonhallinnasta. Tärkeimmät toiminnot jatkuu...

Siirtyminen Outlook versioon

Jypelin käyttöohjeet» Ruutukentän luominen

ActiveX-kontrollien käyttö

Muuttujien määrittely

6.1 Tekstialueiden valinta eli maalaaminen (tulee tehdä ennen jokaista muokkausta ym.)

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

Google-dokumentit. Opetusteknologiakeskus Mediamylly

Valintaikkunoiden luonti ja suunnittelu

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

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

OpenOffice.org Impress 3.1.0

Sovelluksen toimintojen toteuttaminen

Sähköposti ja uutisryhmät

Sanoma Pro digikirjat ipad- ja Android- tableteilla. Kirjahyllyn toiminnot. Sisältötoiminnot. Digikirjojen rikasteet. Kirjahylly- ja luettelonäkymät

MDI-sovellusten kehittäminen

Nettiposti. Nettiposti käyttöohje

Kuva liikennemerkistä 1. Aleksanteri Numminen. ITKP101

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

Vesa Ollikainen, päivitys Juha Haataja

Written by Administrator Monday, 05 September :14 - Last Updated Thursday, 23 February :36

TYYLIT. Word Tyylit

Facebook-sivun luominen

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Tilastokeskuksen rajapintapalveluiden käyttöönotto QGISohjelmistossa

Graafisen käyttöliittymän ohjelmointi

Muita kuvankäsittelyohjelmia on mm. Paint Shop Pro, Photoshop Elements, Microsoft Office Picture Manager

Mainosankkuri.fi-palvelun käyttöohjeita

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2007

EASY Tiedostopalvelin - mobiilin käyttöopas

UpdateIT 2010: Editorin käyttöohje

Taulukot Päivi Vartiainen 1

TALLENNETAAN MUISTITIKULLE JA MUISTIKORTILLE

Ennen kuin aloitat lataamisen tarkista järjestelmävaatimukset:

OPINNÄYTETYÖ MALLIPOHJAN KÄYTTÖOHJE

TAULUKKO, KAAVIO, SMARTART-KUVIOT

KUVAN TUOMINEN, MUOKKAAMINEN, KOON MUUTTAMINEN JA TALLENTAMINEN PAINTISSA

Versio 1.1 P/N Copyright 2002, ATI Technologies Inc. Kaikki oikeudet pidätetään.

VSP webmail palvelun ka yttö öhje

5. HelloWorld-ohjelma 5.1

Dokumentit, näkymät ja kehykset

TeamViewer 11 -ohjelma etäkoulutuksissa ja tuessa

ASENNUS- JA KÄYTTÖOHJE

Harjoitustyö: virtuaalikone

Käyttäjän käsikirja. LIB 500 ja LIB 510 v Releasettelutyökalu Yleistä. ,NNXQDMRNDLOPRLWWDDHWWlNRKGHRQSlLYLWHWWlYl

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

XNA grafiikka laajennus opas. Paavo Räisänen. Tämän oppaan lähdekoodit ovat ladattavissa näiden sivujen Ladattavat osiossa.

Flash ActionScript osa 4

Esimerkkiprojekti. Mallivastauksen löydät Wroxin www-sivuilta. Kenttä Tyyppi Max.pituus Rajoitukset/Kommentit

Tekstinkäsittelyn jatkokurssi

SSH Secure Shell & SSH File Transfer

Kyläsivujen InfoWeb-ohje

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

C# Windows ohjelmointi perusopas


Web Services tietokantaohjelmoinnin perusteet

Punomo Tee itse -julkaisun tekeminen

Outlook Web App ver 1.2

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

Kuva 1. Jokaisen tavallisen kuvan tasotyökalussa näkyy vain yksi taso, tässä nimellä tausta.

BlueJ ohjelman pitäisi löytyä Development valikon alta mikroluokkien koneista. Muissa koneissa BlueJ voi löytyä esim. omana ikonina työpöydältä

Omien lomakkeiden käyttöönotto

Goalkeeper Game Statistics (v12) käyttöohjeet

Harjoitus 3: Flash-komponenttiarkkitehtuuri ( )

Käyttöohje - Sanoma Pro digikirjat verkkopalvelu v Sanoma Pro digikirjat verkkopalvelu Yleistä Laitteistovaatimukset...

Muistitikun liittäminen tietokoneeseen

Kappale 18: Teksti-editori

Ohjelmoinnin perusteet Y Python

Kirjasto Relaatiotietokannat Kevät Auvinen Annemari Niemi Anu Passoja Jonna Pulli Jari Tersa Tiina

Ohjelmoinnin perusteet Y Python

KÄYTTÖOHJE. Servia. S solutions

Vesa Ollikainen, päivitys Juha Haataja

ITKP102 Ohjelmointi 1 (6 op)

Maastotietokannan torrent-jakelun shapefile-tiedostojen purkaminen zip-arkistoista Windows-komentojonoilla

Fonttien käyttö LUKU. Tekstin esittäminen värein ja tyylein. Fonttien käyttö sovelluksen viimeistelyyn OSA IV LUKU 17.

Haaga-Helia/IltaTiko ict2tcd005: Ohjelmiston suunnittelutaito 1/7 Anne Benson. Tällä opintojaksolla käytämme VS:n kolmen kokonaisuuden luomiseen:

Japanin kirjoittaminen Japanese IME:n avulla Windows 7 -käyttöjärjestelmässä

Tekstinkäsittely 1. Peruskäyttö. Tietotekniikan perusteet Metropolia Ammattikorkeakoulu Vesa Ollikainen

GEOS 1. Ilmastodiagrammi Libre Office Calc ohjelmalla

HAAGA-HELIA ammattikorkeakoulu Ohje 1 (5) Raportin tekeminen

KEMI-TORNIONLAAKSON KOULUTUSKUNTAYHTYMÄ LAPPIA LANGATON VIERAILIJAVERKKO 2(7) VERKKOYHTEYDEN MÄÄRITTELY WINDOWS XP:LLE (WINDOWS XP SP3)

Opinnäytetyön mallipohjan ohje

Oy Oticon Ab. Korvakappale.fi. Käyttöohje

Lapin Veikot suunnistusjaosto Iltarastien tulospalveluohjeet versio Pentti Poikela

Salasanan vaihto uuteen / How to change password

Työvälineohjelmistot KSAO Liiketalous 1

Office_365_loppukäyttäjän ohje Esa Väistö

SoleMOVE lähtevän harjoittelijan ohje

9. Periytyminen Javassa 9.1

Visma Business AddOn Tuotetarrat. Käsikirja

Palvelemme arkisin klo. 08:00-17:00

2. Aloitus -välilehti, leikepöytä- ja fontti -ryhmät

CISS Base Excel raporttien määritys Käyttäjän käsikirja. CISS Base Käyttäjän Käsikirja Econocap Engineering Oy 1

Epooqin perusominaisuudet

Nspire CAS - koulutus Ohjelmiston käytön alkeet Pekka Vienonen

Transkriptio:

OSA II LUKU 5 85 5 LUKU Tekstin ja sanomien esittäminen valintaikkunoissa Tekstin muokkaaminen suorituksen aikana Tiedon tarkistaminen syötön aikana Kontrollien toiminnan laajentaminen aliluokkien avulla

86 Valintaikkunat ja kontrollit Ennen Windowsin ja graafisten käyttöliittymien keksimistä useimmat tietokoneet olivat rajoittuneet esittämään näytöllä noin 24 riviä kerrallaan ja kullakin rivillä voitiin esittää 80 merkkiä. Enimmäkseen päätteet olivat mustataustaisia ja merkit esitettiin vihreinä huonoonnisimmilla oli jopa punamerkkisiä päätteitä. Vastoin yleistä luuloa nuo kaksiväriset päätteet eivät ole kadonneet mihinkään. Syy tähän on, että suuri osa tietokoneelle syötettävästä tiedosta on yhä tekstimuotoista ja nämä vanhat sovellukset ja laitteet ovat siihen vielä täysin käyttökelpoisia. Vaikka graafisia käyttöliittymiä on olemassa, tarvitaan yhä sovelluksia näyttämään ja lukemaan pelkkää tekstiä tietokoneen käyttäjältä. Valintaruuduissa näytettävä teksti esitetään tekstikontrolleissa ja teksti syötetään tekstiruutukontrolleihin (edit box). Jos kysyt, kuinka monta sanaa yksi kuva vastaa, saat useimmiten tutun vastauksen: tuhatta. Kun näytät saman kuvan kahdelle eri ihmiselle ja pyydät heitä sanomaan miettimättä kuvasta yhden sanan, ovat vastaukset todennäköisesti erilaiset. Täsmällistä sisältöä välitettäessä kirjoitettu teksti on yhä kuitenkin paras tapa. Tällaista tietoa tarvitaankin usein valintaikkunoissa. Teksti esiintyy niissä usein selittämässä muita kontrolleja, erottamassa valintoja toisistaan tai vain tavallisena lauseena, esimerkiksi näyttämässä esimerkiksi copyright-tietoja. Tekstin muotoilu valintaikkunoissa Kun valintaikkunassa tarvitaan tavallista yksinkertaista tekstiä, käytetään tekstikontrollia (static text). Kukin kontrolli voi esittää 255 merkkiä tekstiä. Tämä esitettävä teksti syötetään kontrollin otsikoksi. Voit halutessasi jakaa tekstin usealle riville käyttämällä rivinvaihtoa (\n) ja keskittää rivit tai tasata ne oikeaan tai vasempaan reunaan. Kontrollin ympärillä voidaan esittää erityylisiä reunoja, muun muassa varjostettuna. Tekstikontrollin ja mielikuvituksen avulla valintaikkunasta saattaa saada varsin näyttävän, kuten esimerkiksi kuvassa 5.1.

OSA II LUKU 5 87 KUVA 5.1 Mountain Journey: esimerkki tekstikontrollista. Tekstikontrollin ja tekstiruutujen yhdistäminen Yleisin tekstikontrollin käyttö liittyy sen toimintaan valintaikkunassa selittämässä tekstiruutuja (edit box). Tekstiruutu on kontrolli, johon käyttäjä voi syöttää tekstiä. Tekstikontrolleja käytetään tekstiruutujen vieressä otsikoina, koska itse tekstiruuduissa ei sellaisia voi olla. Voit tehdä pikavalinnan tekstiruutuun käyttämällä sen edessä tekstikontrollia. Tämä tehdään käyttämällä tekstikontrollin tekstissä pikavalintamerkkiä (mnemonic) sopivan kirjaimen edessä. Tällöin tekstiruutu voidaan aktivoida tietyllä näppäinyhdistelmällä. Käytettävän pikavalintakirjaimen eteen merkitään &-merkki, esimerkiksi teksti Foot&ball valittaisiin b- tai B-kirjaimella. Näytettäessä tekstiä on pikavalintakirjain alleviivattu, esimerkiksi Football. Kunkin ikkunan pikavalinnoista tulee olla yksilöllinen. Haluttaessa voit tarkistaa tilanteen resurssieditorin pikavalikon Check Mnemonics komennolla. Tekstikontrolli ei voi olla syöttöaktiivinen, joten sen näppäimistöpikavalinta ohjaa syötteen sitä sarkainjärjestyksessä seuraavaan kontrolliin. Kun tekstiruutu saa syöttöfokuksen, sijoitetaan kohdistin automaattisesti ruudun alkuun tiedon syöttöä varten. Pikanäppäimien poistaminen Jos pikanäppäilyllä valittu kontrolli on pois käytöstä aktivoidaan seuraava käytössä oleva kontrolli. Tämän käyttäytymisen estämiseksi tekstikontrolli joudutaan aliluokittamaan. KATSO MYÖS Tekstiruutujen tekeminen tässä luvussa muutaman sivun päässä. Tekstikontrollien muokkaaminen ohjelmassa osoittautuvat käteviksi myös esitettäessä ilmoituksia ohjelmasta käyttäjälle. Monen käyttäjän järjestelmässä saattaisi esimerkiksi olla tilaikkuna, joka kertoisi järjestelmän sen hetkisten käyttäjien lukumäärän. Tähän tarkoitukseen tavallinen tekstiruutu sopii oikein hyvin. Luonnollisesti järjestelmän käyttäjien lukumäärä vaihtelee koko ajan, joten tekstikontrollin arvoa joudutaan muutta-

88 Valintaikkunat ja kontrollit maan ohjelman suorituksen aikana. Tässä kappaleessa teet järjestelmäikkunan, jossa esitetään tekstikontrollein tietokoneesi nimi ja käyttäjänimesi sekä muistin kokonaismäärä ja käytetyn muistin määrä. Tee siis AppWizardilla aluksi uusi valintaikkunapohjainen projekti nimeltä Sysinfo. Kun projekti on valmis, joudut lisäämään Sysinfo-valintaikkunaan kahdeksan tekstikontrollia ja yhden painikkeen. Tekstikontrollien lisääminen valintaikkunaan 1. Avaa valintaikkuna IDD_SYSINFO_DIALOG resurssieditorissa. Napauta //TODO: Place Dialog Controls Here tekstiä ja poista se Delete-näppäimellä. 2. Valitse työkaluriviltä Static text kuvake ja lisää valintaikkunan vasempaan reunaan neljä tekstikontrollia (kuva 5.2). 3. Muuta kontrollien Caption-ruutuun kuvassa 5.2 esitetty teksti. 4. Valitse työkaluriviltä Static text kontrolli ja lisää se Computer Name kontrollin oikealle puolelle. 5. Syötä ID-ruutuun nimeksi IDC_COMPUTER_NAME. 6. Valitse työkaluriviltä Static text kuvake ja lisää tekstikontrolli Total Memory kontrollin oikealle puolen. 7. Syötä tunnukseksi ID -ruutuun IDC_TOTAL_MEMORY. 8. Valitse työkaluriviltä tekstikontrolli ja lisää kontrolli Free Memory tekstin viereen. 9. Syötä kontrollin tunnukseksi IDC_FREE_MEMORY. 10. Tee vielä tekstikontrolli Memory Load tekstin viereen. 11. Anna sille tunnukseksi IDC_MEMORY_LOAD. 12. Pidä Ctrl-näppäintä painettuna ja valitse neljä juuri tekemääsi kontrollia. Poista kontrollien teksti Static Caption-ruudusta ja valitse Styles-välilehdeltä Sunken. 13. Valitse työkaluriviltä Button-kuvake ja lisää painike valintaikkunan oikeaan alakulmaan. 14. Syötä painikkeelle tunnukseksi IDC_REFRESH ja tekstiksi Caption-ruutuun Refresh. Nyt valintaikkunasi pitäisi olla kuvan 5.2 mukainen.

OSA II LUKU 5 89 KUVA 5.2 Sysinfo-valintaikkunan asettelu. Ikkunan neljä upotettua kontrollia päivitetään vastaavin tiedoin Refresh-painiketta napautettaessa. Tätä varten joudut lisäämään jokaiseen kontrolliin oman muuttujansa seuraavasti. Muuttujien lisääminen tekstikontrolleihin ClassWizardilla 1. Käynnistä ClassWizard näppäilemällä Ctrl+W tai valitsemalla View-valikosta ClassWizard. 2. Valitse Member Variables välilehti. 3. Valitse valintaikkunaluokka Class Name: yhdistelmäruudussa tässä esimerkissä CSysinfoDlg. 4. Valitse Control IDs luetteloruudusta tekstikontrollin IDtunnus, tässä IDC_COMPUTER_NAME. Napauta sitten Add Variable painiketta ja saat esiin vastaavan ikkunan. Voit toki myös lisätä kontrolliin muuttujan kaksoisnapauttamalla kontrollin ID-tunnusta ikkunassa. 5. Varmista, että Category-ruudussa on valittu Value ja Variable Type:ksi on asetettu CString. 6. Syötä muuttujan nimi Member Variable Name ruutuun tässä m_strcomputername. Napauta OK. 7. Valitse Control IDs -luettelosta IDC_TOTAL_MEMORY ja napauta Add Variable painiketta. 8. Syötä Member Variable Name ruutuun m_strtotalmemory ja napauta OK. 9. Valitse Control IDs -luettelosta IDC_FREE_MEMORY ja napauta Add Variable painiketta. 10. Syötä Member Variable Name ruutuun m_strfreememory ja napauta OK. 11. Valitse Control IDs -luettelosta IDC_MEMORY_LOAD ja napauta Add Variable painiketta. IDC_STATIC on erikoistunnus Oletuksena kaikki tekstikontrollit ( nimilaput ) saavat tunnuksen IDC_STATIC. Tällä erikoistunnuksella on arvo -1. Jos tekstikontrolliin halutaan liittää muuttuja, tämä oletustunnus joudutaan korvaamaan toisella.

90 Valintaikkunat ja kontrollit 12. Syötä Member Variable Name ruutuun m_strmemoryload ja napauta OK. 13. Napauta OK. Lisää nyt IDC_REFRESH-painikkeelle BN_CLICKED-sanomankäsittelijä. Voit katsoa lisäohjeita toimenpiteestä luvusta 4. Lopputuloksena tästä tulisi saada jäsenfunktio OnRefresh(). Jotta tämä funktio päivittäisi jokaiseen tekstikontrolliin liitettyä CString-muuttujaa, joudut vielä lisäämään listauksen 5.1 esittämän koodin. LISTAUS 5.1 LST05_1.CPP tekstikontrollin muokkaaminen ajon aikana 1 Tietokoneen nimi haetaan ja tallennetaan tekstimuuttujaan. 2 MEMORYSTATUStietorakenteessa on tiedot fyysisestä muistista ja virtuaalimuistista. 3 Muistin yksityiskohdat muotoillaan merkkijonomuuttujiin ja näytetään valintaikkunassa. 1 void CSysinfoDlg::OnRefresh() 2 { 3 // TODO: Add your control notification handler code // here 4 // ** Variables used for getting the computer name 5 TCHAR szbuffer[256]; 6 DWORD dwsize = 256; 7 8 // ** Retrieve the computer name from Windows 9 GetComputerName(szBuffer, &dwsize); 1 10 11 // ** Transfer the computer name to the 12 // ** appropriate variable 13 m_strcomputername = szbuffer; 14 15 // ** Allocate structure to receive memory data 16 MEMORYSTATUS mem_stat; 2 17 18 // ** Retrieve the current memory status from Windows 19 GlobalMemoryStatus(&mem_stat); 20 21 // ** Transfer the memory details to the appropriate 22 // ** member variable 23 m_strtotalmemory.format("%ld KB", 24 mem_stat.dwtotalphys / 1024); 3 25 m_strfreememory.format("%ld KB", 26 mem_stat.dwavailphys / 1024); 27 m_strmemoryload.format("%d %%", 28 mem_stat.dwmemoryload); 29 30 // ** Update the contents of controls to display 31 UpdateData(FALSE); 32 }

OSA II LUKU 5 91 Riveillä 5 ja 6 määritellään kaksi paikallista muuttujaa, jotka välitetään globaalille GetComputerName()-funktiolle rivillä 9. Tämän funktion käyttämät parametrit ovat merkkipuskuri, jonka funktio täyttää tietokoneen nimellä, sekä DWORD-tyyppisen muuttujan, jossa on merkkipuskurin enimmäispituus, osoite. Merkkitaulukkomuuttuja määritellään TCHAR-makrolla (rivi 5), jolla muuttuja saadaan yhteensopivaksi sekä ANSI- että Unicode-merkistöön. Unicodestandardimerkistö käyttää yhden merkin tallettamiseen kahta tavua, millä siinä saadaan käyttöön erilaiset kansainväliset kirjoitusjärjestelmät. Rivillä 13 merkkitaulukon sisältö siirretään m_strcomputernamemuuttujaan, joka on IDC_COMPUTER_NAME-kontrolliin liitetty muuttuja. Rivillä 16 mem_stat-muuttuja määritellään MEMORYSTATUStietorakenteena. Tämän tietorakenteen jäsenet on esitetty listauksessa 5.2. Rivillä 19 mem_stat-tietorakenteen osoite syötetään globaalille GlobalMemoryStatus()-funktiolle, joka täyttää struktuurin jäsenet muistin tilaa vastaavilla arvoilla. Riveillä 23, 25 ja 27 luetaan tietoa mem_stat-struktuurin jäsenistä CString::Format()-funktiolla ja talletetaan CString-tyyppisiin muistitietoihin liittyvien tekstikontrollien muuttujiin. Funktiolle UpdateData() syötetään FALSE rivillä 31, jotta neljän tekstikontrollin näytöt päivitettäisiin. Kun olet koostanut projektisi ja käynnistät Sysinfo-ohjelman, tulisi muistitietojen päivittyä Refresh-painikkeen napautuksella. Avaa ja sulje kokeeksi muutamia muita sovelluksia ja napauta välillä Refreshpainiketta. Valintaikkunan tulisi muistuttaa kuvan 5.3 ikkunaa. Saatat hämmästellä, miksei Memory Load -arvo (käytetyn muistin määrä prosentteina koko muistista) kasva. Syy tähän on, että lukuun lasketaan mukaan myös virtuaalimuisti (tiedosto, jota käytetään muistina). LISTAUS 5.2 LST05_2.CPP MEMORYSTATUS-tietorakenne Hyödyllisiä järjestelmäfunktioita GetComputerName()-funktion lisäksi voit myös selvittää ohjelman käyttäjän GetUserName()-funktiolla ja käytöjärjestelmäversion GetVersionEx()-funktiolla. Virtuaalimuisti Jotta Windows-ohjelmat saisivat käyttöönsä muistia enemmän kuin sitä on koneeseen asennettu, osa kovalevystä käyttäytyy muistin tavoin. Tätä muistia kutsutaan virtuaalimuistiksi. 1 typedef struct _MEMORYSTATUS { 2 DWORD dwlength; 3 DWORD dwmemoryload; 4 DWORD dwtotalphys; 5 DWORD dwavailphys; 6 7 DWORD dwavailpagefile; 8 DWORD dwtitalvirtual; 9 DWORD dwavailvirtual; 10 } MEMORYSTATUS;

92 Valintaikkunat ja kontrollit KUVA 5.3 Esimerkki järjestelmätietojen näytöstä Sysinfo-ohjelmalla. KATSO MYÖS Lisätietoja valintaikkunasovelluksen luomisesta luvun 3 alusta. Valintaikkunoiden asettelu luvussa 3. Käsittelijäfunktion lisääminen luvun 4 alussa. Yksirivisen tekstiruudun rajoitukset Yksirivisten tekstiruutujen koko on rajattu 32 kilotavuun eli runsaaseen 32 000 merkkiin. Tekstiruudut Oletko koskaan miettinyt, kuinka monta merkkiä syötetään tietokoneohjelmiin päivittäin ympäri maailman esimerkiksi pankkitoiminnassa, tilaustietoina tai kirjanpidossa. Olipa lukumäärä mikä tahansa, Windows-sovelluksissa ne syötetään useimmiten tekstiruudun (edit box) kautta. Tekstiruutuja käytetään sekä lukemaan tekstimuotoista syötettä että näyttämän tekstiä. Siihen voidaan syöttää kirjaimia, numeroita ja näppäimistöstä löytyviä yleisimpiä erikoismerkkejä. Tekstiä voidaan jopa hieman muokata tekstiruudussa. Esimerkiksi teksti tai sen osa voidaan valita hiirellä tai näppäimistöllä ja kopioida tai leikata toiseen tekstiruutuun. Tekstiruudun pikavalikko saadaan esiin hiiren oikealla painikkeella ja siitä löytyvät komennot Undo, Cut, Copy, Paste, Delete ja Select All (kumoa, leikkaa, kopioi, liitä, tyhjennä, valitse kaikki). Tekstiruutu voidaan esittää usean tyylisenä. Password-tyyli piilottaa käyttäjän syötteen, yleensä korvaamalla kaikki merkit tähdellä (*). Uppercase- ja Lowercase-tyylit muuttavat tekstin jo kirjoitettaessa isoiksi tai pieniksi kirjaimiksi. Number-tyyli estää muiden kuin numeroiden syötön, myös pisteen ja desimaalipilkun. Seuraavassa kappaleessa käsitellään tekstiruutujen hyötykäyttöä, mutta aluksi saat tehdä uuden projektin. Tee AppWizardilla valintaikkunapohjainen projekti nimeltään Edits. Nyt sinulla pitäisi olla uusi projekti avattuna Developer Studiossa. KATSO MYÖS Valintaikkunaprojektin luominen luvusta 3.

Tekstiruutujen lisääminen Muiden kontrollien tavoin myös tekstiruudut voidaan lisätä resurssieditorin työkaluriviä käyttäen. Seuraavat vaiheet johdattavat kuvan 5.4 mukaisen valintaikkunan luomiseen. OSA II LUKU 5 93 Tekstiruutujen lisääminen valintaikkunaan 1. Avaa valintaikkuna IDD_EDITS_DIALOG resurssieditorissa. Napauta TODO: Place Dialog Controls Here tekstiä ja poista se Delete-näppäimellä. 2. Valitse työkaluriviltä Static text ja lisää se valintaikkunan vasempaan reunaan (kts. kuva 5.4). 3. Varmista, että tekstikontrolli on valittuna ja avaa pikavalikko hiiren oikealla näppäimellä. Valitse Properties-komento ja saat esiin Text Properties ikkunan. Saat Properties-ikkunan pysymään esillä koko ajan napauttamalla ikkunan vasemmassa yläkulmassa olevaa nastakuvaketta. 4. Syötä tekstiksi &First Caption-ruutuun. 5. Valitse työkaluriviltä Edit box ja lisää tekstiruutu First-tekstin oikealle puolen. 6. Anna kontrollin tunnukseksi IDC_EDIT_FIRST ID-ruutuun. 7. Valitse työkaluriviltä Button ja lisää se tekstiruudun oikealle puolen. 8. Syötä painikkeen ID-tunnukseksi IDC_GET_TEXT ja tekstiksi Caption-ruutuun Get Text. 9. Valitse työkaluriviltä Static text ja lisää tekstikontrolli Firsttekstin alle. 10. Syötä tekstikontrollin tekstiksi &Second. 11. Valitse työkaluriviltä Edit box ja sijoita tekstiruutu Secondtekstin oikealle puolen. 12. Valitse työkaluriviltä Edit box ja sijoita se juuri lisäämäsi tekstiruudun oikealle puolen. 13. Anna tälle ID-tunnukseksi IDC_EDIT_SHOW ja valitse Stylesvälilehdeltä Read-only. 14. Venytä kontrolliasi hieman pidemmäksi ja valintaikkunasi alkaa muistuttaa kuvan 5.4 ikkunaa.

94 Valintaikkunat ja kontrollit KUVA 5.4 Edits-valintaikkunan asettelu. Tekstiruutujen pikavalinnat Kun tekstiruutuja pikavalitaan näppäimistöltä, niiden jälkeen tulee olla sarkainjärjestyksessä vastaava tekstikontrolli. Edits-valintaikkunasta näkyy, kuinka näppäinlyhenteitä käytetään pikavalintoina tekstiruutuihin. Voit kokeilla ikkunan toimintaa näppäilemällä Ctrl+T tai valitsemalla Layout-valikosta Test. Kokeillessasi ikkunan toimintaa Alt+F-näppäilyn tulisi aktivoida Firsttekstikontrolli ja Alt+S-näppäilyn Second -kontrolli. KATSO MYÖS Valintaikkunasovellusten luominen luvusta 1. Tekstiruudun lukeminen ja siihen kirjoittaminen Usein käytettäessä tekstiruutuja valintaikkunoissa niihin kirjoitettua tekstiä käytetään vasta, kun esimerkiksi OK-painiketta napautetaan. Tässä vaiheessa teksti luetaan kontrollista edelleen talletettavaksi johonkin ohjelman muuttujaan tai vaikkapa tietokantaan. Voit liittää tekstiruutuun CString-muuttujan ClassWizardin avulla. Tämä ohjattu toiminto luo tarpeelliset muuttujan määrittelyt sekä liittää koodiin tiedonsiirrosta huolehtivat makrot ja näin pääset helposti lukemaan ja kirjoittamaan tekstiruudun tietoja. CString-muuttujan liittäminen tekstiruutuun ClassWizardilla 1. Käynnistä ClassWizard näppäilemällä Ctrl+W ja valitsemalla View-valikosta ClassWizard. 2. Valitse Member Variables välilehti. 3. Valitse valintaikkunaluokka Class Name -yhdistelmäruutuun tässä CEditsDlg. 4. Valitse kontrollin ID-tunnukseksi Control IDs luetteloruudussa IDC_EDITS_FIRST. 5. Napauta Add Variable painiketta ja saat esiin vastaavan ikkunan. Voit tietysti lisätä jäsenmuuttujan kontrolliin vain kaksoisnapauttamalla sen ID-tunnusta.

6. Varmista, että Category-ruudussa on valittuna Value ja muuttujan tyyppinä Variable Type ruudussa CString. 7. Syötä muuttujan nimeksi Member Variable Name ruutuun m_strfirst ja napauta OK. 8. Anna merkkijonon pituudeksi Maximum Characters ruutuun ClassWizard-ikkunan alaosassa 15. Tätä pidempiä tekstejä ei tekstiruutu hyväksy. 9. Napauta lopuksi OK. OSA II LUKU 5 95 Kun kontrollit nyt ovat valmiit, tulee GetText-painikkeen napautuksen käydä lukemassa teksti First-tekstiruudusta, vaihtaa kirjainten järjestys ja tulostaa saatu teksti takaisin kontrolliin. Tätä varten tarvitsemme BN_CLICKED-tapahtumankäsittelijän IDC_GET_TEXT painikkeelle. Saat apua käsittelijän lisäämisestä luvusta 4. Nyt käytössäsi pitäisi olla jäsenfunktio OnGetText(). Muokkaa funktio listauksen 5.3 mukaiseksi. LISTAUS 5.3 LST05_3.CPP tekstiruudun lukeminen ja siihen kirjoittaminen 1 void CEditsDlg::OnGetText() 2 { 3 // TODO: Add your control notification handler code here 4 // ** Exchange data from control to variable 5 UpdateData(); 6 7 // ** Check if any text has been entered 8 if (m_strfirst.isempty() == FALSE) 1 9 { 10 // ** Display the entered text 11 MessageBox(m_strFirst); 12 13 // ** Reverse the characters in the variable 14 m_strfirst.makereverse(); 2 15 16 // ** Exchange data from the variable to 17 // ** the control 18 UpdateData(FALSE); 3 19 } 20 } 1 Varmistetaan, ettei merkkijono ole tyhjä. 2 Merkkien järjestys tekstimuuttujassa käännetään. 3 Käänteinen teksti esitetään sanomaruudussa.

96 Valintaikkunat ja kontrollit Rivillä 5 kutsuttu UpdateData()-funktio käyttää oletusparametriä TRUE, mikä siirtää tekstin kontrollista muuttujaan m_strfirst. Rivillä 8 CString-luokan funktio IsEmpty() palauttaa arvon FALSE, kun m_strfirst muuttujassa on tekstiä. Kirjainten järjestys vaihdetaan päinvastaiseksi rivillä 13 funktiolla MakeReverse() ja funktiota UpdateData() kutsutaan uudelleen; tässä tapauksessa parametri FALSE siirtää muuttujan sisällön takaisin tekstikontrollin. Muokkaustietosanomien huomioiminen Tähän mennessä olemme käsitelleen tekstiruutua, jossa oleva tieto luetaan, kun se on syötetty kokonaisuudessaan. Jos käsittelet tekstiruudun kirjoituksen aikana lähettämiä sanomia, voit hakea tekstiä jo ennen sen valmistumista. Windows lähettää tekstiruuduista kahdeksan erilaista ilmoitusluonteista sanomaa (edit notification message). Nämä on esitetty taulukossa 5.1. Esimerkiksi EN_CHANGE sanoma lähetetään, kun kontrollin teksti muuttuu. TAULUKKO 5.1 Tekstiruudun lähettämät sanomat Sanoma EN_CHANGE EN_UPDATE EN_SETFOCUS EN_KILLFOCUS EN_MAXTEXT EN_HSCROLL EN_VSCROLL EN_ERRSPACE Kuvaus Lähetetään ilmoittamaan, että teksti on muuttunut sen näyttämisen jälkeen. Teksti on muuttunut ennen näyttämistä. Kontrolli on saanut näppäimistöfokuksen. Kontrolli ei ole enää syötön kohteena Syötetty teksti oli pidempi kuin sallittu ja sitä on lyhennetty. Monirivisen tekstiruudun vaakavierityspalkkia on napautettu. Monirivisen tekstiruudun pystyvierityspalkkia on napautettu. Kontrolli ei onnistunut varaamaan muistia. Seuraavaksi tulet tekemään sanomankäsittelijän Second-tekstiruudun EN_CHANGE-sanomalle. Käsittelijäfunktiossa haetaan juuri muokattu teksti ja kopioidaan se kirjoitussuojattuun tekstiruutuun. Tämä saa aikaa vaikutelman, että tekstiä kirjoitetaan yhtä aikaa kahteen paikkaan. Lisäät sanomankäsittelijän ClassWizardilla. Tähän asti olemme lisänneet sanomankäsittelijät New Windows Message and Event Handlers ikkunassa, mutta hyvien ohjelmien tavoin Developer Studiokin tarjoaa monta eri tapaa suorittaa sama tehtävä. ClassWizard saattaa olla tehtävään helppokäyttöisempi, koska

sitä voi käyttää muuhunkin kuin sanomien käsittelemiseen ja lisäksi selviät vielä ilman valintaikkunamallin avaamista. OSA II LUKU 5 97 Sanomankäsittelijän luominen ClassWizardilla 1. Käynnistä ClassWizard näppäilemällä Ctrl+W tai valitsemalla View-valikosta ClassWizard. 2. Valitse Message Maps välilehti. 3. Valitse valintaikkunaluokaksi Class Name yhdistelmäruudusta CEditsDlg. 4. Valitse kontrollin tunnukseksi Object IDs luetteloruudusta IDC_EDITS_SECOND. 5. Valitse käsiteltäväksi sanomaksi Messages-luetteloruudusta EN_CHANGE. 6. Napauta Add Function painiketta. 7. Napauta OK-painiketta Add Member Function ikkunassa, joka näyttää uudeksi lisätyksi funktioksi OnChangeEditSecond. Tässä vaiheessa ClassWizard-ikkunan pitäisi olla kuvan 5.5 mukainen. 8. Napauta Edit Code painiketta ja pääset muokkaamaan juuri tekemääsi funktiota. KUVA 5.5 ClassWizard-ikkuna EN_CHANGE-käsittelijän lisäämisen jälkeen.

98 Valintaikkunat ja kontrollit LISTAUS 5.4 LST05_4.CPP EN_CHANGE-ilmoitussanoman käsitteleminen 1 Asetetaan kullekin kontrollille osoitin. 2 Luetaan ensimmäisen tekstiruudun sisältö merkkijonomuuttujaan. 3 Asetetaan toisen tekstiruudun sisältö samaksi kuin ensimmäinen. 1 void CEditsDlg::OnChangeEditSecond() 2 { 3 // TODO: If this is a RICHEDIT control, 4 // the control will not send this notification 5 // unless you override the CDialog::OnInitDialog() 6 // function to send the EM_SETEVENTMASK message 7 // to the control with the ENM_CHANGE flag ORed 8 // into the lparam mask. 9 10 // TODO: Add your control notification handler code here 11 12 // ** Get a pointer to each of the edit controls 13 CEdit* pedit = (CEdit*)GetDlgItem(IDC_EDIT_SECOND);1 14 CEdit* peditshow = (CEdit*)GetDlgItem(IDC_EDIT_SHOW); 15 16 // ** Declare a local varaible to hold the entered text 17 CString strtext; 18 19 // ** Retrieve the text from the "Second" edit box 20 pedit->getwindowtext(strtext); 2 21 22 // ** Update the context of the read-only edit box 23 peditshow->setwindowtext(strtext); 3 24 } Huomaa, että ClassWizard on lisännyt koodissa funktion alkuun ylimääräisiä kommentteja rich edit text kontrollien varalta. Koska emme nyt käytä tällaista kontrollia, voimme olla välittämättä kommenteista. Riveillä 13 ja 14 kutsutaan GetDlgItem()-funktiota hakemaan jokaiselle käsiteltävälle tekstiruudulle oma osoittimensa. Kaikki nämä osoittimet muutetaan CEdit-tyyppisiksi. MFC-kirjaston CEdit-luokka sisältää kaikki tekstiruudun toiminnat. Muiden kontrollien tavoin CEdit periytyy CWnd-luokasta lisäten kantaluokkaansa huomattavan määrän toimintoja. Taulukossa 5.2 on esitetty näistä hyödyllisimpiä. Rivillä 20 kutsuttu GetWindowText() hakee tekstiruudun sillä hetkellä sisältämän tekstin ja päivittää sillä paikallista strtextmuuttujaa. Tämän jälkeen muuttujasta kopioidaan teksti kirjoitussuojattuun tekstiruutuun (rivillä 23). Koosta ja suorita ohjelmasi. Kun nyt kirjoitat tekstiä Second-ruutuun,

pitäisi saman tekstin ilmestyä sen oikealla puolen olevaan ruutuun. Kokeilemalla huomaat, että napauttaessasi tuota kirjoitussuojattua tekstiruutua saat kyllä tekstikohdistimen esiin, mutta tekstin syöttäminen ruutuun ei onnistu. Voit muuttaa tätä käyttäytymistä lisäämällä IDC_EDIT_SHOW kontrollille EN_SETFOCUS-sanoman käsittelijän. Lisää sanomankäsittelijä juuri mainitulla tavalla ClassWizardilla ja lisää seuraava rivi sillä luomaasi OnSetFocusEditShow()-funktioon: GetDlgItem(IDC_EDIT_SECOND)->SetFocus(); Koosta ohjelma ja aja se. Nyt kirjoitussuojattua tekstiruutua napautettaessa tekstikohdistin ilmestyykin Second-ruutuun. TAULUKKO 5.2 CEdit-luokan jäsenfunktiot OSA II LUKU 5 99 Funktion nimi Create() GetSel() SetSel() ReplaceSel() LimitText() Kuvaus Luo tekstikontrollin ohjelman ajon aikana. Hakee valittuna olevan tekstin alku- ja loppupaikan. Valitsee osan tekstistä. Korvaa valitun tekstin toisella. Asettaa tekstin enimmäispituuden. KATSO MYÖS Käsittelijäfunktioiden lisääminen luvun 4 alusta Kontrollin tiedonvaihto ja syötetyn tiedon tarkistaminen luvusta 10 Lisätietoja CWnd-luokasta luvun 4 alussa Tekstiruutukontrollin aliluokat Usein syötettävä teksti on oltava ennalta määrätyssä muodossa. Esimerkiksi postinumerot ovat toisissa maissa numeroita ja toisissa niissä saattaa olla myös kirjaimia. Tällaista syötettä lukevan Windowssovelluksen tulee tarkistaa syöte tällöin halutun syötteen sääntöjen mukaan. Tarkistaminen on parasta tehdä jo tekstiä syötettäessä. Sitä varten joudumme laajentamaan tekstiruudun toimintaa tekemällä oman CEdit-luokan alliluokan. Aliluokan tekeminen (subclassing) tarkoittaa uuden luokan tekemistä perimällä olemassa olevasta luokasta sen jäsenmuuttujat ja funktiot. Näin uusi luokka voi hyödyntää kantaluokkansa toimintoja ja tarvittaessa toimintoja voidaan korvata toisilla. Mitä on aliluokittaminen Aliluokka on olemassa olevasta luokasta johdettu luokka, joka perii kantaluokan jäsenmuuttujat ja -funktiot.

100 Valintaikkunat ja kontrollit Tässä kappaleessa kehität uuden CEdit-luokasta perityn luokan nimeltä CInitials. Tässä luokassa käyttäjä pakotetaan syöttämään nimikirjaimensa määrätyllä tavalla. Esimerkiksi vain kirjaimet tullaan sallimaan ja nekin muutetaan isoiksi automaattisesti. Luokkaan kuuluu lisäksi pisteen lisääminen jokaisen kirjaimen jälkeen sekä niiden poistaminen, mikäli kirjaimia poistetaan. Aluksi tarvitset kuitenkin lisää tekstiruutuja ikkunaasi. Ylimääräisten tekstiruutujen lisääminen Editsvalintaikkunaan 1. Avaa IDD_EDITS_DIALOG resurssieditorissa. 2. Valitse työkalurivistä tekstikontrolli (Static text) ja lisää se ikkunan vasempaan alanurkkaan (kuva 5.6). 3. Syötä tekstiksi Caption-ruutuun Initials. 4. Valitse työkaluriviltä tekstiruutu (edit box) ja lisää se Initialstekstikontrollin oikealle puolen. 5. Syötä tekstiruudun ID-tunnukseksi IDC_EDIT_INITIALS. 6. Valitse tekstikontrolli työkaluriviltä ja lisää se juuri tekemäsi tekstiruudun oikealle puolen (kts. kuva 5.6). 7. Syötä Caption-ruutuun Surname. 8. Valitse työkaluriviltä tekstiruutu ja lisää se Surname-tekstin oikealle puolen. 9. Venytä tekstiruutua ikkunan oikeaan reunaan saakka. Nyt valintaikkunasi tulisi näyttää kuvan 5.6 mukaiselta. KUVA 5.6 Paranneltu Edits-valintaikkuna. Lisättyäsi tekstiruudut luo CInitials-luokka. Näiden vaiheiden aikana tulet huomaamaan, että ClassWizardilla voidaan tehdä aliluokkia monista muistakin MFC-kirjaston luokista kuin vain CEditluokasta.

Uuden aliluokan tekeminen ClassWizardilla 1. Käynnistä ClassWizard näppäilemällä Ctrl+W tai valitsemalla View-valikosta ClassWizard. 2. Valitse Message Maps-välilehti. 3. Valitse Class name yhdistelmäruudusta CEditsDlg. 4. Napauta Add Class painiketta ja valitse saamastasi valikosta New. Saat esiin kuvan 5.7 esittämän New Class ikkunan. OSA II LUKU 5 101 KUVA 5.7 New Class valintaikkuna. 5. Syötä luokan nimeksi Name-ruutuun CInitials. 6. Valitse Base Class yhdistelmäruudussa kantaluokaksi CEdit. 7. Luo uusi luokka napauttamalla OK. 8. Valitse luokka CEditDlg Class Name yhdistelmäruudussa. 9. Valitse Object IDs luettelosta IDC_EDIT_INITIALS. 10. Napauta Add Variable painiketta ja saat esiin vastaavan ikkunan. 11. Syötä uuden jäsenmuuttujan nimeksi Member Variable Name - ruutuun m_edtinitials. 12. Valitse Category-yhdistelmäruutuun Control. 13. Valitse Variable Type yhdistelmäruudussa CInitials. Ikkunan alaosan tekstinä tulisi tällöin lukea Map to CInitials Member (User-Defined-Class). 14. Lisää uusi jäsenmuuttuja napauttamalla OK. Saat vielä ilmoituksen, jossa kerrotaan #include määritteen lisäämisen tarpeellisuudesta. Napauta OK.

102 Valintaikkunat ja kontrollit 15. Sulje ClassWizard napauttamalla vielä OK. Nyt uuden CInitials-luokan tulisi olla näkyvissä ClassView-sivulla. Aluksi joudut lisäämään ClassWizardin pyytämän #include-rivin. Kaksoisnapauta siis CEditsDlg-luokkaa ClassView-sivulla ja saat esiin CEditsDlg-luokan otsikkotiedoston editoriin. Lisää tähän tiedostoon yksi rivi ennen luokan määrittelyä. Valmiin tiedoston tulisi näyttää tältä: #include Initials.h class CEditsDlg : public CDialog { Kun ClassWizard teki puolestasi uuden luokan, se teki samalla kaksi uutta tiedostoa ja lisäsi ne mukaan projektiin: Initials.h ja Initials.cpp. EditsDlg.h tiedostossa tarvitaan #include-rivi, koska CEditsDlgluokkaan kuuluu nyt Initials.h tiedostossa määritelty CInitialstyyppinen jäsenmuuttuja. Ilman #include-rivin käyttöä saisit virheilmoituksen kääntäjältä. Nyt CInitials-luokkaa voidaan käyttää henkilön nimen alkukirjaimien lukemiseen. Ensimmäinen tehtävä tässä toimessa on hylätä kaikki aakkosiin kuulumattomat merkit, muuttaa pienet kirjaimet isoiksi sekä lisätä piste jokaisen kirjaimen jälkeen. Tämä kaikki voidaan tehdä lisäämällä käsittelijäfunktio WM_CHAR-sanomalle. Windows lähettää sovellukselle WM_CHAR-sanoman, kun tekstiruudun ollessa aktiivisena painetaan jotain näppäimistön näppäintä. Toisin kuin EN_CHANGE-ilmoitussanoma, WM_CHAR saa näppäillyn merkin jo ennen sen näyttämistä, joten tämä on mitä sopivin hetki tarkistaa näppäilty syöte. Jos merkki kelpaa, se välitetään edelleen tekstiruudulle. Muuten sitä ei huomioida. Aliluokan sanomankäsittelijäfunktion luominen ClassWizardilla 1. Käynnistä ClassWizard näppäilemällä Ctrl+W tai valitsemalla View-valikosta ClassWizard. 2. Valitse Message Maps-välilehti. 3. Valitse Class Name yhdistelmäruudusta CInitials. 4. Valitse Messages-luettelosta WM_CHAR. 5. Napauta Add Function painiketta. ClassWizard-ikkunan alaosan Member Functions luetteloon ilmestyy OnCharfunktio.

OSA II LUKU 5 103 6. Napauta Edit Code painiketta. Nyt käytössäsi on CInitials-luokassa OnChar()-jäsenfunktio. Tätä funktiota kutsutaan, kun Initials-tekstiruutuun kirjoitetaan merkkejä. Muuttujassa nchar on syötetyn merkin numeerinen arvo. Muuttujilla nrepcnt ja nflags ei ole merkitystä tässä esimerkissä. Lisää listauksen 5.5 esittämä koodi. LISTAUS 5.5 LST05_5.CPP OnChar-käsittelijäfunktio 1 void CInitials::OnChar(UINT nchar, UINT nrepcnt, UINT nflags) 2 { 3 // TODO: Add your message handler code here and/or call default 4 // ** Validate the entered character is alphabetic 5 if( isalpha(nchar) ) 1 6 { 7 // ** Convert lower case letters to upper case 8 if( islower(nchar) ) 2 9 nchar -= 32; 10 11 // ** Call the default windows procedure as the 12 // ** nchar argument may have been overriden 13 DefWindowProc(WM_CHAR, nchar, 14 MAKELONG(nRepCnt, nflags)); 3 15 16 // ** Call the default windows procedure again to 17 // ** add the period 18 nchar = '.'; 19 DefWindowProc(WM_CHAR, nchar, 20 MAKELONG(nRepCnt, nflags)); 21 } 22 // ** If the backspace key is pressed call the 23 // ** base class function twice to remove the period 24 // **and the letter 25 if( nchar == VK_BACK ) 4 26 { 27 CEdit::OnChar(nChar, nrepcnt, nflags); 28 CEdit::OnChar(nChar, nrepcnt, nflags); 29 } 30 } 1 Tarkistetaan, että syötetty merkki on kirjain. 2 Muutetaan pienet kirjaimet isoiksi. 3 Kutsutaan oletusikkunafunktiota syötetyn merkin tavalliseen käsittelyyn. Merkki muutetaan pisteeksi ja oletusproseduuria kutsutaan uudelleen. 4 Muutetaan korjausnäppäimen painallus kahdeksi korjaukseksi. Rivin 5 if-lauseessa tarkistetaan, kuuluuko nchar-argumentissa funktiolle välitetty merkki aakkosiin. Rivillä 8 tarkistetaan, onko kyseessä pieni kirjain. Jos on, se muutetaan isoksi vähentämällä merkin numeerisesta arvosta 32 (ANSI-merkistössä se on pienten ja vastaavien isojen kirjaimien välinen ero). Rivillä 13 kutsutaan DefWindowProc()-funktiota (ikkunan oletuskäsittelijää). Tämän funktion käyttö kantaluokan CEdit::OnChar()- funktion sijaan on välttämätöntä, koska jälkimmäinen ei huomaisi

104 Valintaikkunat ja kontrollit nchar-argumenttiin tehtyjä muutoksia. Jos luet funktion CWnd::OnChar() sähköisen ohjesivun, löydät merkinnän siitä, että funktio käyttää sanoman alkuperäisiä parametrejä eikä sille välitettyjä. Rivillä 18 nchar-argumentin arvo korvataan pisteellä ja tämä lähetetään tekstiruudulle jälleen kutsumalla DefWndProc()-funktiota. Poistonäppäimen painallus tutkitaan rivillä 25. Tämän näppäimen virtuaalinäppäinkoodi on symboliselta nimeltään VK_BACK. Kaikilla näppäimillä on omat virtuaalinäppäinkoodinsa, joista on esimerkkejä taulukossa 5.3. Jos poistonäppäintä painetaan, kutsutaan kantaluokan CEdit::OnChar()-funktiota kaksi kertaa, jotta kirjaimen lisäksi saataisiin poistettua myös piste. Koosta ohjelmasi ja aja se. Testaa CInitials-luokan toiminta. TAULUKKO 5.3 Virtuaalinäppäinkoodeja Koodi VK_BACK VK_TAB VK_LEFT VK_RIGHT VK_RETURN VK_ESCAPE VK_CONTROL Näppäin Poistonäppäin (backspace) Sarkain Nuoli vasemmalle Nuoli oikealle Enter-näppäin Esc-näppäin Ctrl-näppäin Moniriviset tekstiruudut Tekstiruutujen ei välttämättä tarvitse olla yksirivisiä. Jos haluat tehdä monirivisen tekstiruudun, riittää, että teet tekstiruudusta hieman korkeamman resurssieditorissa ja valitset sille tyylin Multiline. Luultavasti tarvitset myös Want Return valintaa tällöin tekstiruudussa näppäilty rivinvaihto siirtyy seuraavalle riville tekstiruudussa eikä sulje koko ikkunaa. Moniriviset tekstiruudut osaavat vierittää tekstiä pystysuunnassa ja niihin lisätään tarvittaessa vierityspalkit automaattisesti, mikäli teksti ei mahdu sille varattuun ruutuun. Onneksi moniriviset tekstiruudut muistuttavat monella tavoin

OSA II LUKU 5 105 yksirivisiä. Voit käyttää myös tällöin CEdit-luokkaa, jossa on muutamia vain monirivisiin toimintoihin tarkoitettuja funktioita (taulukko 5.4). TAULUKKO 5.4 CEdit-luokan monirivisiin toimintoihin tarkoitettuja funktiota Monirivisen tekstiruudun rajoitukset Monirivisten tekstiruutujen koko on rajoitettu 64 kilotavuun eli runsaaseen 64 000 merkkiin. Funktion nimi GetLineCount() GetLine() FmtLines() SetTabStops() Kuvaus Palauttaa rivien lukumäärän. Hakee tekstirivin. Asettaa ja poistaa rivivaihtoja. Sallii sarkainten käytön. Lopuksi on vielä mainittava monipuolisin tekstiruutu nimeltä rich edit kontrolli. Tässä tekstiruudussa voidaan merkkejä ja kappaleita myös muotoilla. Rich edit kontrolleja käytetään harvoin valintaikkunoissa, sen sijaan ne sopivan käytettäviksi varsinaisen sovelluksen näkymissä. Tästä syystä niitä ei käsitellä vielä tässä vaiheessa. KATSO MYÖS Rich Edit kontrolli luvussa 19.

106 Valintaikkunat ja kontrollit