Näkymien vierittäminen ja koon muuttaminen

Samankaltaiset tiedostot
Usean näkymän luominen

Hiirisanomiin vastaaminen

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

MDI-sovellusten kehittäminen

Visual C++ -ohjelman tekeminen ja suunnittelu

Jypelin käyttöohjeet» Ruutukentän luominen

Kynien ja siveltimien käyttö

Piirtopinnalle piirtäminen

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

OpenOffice.org Impress 3.1.0

ActiveX-kontrollien käyttö

Tulostaminen ja esikatselu

LIITE 1 1. Tehtävänä on mallintaa kitara ohjeiden mukaan käyttäen Edit Poly-tekniikkaa.

Valintaikkunoiden luonti ja suunnittelu

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

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

Valintanauhan komennot Valintanauhan kussakin välilehdessä on ryhmiä ja kussakin ryhmässä on toisiinsa liittyviä komentoja.

HELIA 1 (1) Outi Virkki Käyttöliittymät ja ohjelmiston suunnittelu :04

Taulukot Päivi Vartiainen 1

Dokumentit, näkymät ja kehykset

TAULUKKO, KAAVIO, SMARTART-KUVIOT

TIETOKONEEN ASETUKSILLA PARANNAT KÄYTETTÄVYYTTÄ

GeoGebra-harjoituksia malu-opettajille

Muuttujien määrittely

Ohjelmoinnin perusteet Y Python

TAULUKOINTI. Word Taulukot

Avaa ohjelma ja tarvittaessa Tiedosto -> Uusi kilpailutiedosto

Mukavia kokeiluja ClassPad 330 -laskimella

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

Tilastokeskuksen rajapintapalveluiden käyttöönotto ArcGISohjelmistossa

Käsiteltävät asiat LIITE 3 1. Tehtävänä on mallintaa lipputanko ja siihen lippu ohjeiden mukaan. Cloth. Wind Garment Maker

Käyttöliittymän muokkaus

Käyttöopas RoofCon Viewer

Ohje internetkarttapalveluun

FrontPage Näkymät

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

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

Adobe Photoshop Elements, kuvakäsittelyn perusteet

Posterin teko MS Publisherilla

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

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

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

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

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

Sovelluksen toimintojen toteuttaminen

Outlook Web App ver 1.2

Racket ohjelmointia II. Tiina Partanen 2015

Ohjelmoinnin perusteet Y Python

KESKUSTANUORTEN NETTISIVUT- OHJEITA PIIRIYLLÄPITÄJÄLLE 1. KIRJAUTUMINEN

Johdanto: Jaetut näytöt Jaetun näytön asetukset ja näytöstä poistuminen Aktiivisen sovelluksen valitseminen

Jypelin käyttöohjeet» Ruutukentän luominen

Vesa Ollikainen, päivitys Juha Haataja

QT tyylit. Juha Järvensivu 2008

Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla

Visma Fivaldi -käsikirja MiniCRM

Word 2010 Pikaopas Hannu Matikainen Päivitetty:

Transkribuksen pikaopas

HARJOITUSTYÖ ITKP101 Ronja Saarinen

Microstation 3D laitesuunnittelu 2014

WCONDES OHJEET ITÄRASTEILLE (tehty Condes versiolle 8)

Mainosankkuri.fi-palvelun käyttöohjeita

9. Kappale -ryhmä - Kappalemuotoilut

Vesa Ollikainen, päivitys Juha Haataja

KAPPALEMUOTOILUT. Word Kappalemuotoilut

Windows 10 -käyttöohje

ASCII-taidetta. Intro: Python

Tilastolliset ohjelmistot A. Pinja Pikkuhookana

ITKP102 Ohjelmointi 1 (6 op)

Asiakastukiryhmä Kesä- ja talviaika

Ohjelmoinnin peruskurssi Y1

MICROSOFT EXCEL 2010

CEM DT-3353 Pihtimittari

Ohjelmoinnin perusteet Y Python

C# Windows ohjelmointi perusopas

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

Pikanäppäin Yhdistelmiä. Luku 6 Pikanäppäimet

Ohjelmoinnin peruskurssi Y1

Google-dokumentit. Opetusteknologiakeskus Mediamylly

KUVAN TUOMINEN, MUOKKAAMINEN, KOON MUUTTAMINEN JA TALLENTAMINEN PAINTISSA

CSS-kielen avulla määritellään HTML-dokumentin tyyli. CSS avulla voidaan tarkemmin määritellä eri elementtien ominaisuuksia.

Muutamia peruskäsitteitä

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

ISIS Draw (Windows versio 2.5)

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

TYYLIT. Word Tyylit

Tietokantojen ja tietuenäkymien käyttö

Käsiteltävät asiat LIITE 2 1. Tehtävänä on mallintaa keilarata ohjeiden mukaan. MassFX Boolean Lathe

Office 365 palvelujen käyttöohje Sisällys

H5P-työkalut Moodlessa

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

JAKELUPISTE KÄYTTÖOHJE 2/6

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

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

Johdatus Rhinoon 1 / 17. Digitaalisen arkkitehtuurin yksikkö Aalto-yliopisto

Web Services tietokantaohjelmoinnin perusteet

Työvälineohjelmistot KSAO Liiketalous 1

Summamuuttujat, aineiston pilkkominen ja osa-aineiston poiminta 1

Ohjelmoinnin perusteet Y Python

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

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

Transkriptio:

Näkymien vierittäminen ja koon muuttaminen OSA V 415 LUKU 18 18 LUKU Näkymien vierittäminen ja koon muuttaminen Ikkunan muuttuneen koon selvittäminen ja ohjelman vaste siihen Ikkunan enimmäis- ja vähimmäiskoon asettaminen Näyttöä suuremman tekstin ja kaavioiden piirtäminen ja vierityspalkkien käyttö näkymän eri osien katsomiseen.

416 Kehittyneet dokumentti/näkymä-tekniikat Näkymien vierittäminen ja koon muuttaminen Ikkunoiden koon muuttaminen on eräs yleisimmistä Windowskäyttöympäristössä tehtävistä toimista. Tämä joustavuus otetaan usein itsestäänselvyytenä ajattelematta ikkunassa olevalle sovellukselle kohdistuneita seurauksia. Sovelluksen tai sovelluksen ohjelmoijan kannalta ikkunan koon muuttuminen saattaa olla suurikin tehtävä. Mahdollisesti kontrollien paikkoja joudutaan muuttamaan ja skaalaamaan, vierityspalkit saatetaan lisätä tai poistaa ikkunasta ja esitettävä teksti tai kaaviot joudutaan muotoilemaan uudelleen. MFC-luokista on tässäkin apua, mutta silti joudumme itse päättämään, miten sovelluksemme halutaan käyttäytyvän ikkunan koon muuttuessa. Ikkunan tilan ja nykyisen paikan selvittäminen Saat aina selville ikkunan tila- ja paikkatiedot ikkunaan liittyvän CWnd-olion GetWindowPlacement()- funktiolla. Tämä funktio täyttää WINDOWPLACEMENTtietorakenteen (joka syötetään ensimmäisessä parametrissä osoittimena) ikkunan paikkatiedoin sekä antaa tilatiedon siitä, onko ikkuna pienennetty, suurennettu, esillä vai piilotettu. Vastaavalla SetWindowPlacement()-funktiolla voidaan ikkunan tilaa muuttaa ohjelmasta käsin. Ikkunan koon muuttumisen käsitteleminen Kun tartut kiinni ikkunan reunasta ja muutat sen kokoa, tapahtuu useita asioita. Ensiksi, tartuttaessa ikkunaan se lukitaan eli siihen ei voi enää piirtää. Kun koko muuttuu, ikkuna saa useita koon muuttumissanomia (WM_SIZING). Kun haluttu koko on saavutettu ja hiiren vasen painike vapautetaan, sovellus saa vielä lopullisen WM_SIZE-sanoman, joka kertoo, että ikkuna tulee muuttaa halutun kokoiseksi. Voit perehtyä ikkunan koon muuttamiseen FormView-tyyppisellä SDIsovelluksella. FormView näyttää näkymässä valintaikkunapohjan, jonka kautta näkymäikkunaan voidaan lisätä kontrolleja aivan valintaikkunan tapaan. Saat tehtyä AppWizardilla FormView-pohjaisen sovelluksen seuraavien vaiheiden mukaisesti. FormView-pohjaisen SDI-sovelluksen luominen 1. Valitse File-valikosta New. 2. Valitse Projects-välilehti ja projektityyppien luettelosta MFC AppWizard (exe). 3. Napauta nyt Project Name ruutua ja anna nimeksi SizeForm. 4. Napauta OK. MFC AppWizard Step1 ikkunan pitäisi tulla esiin.

Näkymien vierittäminen ja koon muuttaminen 5. Valitse tässä ikkunassa Single Document ja napauta Nextpainiketta, kunnes päädyt viimeiseen vaiheeseen (Step 6, ikkunassa ruutulipun kuva). 6. Napauta AppWizardin luotavien luokkien luettelosta CSizeFormView-luokkaa. 7. Nyt Base Classes yhdistelmäruudun pitäisi olla käytössä. Avaa ruudun luettelo nuolesta ja näet käytettävissä olevat kantaluokat. 8. Valitse näistä CFormView kuvan 18.1 tapaan. 9. Napauta Finish. 10. Napauta New Project Information ikkunassa OK ja AppWizard tekee uuden projektin lähdekooditiedostoineen. OSA V LUKU 18 417 KUVA 18.1 CFormView-kantaluokan valitseminen päänäkymälle AppWizardissa. Koon muutostapahtuman käsitteleminen Voit seurata ja käsitellä Windowsin koon muuttamistapahtuman sanoman (WM_SIZING) näyttääksesi ikkunan muuttuvan koon sen otsikkopalkissa. Ikkuna on lukitu muutoksilta kokoa muutettaessa, joten joudut purkamaan lukituksen ennen kuin saat kirjoitettua

418 Kehittyneet dokumentti/näkymä-tekniikat Näkymien vierittäminen ja koon muuttaminen ikkunaan. Tämän jälkeen lukitset ikkunan uudelleen. Seuraavaksi esitetään, kuinka tämä saadaan tehtyä FormView-pohjaisessa SDIsovelluksessa. Lisää siis OnSizing()-käsittelijäfunktio. WM_SIZING-käsittelijän lisääminen EventWizardilla 1. Napauta projektin työtilaikkunassa ClassView-sivulla SizeForm Classes rivillä tekstin vasemmalla puolen olevaa plusmerkkiä nähdäksesi kaikki projektin luokat. 2. Kehysluokka käsittelee koon muuttamissanomat, joten lisäämme käsittelijän siihen. Napauta CMainFrame-luokkaa hiiren oikealla painikkeella ja valitse saamastasi pikavalikosta Add Windows Message Handler. 3. Nyt esillä tulisi olla New Windows Message and Event Handlers for class CMainFrame ikkunan. 4. Vieritä sanomaluetteloa (New Windows Messages and Events), kunnes löydät WM_SIZING-sanoman. 5. Valitse tämä ja napauta Add and Edit painiketta kuvan 18.2 tapaan. KUVA 18.2 Käsittelijän lisääminen WM_SIZING-sanomalle.

Näkymien vierittäminen ja koon muuttaminen OSA V LUKU 18 419 Nyt editorissa pitäisi olla näkyvissä OnSizing()-käsittelijäfunktio. Lisää listauksen 18.1 rivit ja saat ikkunan otsikkopalkkiin ikkunan sen hetkisen koon. LISTAUS 18.1 LST18_1.CPP Ikkunan muuttuvan koon näyttäminen 1 void CMainFrame::OnSizing(UINT fwside, LPRECT prect) 2 { 3 CFrameWnd::OnSizing(fwSide, prect); 4 // TODO: Add your message -handler code here 5 6 // ** Construct a CRect from the structure pointer 7 CRect rcsize(prect); 1 8 9 // ** Create a String to hold our message 10 CString sizemsg; 11 12 // ** Display the Sizing information 13 // ** From the Sizing Rectangle 14 sizemsg.format("sizing: width = %d, height = %d", 15 rcsize.width(),rcsize.height()); 2 16 17 // ** Turn off Window Locking 18 UnlockWindowUpdate(); 3 19 20 // ** Update the Title Bar Text 21 SetWindowText(sizeMsg); 22 23 // ** Turn Locking back on 24 LockWindowUpdate(); 25 } 1 RECT-tietorakenne on helpompi käyttää, kun se muutetaan CRect-luokaksi. 2 Ikkunan venytetty koko muotoillaan CString-merkkijonoksi ikkunan otsikkopalkkiin asetettavaksi. 3 Koska Windows lukitsee ikkunan sisällön koon muuttamisen aikana, lukitus joudutaan tilapäisesti poistamaan. Tätä käsittelijää tullaan nyt kutsumaan aina hiiren liikkuessa ikkunan kokoa muutettaessa. Funktio saa parametreinä lipun, joka kertoo, miltä sivulta ikkunaan on tartuttu sekä osoittimen suorakulmioon (prect), jossa ikkunan koordinaatit ovat. Ensiksi joudut muuttamaan tämän RECT-tietorakenteen ystävällisempään CRect-muotoon (rivi 7). Tämän jälkeen voit siirtää ikkunan leveyden ja korkeuden ikkunaan kirjoitettavaan merkkijonoon. Lopuksi ikkunan otsikoksi asetetaan tämä teksti, jossa koordinaatit ovat, SetWindowText()-funktiolla rivillä 21. Huomaa SetWindowText()-funktion ympärillä käytetyt UnlockWindowUpdate()- ja LockWindowUpdate()-funktiot (rivit 18 ja 24). Nämä tarvitaan, koska Windows lukitsee automaattisesti ikkunan estäen siihen piirtämisen kokoa muutettaessa. Tämä on

420 SizeForm-esimerkin suorittaminen Microsoft Plus!-ohjelmiston kanssa Jos käytössäsi on Microsoft Plus! -ohjelmisto (tai Windows NT), varmista tätä esimerkkiä suorittaessasi, että Näytä ikkunan sisältö vedettäessä - valinta (Show Window Content While Dragging) ei ole asetettuna. Tämä valinta löytyy Ohjauspaneelin Näyttöasetuksista Plus! tai Tehosteet -välilehdeltä (Control Panel/Display). Jos valinta on sallittu, ikkunan lukitus poistetaan ja näyttö menee sekaisin. Kehittyneet dokumentti/näkymä-tekniikat Näkymien vierittäminen ja koon muuttaminen yleensä vain hyödyksi, ettei ikkunan sisältö sekoittuisi. Koon muuttaminen nimittäin saisi aikaan jatkuvan ikkunan päivitystarpeen, joten siihen piirrettäisiin koko ajan. Käännettyäsi ohjelman näiden muutosten jälkeen ja ajettuasi sen pitäisi ikkunan leveyden (width) ja korkeuden (height) näkyä ikkunan otsikkopalkissa ikkunan kokoa muutettaessa. Lopullisen koon muuttamissanoman käsitteleminen Yleensä tieto siitä, että ikkunan koko parhaillaan muuttuu, ei ole yhtä tarpeellinen kuin tieto koon muuttamisen päättymisestä. Voit toki muuttaa kokoa muutettaessakin (kun WM_SIZING-sanomaa lähetetään) saamasi suorakulmion koordinaatteja, mutta se on harvoin tarpeen. Sen sijaan lopullinen tieto koon muuttamisen päättymisestä on paljon hyödyllisempi. Tämä tarkoittaa, että käyttäjä on päättänyt ikkunan oikean koon ja vapauttanut hiiren vasemman painikkeen. Voit käsitellä tämän sanoman kehysluokassa koon muuttamissanoman tavoin, mutta se välitetään edelleen myös näkymäluokalle, missä sillä on suurempi merkitys. Lisää siis käsittelijäfunktio. Näkymän käsittelijän lisääminen ikkunan koon muuttumiselle 1. Valitse projektin työtilaikkunassa ClassView-sivulla CSizeFormView-luokka. 2. Napauta sitä hiiren oikealla painikkeella ja valitse saamastasi pikavalikosta Add Windows Message Handler. 3. Nyt esillä tulisi olla New Windows Message and Event Handlers ikkuna. 4. Valitse sanomaluettelosta (New Windows Messages and Events) WM_SIZE. 5. Napauta Add and Edit painiketta lisätäksesi käsittelijäfunktion. Voit nyt lisätä listauksen 18.2 muutokset lopullisen leveyden ja korkeuden näyttämiseksi otsikkopalkissa.

Näkymien vierittäminen ja koon muuttaminen LISTAUS 18.2 LST18_2.CPP Size-tapahtuman käsittelijän toteutus OSA V LUKU 18 421 1 void CSizeFormView::OnSize(UINT ntype, int cx, int cy) 2 { 3 CFormView::OnSize(nType, cx, cy); 4 5 // TODO: Add your message handler code here 6 7 // ** Declare a string object 8 CString strtitle; 9 10 // ** Setup and display the Document Title 11 strtitle.format("final Width = %d, Height = %d", cx,cy); 1 12 GetDocument()->SetTitle(strTitle); 13 } 1 Leveys muotoillaan ja asetetaan dokumentin otsikoksi (joka näkyy ikkunan otsikkopalkissa). Listauksessa 18.2 esitettyä OnSize()-käsittelijää kutsutaan, kun ikkunan kokoa on muutettu. Funktio saa Windowsilta OnSize()- funktion ensimmäisenä parametrinä (ntype) lippuna tiedon siitä, miksi ikkunan kokoa muutettiin. Tämä koodi voi saada taulukossa 18.1 esitettyjä arvoja. TAULUKKO 18.1 Size-tapahtuman liput Lippu SIZE_RESTORED SIZE_MAXIMIZED SIZE_MINIMIZED Kuvaus Ikkunan kokoa muutettiin Ikkuna suurennettiin Ikkuna pienennettiin Kaksi muuta listauksessa 18.2 OnSize()-funktiolle välitettyä parametriä ovat uusi leveys (cx) ja korkeus (cy) kokonaislukuina. Voit muotoilla näytettävän merkkijonon esittämään nämä arvot (rivi 10) ja näyttää merkkijonon ikkunan otsikkopalkissa dokumentin SetTitle()-funktiolla (rivi 12). Käännettyäsi ohjelman näiden muutosten jälkeen ja ajettuasi sen pitäisi ikkunan leveyden (width) ja korkeuden (height) näkyä ikkunan otsikkopalkissa ikkunan kokoa muutettaessa ja lopullisen koon sen muuttamisen jälkeen. Saatat hämmästellä, milloin ja miksi haluaisit tietää ikkunan koon muuttumisesta. Tavallinen tapaus on kontrollien koon muuttaminen lomakenäkymässä (form view). Kuvittele, että olet kirjoittanut yksin-

422 Kehittyneet dokumentti/näkymä-tekniikat Näkymien vierittäminen ja koon muuttaminen kertaisen tekstinkäsittelyohjelman, jossa on monirivinen tekstiruutu. Käyttäjän muuttaessa sovellusikkunan kokoa tulisi myös tekstiruudun koon muuttua vastaavasti. Seuraavaksi esitetään ohjeet sellaisen tekstiruudun lisäämiseksi. Vieritysasetusten käyttö Horizontal Scroll ja Vertical Scroll -valinnat lisäävät tekstiruutuun vaaka- ja pystyvierityspalkit. AutoHScroll ja AutoVScroll puolestaan saavat tekstiruudun vierittämään automaattisesti rivin lopussa tai käyttäjän painaessa rivinvaihdon kontrollin lopussa. Ellei AutoHScroll-valintaa ole asetettu, kontrollin teksti rivitetään automaattisesti tekstiruudun seuraavalle riville. Monirivisen vieritettävän tekstikontrollin lisääminen vanhaan FormView-projektiisi 1. Napauta projektin työtilaikkunassa ResourceView-sivua. 2. Napauta projektin Resources-kansion viereistä plusmerkkiä ja saat esiin projektin eri resurssit. 3. Napauta Dialog-kansion viereistä plusmerkkiä avataksesi projektin valintaikkunan. 4. Esillä pitäisi olla projektin mukaan nimetty valintaikkuna (IDD_SIZEFORMFORM). Tämä valintaikkunapohja on FormViewnäkymän perustana. 5. Kaksoisnapauta tätä alkiota ja saat editoriin tyhjän valintaikkunan, jossa on teksti TODO: Place Controls Here. 6. Poista teksti valitsemalla se ja painamalla Delete-painiketta. 7. Ota Controls-työkalupaletista tekstiruutukontrolli (Edit Box), raahaa se tyhjälle valintaikkunapohjalle ja pudota. 8. Muuta tekstiruutu täyttämään valintaikkunan sinisellä pisteviivalla rajattu alue. 9. Avaa kontrollin asetukset (Edit Properties) näppäilemällä Alt+Enter. 10. Napauta Styles-välilehteä ja tarkista, että Multiline, Horizontal Scroll, Auto HScroll, Vertical Scroll, Auto VScroll ja Want return liput on valittu. 11. Valitse General-sivu ja muuta resurssin ID-tunnukseksi IDC_SIZEABLE_EDIT kuvan 18.3 mukaisesti. 12. Sulje Properties-ikkuna Enterillä. Nyt olet lisännyt tekstiruutusi, mutta siihen ei vielä liity ohjelman kontrollimuuttujaa tiedon vaihtamista varten. Seuraava tehtävä onkin tällaisen lisääminen ClassWizardilla.

Näkymien vierittäminen ja koon muuttaminen OSA V LUKU 18 423 KUVA 18.3 Monirivisen tekstiruudun lisääminen Muuttujan liittäminen tekstikontrolliin ClassWizardilla 1. Napauta varovasti tekstikontrollin reunaa. 2. Avaa ClassWizard näppäilemällä Ctrl+W tai valitsemalla Viewvalikosta ClassWizard. 3. Nyt esillä tulisi olla ClassWizard-ikkunan ja siitä Member Variables välilehden valittuna. 4. Valitse sopiva kontrollin ID-tunnus Control IDs luettelosta (tässä IDC_SIZEABLE_EDIT). Napauta Add Variable painiketta ja saat esiin vastaavan ikkunan. 5. Nyt voit lisätä tekstikontrollia edustavan muuttujan. 6. Valitse Category-yhdistelmäruutuun Control tämän pitäisi automaattisesti valita Variable Type ruutuun CEdit. 7. Napauta Member Variable Name tekstiruutua ja syötä uuden muuttujasi nimi (esimerkiksi m_sizeableedit), kuten kuvassa 18.4. KUVA 18.4 CEdit-muuttujan lisääminen Sizeable Edit tekstiruutua varten. 8. Lisää jäsenmuuttuja näkymäluokkaan (view) napauttamalla OK.

424 Kehittyneet dokumentti/näkymä-tekniikat Näkymien vierittäminen ja koon muuttaminen Nyt sinulla on kontrolliin liittyvä jäsenmuuttuja m_sizeableedit. Tämän avulla voit lukea ja kirjoittaa tekstiä ohjelmasta kontrolliin ja päinvastoin. Voit myös lähettää tämän muuttujan kautta koon muuttamissanoman kontrollille. Seuraavaksi joudut käsittelemään WM_SIZE-sanoman, jotta tietäisit, milloin tekstiruudun kokoa tulee muuttaa ja minkä verran. Sinulla on jo käsittelijäfunktio ja löydät sen näppärästi ClassWizardilla seuraavien ohjeiden avulla. Jäsenfunktion hakeminen ClassView-sivulla Toinen tapa tehdä tämä on etsiä OnSize()-funktio projektin työtilaikkunan ClassView-sivulla. Tämä jäsenfunktio löytyy CSizeFormView-kansion alta ja se saadaan avattua editoriin OnSize()-nimeä kaksoisnapauttamalla. Vaihtoehtoisesti funktion nimen päällä hiiren oikeaa painiketta napautettaessa saatavasta pikavalikosta voidaan valita, halutaanko nähdä funktion toteutus (Go to Definition) vai määrittely (Go to Declaration). Jäsen/käsittelijäfunktion hakeminen ClassWizardilla 1. Valitse ClassWizardin Message Maps välilehti ja varmista, että oikea luokka (tässä CSizeFormView) on valittu Class Name ruudussa. 2. Vieritä tarvittaessa Member Functions luetteloa ja etsi sopiva sanoma (kuten ON_WM_SIZE) tai jäsenfunktio (kuten OnSize()). 3. Kaksoisnapauta tätä alkiota ja pääset suoraan muokkaamaan CSizeFormView-luokan jäsenfunktiotasi (kuten OnSize()). Aluksi OnSize()-funktiossa ei ole koodia, joka muuttaisi tekstiruudun kokoa ikkunan koon muuttuessa. Voit kokeilla ohjelman toiminnan kääntämällä ja ajamalla sen. Kun muutat ikkunan kokoa, pysyy tekstiruutu saman kokoisena kuin ennenkin. Voit kirjoittaa tekstiä ruutuun, mutta eikö kunnon tekstinkäsittelyohjelmassa tuon muokkausalueen (siis tekstiruudun) pitäisikin pysyä ikkunan koon mukaisena? Sulje sovellus ja palaa lomakenäkymän (CSizeFormView) OnSize()- funktioon. Lisää listauksen 18.3 rivit OnSize()-käsittelijän loppuun. LISTAUS 18.3 LST18_3.CPP Tekstiruudun koon muuttaminen ikkunan koon muuttuessa 1 void CSizeFormView::OnSize(UINT ntype, int cx, int cy) 2 { 3 CFormView::OnSize(nType, cx, cy); 4 5 // TODO: Add your message handler code here 6 7 CString strtitle; 8 strtitle.format("final Width = %d, Height = %d",cx,cy); 9 GetDocument()->SetTitle(strTitle); 10 11 // ** Check the Edit Box is 'Alive'

Näkymien vierittäminen ja koon muuttaminen OSA V LUKU 18 425 12 if (m_sizeableedit.getsafehwnd()) 13 14 // ** Size to the new window size 15 m_sizeableedit.setwindowpos(this,0,0, 16 cx-40,cy-40, 17 // ** Only Resize 18 SWP_NOMOVE+SWP_NOZORDER+SWP_SHOWWINDOW+ 19 SWP_NOACTIVATE); 1 20 } 1 Tekstiruudun kokoa muutetaan vain hieman ikkunaa kapeammaksi ja matalammaksi. Liput ilmaisevat, että on kyse ainoastaan koon muuttamisesta. Joudut varmistamaan, että tekstiruutu on kunnolla alustettu sen GetSafeHwnd()-jäsenfunktiolla listauksen 18.3 rivillä 12 (muuten et saa tehdä mitään alustamattoman ikkunan kanssa). Rivin 15 SetWindowPos()-funktio on monipuolinen funktio, jolla voit muuttaa ikkunan paikkaa ja kokoa sekä aktivoida tai piilottaa ikkunan. Nyt riittää, että ainoastaan ikkunan kokoa muutetaan, joten voit syöttää sille ikkunan uuden koon cx- ja cy-parametreinä (miinus reunuksen 40 kuvapistettä). SetWindowPos()-funktion viimeinen lippuparametri kertoo, mitä funktion oletetaan tekevän ja mitä parametrejä sen tulee käyttää. Käytettävissä olevat liput on esitetty taulukossa 18.2. TAULUKKO 18.2 SetWindowPos()-funktion liput Lippu Kuvaus SWP_NOMOVE Älä siirrä ikkunaa; toista ja kolmatta (x ja y) parametriä ei huomioida SWP_NORESIZE Älä muuta ikkunan kokoa; kolmatta ja neljättä (cxja cy) kokoparametriä ei huomioida SWP_NOZORDER Älä sijoita ikkunaa muiden ikkunoiden eteen tai taakse (ei huomioi ensimmäistä pwndinsertafter-parametriä) SWP_NOACTIVATE Älä muuta ikkunaa aktiiviseksi SWP_SHOWWINDOW Näytä ikkuna Käännä ja aja sovellus näiden rivien lisäämisen jälkeen, jolloin saat kuvan 18.5 mukaisen tekstieditorin, jonka ikkunan kokoa voi muuttaa.

426 Kehittyneet dokumentti/näkymä-tekniikat Näkymien vierittäminen ja koon muuttaminen KUVA 18.5 Tekstieditori, jonka ikkunan kokoa voi muuttaa. Kokorajojen asettaminen Saatat haluta estää käyttäjää muuttamasta ikkunaa määrättyä kokoa suuremmaksi tai pienemmäksi. Tämä onnistuu käsittelemällä ikkunan WM_GETMINMAXINFO-sanoma kehysluokan (frame) OnGetMinMaxInfo()-käsittelijäfunktiolla. Tämän funktion ja sille välitettyjen parametrien avulla saat asetettua ikkunasi koolle ala- ja ylärajat. Käsittelijäfunktion lisääminen Wizard-palkista Add Windows Message Handler - toiminto voidaan käynnistää myös Wizard-palkin oikean reunan avautuvasta luettelosta. Jos käytät tätä työkaluriviä ClassView-sivun sijaan, varmista, että rivin ensimmäisessä yhdistelmäruudussa on CMainFrame-luokka valittuna, jotta lisättävä käsittelijä tulisi tuon luokan jäseneksi. Käsittelijäfunktion lisääminen ikkunan vähimmäis- ja enimmäiskoon ohjaamiseksi 1. Napauta projektin työtilaikkunan ClassView-sivulla CMainFrame-luokkaa hiiren oikealla painikkeella. Saat esiin pikavalikon. 2. Valitse valikosta Add Windows Message Handler komento. Nyt esiin pitäisi tulla New Windows Message and Event Handlers for class CMainFrame valintaikkunan. 3. Valitse New Windows Messages/Events luettelosta WM_GETMINMAXINFO-sanoma ja napauta Add and Edit painiketta lisätäksesi uuden käsittelijän. Nyt voit lisätä listauksessa 18.4 esitetyt rivit kehysikkunan uuteen OnGetMinMaxInfo()-käsittelijäfunktioon. Nämä rajoittavat ikkunan sallitun vähimmäis- ja enimmäiskoon estäen käyttäjää ylittämästä annettuja raja-arvoja.

Näkymien vierittäminen ja koon muuttaminen LISTAUS 18.4 LST18_4.CPP Ikkunan vähimmäis- ja enimmäiskoon asettaminen OnGetMinMaxInfo()-funktiolla 1 void CMainFrame::OnGetMinMaxInfo(MINMAXINFO FAR* lpmmi) 2 { 3 // TODO: Add your message handler code here 4 5 // ** Set Min Size 6 lpmmi->ptmintracksize = CPoint(200,200); 7 8 // ** Set Max Size 9 lpmmi->ptmaxtracksize = CPoint(500,400); 10 11 CFrameWnd::OnGetMinMaxInfo(lpMMI); 12 } OSA V LUKU 18 427 Käännettyäsi ja ajettuasi ohjelman rivien lisäämisen jälkeen kokeile ikkunan koon muuttamista. Huomannet, ettet saa kutistettua ikkunaa 200 x 200 kuvapistettä pienemmäksi etkä 500 x 400 suuremmaksi. Rivillä 6 muutettua MINMAXINFO-tietorakenteen ptmintracksizeja rivillä 9 muutettua ptmaxtracksize-jäsentä muuttamalla voit säätää näitä raja-arvoja. Listauksessa 18.5 on esitetty MINMAXINFO-tietorakenteen määrittely. LISTAUS 18.5 LST18_5.CPP MINMAXINFO-tietorakenne 1 typedef struct tagminmaxinfo { 2 POINT ptreserved; 3 POINT ptmaxsize; 4 POINT ptmaxposition; 5 POINT ptmintracksize; 6 POINT ptmaxtracksize; 7 } MINMAXINFO; Tietorakenne esittää vielä kaksi muuta jäsentä, joiden arvoa voimme muuttaa. Toinen on rivin 3 ptmaxsize, jolla ikkunan enimmäisleveys ja korkeus voidaan säätää ja toinen rivin 4 ptmaxposition, jolla voidaan asettaa suurennetun ikkunan vasemman yläkulman paikka. POINT-tietotyyppi WIN32:n POINT-tietorakenteessa ovat x- ja y-jäsenet, joissa ovat yhden pisteen koordinaatit. Tutumpi CPoint-luokka kapseloi sisäänsä POINT-tietorakenteen ja lisää käyttökelpoisia jäsenfunktioita sekä kuormitettuja operaattoreita. Venytettävien valintaikkunoiden luominen Valintaikkunan muuttaminen sellaiseksi, että sen kokoa voidaan muuttaa, käy varsin helposti. Seuraavassa on annettu ohjeet sovelluksemme About-ikkunan koon muuttamisen mahdollistamiseksi.

428 Kehittyneet dokumentti/näkymä-tekniikat Näkymien vierittäminen ja koon muuttaminen About-ikkunan muuttaminen pienennettäväksi ja suurennettavaksi 1. Napauta projektin työtilaikkunassa ResourceView-sivua. 2. Avaa valintaikkunaresurssit napauttamalla projektin (kuten SizeFormin) Resources kansion sekä Dialog-kansion viereistä plusmerkkiä. 3. Kaksoisnapauta IDD_ABOUTBOX-valintaikkunaa ja pääset muokkaamaan sitä. 4. Näppäile Alt+Enter, muuttaaksesi valintaikkunan asetuksia Properties-ikkunassa. 5. Avaa Border Style luettelo ja valitse Resizing. 6. Käännä ja aja sovelluksesi. 7. Napauta sovelluksen Help-valikkoa ja valitse siitä Aboutkomento (kuten About SizeForm). 8. Nyt voit muuttaa valintaikkunan kokoa ikkunan oikeassa alakulmassa olevasta koonmuuttokohdasta. Voit halutessasi käsitellä OnSize()-sanoman aivan samaan tapaan kuin aiemmassa tekstieditoriesimerkissä. Ikkunoiden vierittäminen Aina ei ole mahdollista esittää ikkunan koon vuoksi tiettyä kuvaa tai valintaikkunaa kokonaan. Joskus saatat jopa haluta piirtää näyttöruutua suurempaan ikkunaan ja antaa käyttäjälle mahdollisuuden tutkia koko piirrosta vierittämällä. MFC-kirjastossa on tähän tarkoitukseen sopiva näkymäluokka CScrollView. Olet taatusti käyttänyt jo sovelluksia, joissa vierityspalkkien avulla voidaan tutkia ikkunan näytettävää aluetta. Voit siis tehdä AppWizardilla SDI-sovelluksen, jossa on CScrollView-luokan avulla toteutettu vieritettävä alue. Sovelluksen luomisen vaiheet ovat miltei samat kuin aiemmin esitetyssä CFormView-esimerkissä. Tällä kertaa valitset kuitenkin AppWizardin viimeisessä ruudussa CFormView-luokan tilalle Base Class yhdistelmäruutuun CScrollView. Seuraavat esimerkit esittävät PanSdi-nimisen CScrollViewsovelluksen ominaisuuksia.

Näkymien vierittäminen ja koon muuttaminen Vieritettävän alueen koon asettaminen Jos käännät ja ajat AppWizardin tekemän CScrollView-pohjaisen SDIsovelluksen, et huomaa heti mitään eroa tavalliseen CView-näkymällä varustettuun SDI-sovellukseen. Syy tähän on, että vieritettävän näkymän oletuskoko on sovellusrungossa 100 x 100 kuvapistettä. Voit muuttaa tätä oletuskokoa jopa koko näyttöä suuremmaksi muuttamalla oletusarvoja näkymän (view) OnInitialUpdate()-funktiossa. OSA V LUKU 18 429 Näkymän OnInitialUpdate()-funktion löytäminen vieritysnäkymän koon muuttamista varten 1. Valitse projektin työtilanäkymässä (workspace) ClassView-sivu. 2. Avaa projektisi luokat napauttamalla projektin nimen viereistä plusmerkkiä. 3. Avaa CScrollView-kantaluokasta peritty luokka (kuten CPanSDIView) napauttamalla sen plusmerkkiä. Jäsenfunktioluettelon loppupuolelta pitäisi löytyä OnInitialUpdate()-funktio. 4. Kaksoisnapauta tätä funktiota ja esiin pitäisi tulla sen oletustoteutuskoodi listauksen 18.6 mukaisena. 5. Voit muuttaa vieritysnäkymän oletuskokoja muuttamalla sizetotal.cx ja sizetotal.cy-muuttujien arvoja. OnInitialUpdate()-funktio OnInitialUpdate()-funktio on hyvä paikka suorittaa vain kerran tehtäviä alustuksia, koska funktiota kutsutaan ainoastaan kerran, kun näkymäikkuna alustetaan. Funktio on vastaava kuin valintaikkunan OnInitDialog(). Älä kuitenkaan viittaa sovelluksesi dokumenttiolioon OnInitialUpdate()- funktiossa, koska joskus näkymä alustetaan ennen dokumenttia. Muussa tapauksessa sovelluksesi saattaa kaatua jo käynnistyessään. LISTAUS 18.6 LST18_6.CPP ScrollView-vieritysnäkymän oletustoteutus OnInitialUpdate()-funktiossa 1 void CPanSDIView::OnInitialUpdate() 2 { 3 CScrollView::OnInitialUpdate(); 4 CSize sizetotal; 5 6 // TODO: calculate the total size of this view 7 sizetotal.cx = sizetotal.cy = 100; 8 SetScrollSizes(MM_TEXT, sizetotal); 1 9 } 1 Oletuksena vierityksen kokonaismitaksi asetetaan 100 x 100 pistettä, joka yleensä on liian pieni tosikäyttöön. Listauksessa 18.6 esitettyä OnInitialUpdate()-funktiota kutsutaan vain kerran: juuri ennen näkymän näyttämistä, mutta kuitenkin sen dokumenttiin liittämisen jälkeen. Voit toteuttaa funktiossa näkymän tarvitsemia kertaluonteisia alustuksia. CSize-luokka on alustettu listauksen 18.6 rivillä 7 kokoon 100 x 100. Nämä arvot syötetään sitten SetScrollSizes()-funktiolle, joka

430 Kehittyneet dokumentti/näkymä-tekniikat Näkymien vierittäminen ja koon muuttaminen asettaa näkymän koon erityisessä piirtotilassa (joita käsiteltiin luvussa 15). Tästä johtuen näkymän koko on 100 x 100 eli tavallisen ikkunan kokoa pienempi, joten vierityspalkkeja ei välttämättä näytetä. Vierityspalkkeja varten haluat todennäköisesti hyvin suuren näkymän, jopa itse näyttöä suuremman. Voit siis muuttaa näkymän kooksi 2000 x 2000 vaihtamalla listauksen 18.7 tapaan luvun 100 paikalle 2000. Tämä suurentaa vieritysnäkymäsi koko näyttöäsikin suuremmaksi (ellei sinulla ole ultrasuperhypertarkkaa näyttöä). LISTAUS 18.7 LST18_7.CPP Näyttöä suuremman näkymän koon asettaminen 1 2000 x 2000 pistettä on näyttöä suurempi alue, joten vieritysnäkymä voi esittää käyttäjälle alueesta ainoastaan osan vierittämällä. 1 void CPanSDIView::OnInitialUpdate() 2 { 3 CScrollView::OnInitialUpdate(); 4 CSize sizetotal; 5 6 // TODO: calculate the total size of this view 7 sizetotal.cx = sizetotal.cy = 2000; // ** New Size 8 SetScrollSizes(MM_TEXT, sizetotal); 1 9 } Voisit piirtää näyttöön jotain todella suurta, jotta saisit vierityksen käyttöön. Listauksessa 18.8 on esitetty ellipsin piirtämistä varten lisättävät rivit. Löydät OnDraw()-funktion koodin kaksoisnapauttamalla ClassView-sivulla OnDraw()-funktiota. LISTAUS 18.8 LST18_9.CPP Näyttöä suuremman kuvion piirtäminen ScrollView-näkymässä 1 Ellipsi piirretään ikkunaa suurempana ja se rajataan ikkunan näkyvään osaan. 1 void CPanSDIView::OnDraw(CDC* pdc) 2 { 3 CPanSDIDoc* pdoc = GetDocument(); 4 ASSERT_VALID(pDoc); 5 6 // TODO: add draw code for native data here 7 8 // ** Select a Gray Brush 9 CBrush* poldbrush = 10 (CBrush*)pDC->SelectStockObject(LTGRAY_BRUSH); 11 12 // ** Make a CRect 13 CRect rctotal(cpoint(0,0),gettotalsize()); 14 15 // ** Draw Ellipse 16 pdc->ellipse(rctotal); 1 17 18 // ** Reselect the old brush 19 pdc->selectobject(poldbrush); 20 }

Näkymien vierittäminen ja koon muuttaminen Huomaa listauksessa 18.8, että vieritysnäkymän funktiolla GetTotalSize() (rivillä 13) haetaan koko vieritettävän alueen koko, joka asetettiin OnInitialUpdate()-funktiossa SetScrollSizes()- funktiolla. Tästä tiedosta saadaan muodostettua CRect, jonka avulla saadaan piirrettyä 2000 x 2000 kuvapisteen kokoinen ellipsi. Rivillä 10 tämä piirretään vaaleanharmaalla siveltimellä (LTGRAY_BRUSH). Kun käännät ja ajat sovelluksen näiden muutosten jälkeen, näet ikkunan, jossa on osa valtavan suuresta ellipsistä (kuva 18.6). Vierityspalkkien avulla saat esiin ellipsin muutkin osat. Voit kokeilla vielä ikkunan koon muuttamista: huomaat vierityspalkkien muuttuvan ja paljastavan, minkä verran ikkunassa vielä on nähtävää. OSA V LUKU 18 431 KUVA 18.6 Ikkunaa suurempien kappaleiden näyttäminen scroll view näkymässä Sivu- ja rivivierityksen määrän muuttaminen Jos napautat vierityspalkin päässä olevaa nuolta, huomaat, että kuvaa vieritetään vain hieman; kyseessä on rivivieritys. Jos sen sijaan napautat vieritysruudun ja vieritysnuolen välistä aluetta, kuvaa vieritetäänkin kerralla paljon enemmän. Tällöin kyseessä on sivuvieritys. Nimitykset tulevat tekstinkäsittelysovelluksista, mutta toimivat hyvin kaiken näkymässä näytettävän kanssa. Voit muuttaa näitä vierityspalkin osia käytettäessä siirryttävää matkaa lisäämällä parametrejä SetScrollSizes()-funktioon. Ellei rivi- ja sivuvieritysarvoja anneta, niiden oletusarvo valitaan sopivaksi näkymän kokoon nähden. Voit muuttaa näitä molempia arvoja syöttämällä funktiolle CSize-olion, jossa on arvo sekä vaaka- että pystysuuntaiselle vierityspalkille. CSize-oliossa on cx- ja cy-jäsenet. cx-arvo muuttaa Rivin ja sivun vieritysarvot Tavallisesti rivi- ja sivuvieritys määritetään kuvapisteinä MM_TEXT -koordinaatiston kohdistustapaa käytettäessä. Vieritysarvot voidaan myös määrittää eri kohdistustapoja käytettäessä myös todellisina reaalimailman mittoina. Voit esimerkiksi määrittää pystyvierityspalkin vierittämään sentin kerrallaan ja sivuvierityksen 10 cm.

432 Kehittyneet dokumentti/näkymä-tekniikat Näkymien vierittäminen ja koon muuttaminen vaakavierityspalkin rivi- tai sivuvierityksen määrää ja cy pystyvierityspalkin. SetScrollSizes()-funktio voidaan alustaa, kun näkymä näytetään ensimmäisen kerran OnInitialUpdate()-funktiossa. Voit siis kaksoisnapauttaa tätä funktiota projektin työtilaikkunan ClassViewsivulla, jotta pääset muokkaamaan näkymäluokan OnInitialUpdate()-jäsenfunktiota. Voisit lisätä vielä CSize-oliot SetScrollSizes()-funktion parametrejä varten rivi- ja sivuvierityksen muuttamiseksi (listauksen 18.9 mukaan). LISTAUS 18.9 LST18_9.CPP Rivi- ja sivuvierityksen asettaminen SetScrollSizes()-funktiolla 1 SetScrollSizes() voi muutta myös molempien vierityspalkkien rivi- ja sivuvieritysarvoja. 1 void CPanSDIView::OnInitialUpdate() 2 { 3 CScrollView::OnInitialUpdate(); 4 CSize sizetotal; 5 // TODO: calculate the total size of this view 6 sizetotal.cx = sizetotal.cy = 2000; // New Size 7 SetScrollSizes(MM_TEXT, sizetotal, 8 CSize(200,10), // ** Page Scroll (X,Y) 9 CSize(20,1)); // ** Line Scroll (X,Y) 1 10 } Huomaa, että vaakasuuntaiset vieritysmäärät ovat pystysuuntaista suurempia sekä rivi- että sivuvierityksessä. Jos käännät ja ajat sovelluksesi ja napautat vieritysnuolta sekä vierityspalkkia vieritysruudun ja nuolen väliltä, huomaat selvän eron vaaka- ja pystyvierityspalkkien vieritysmäärässä. Laitteen vieritysaseman selvittäminen GetScrollPosition() palauttaa vieritysaseman loogisissa yksiköissä. Tästä syystä nämä yksiköt riippuvat asetetusta koordinaatiston kohdistustavasta. Jos haluat vieritysaseman aina laiteyksikköinä (kuvapisteinä), joudut käyttämään GetDeviceScrollPosition()- funktiota. Funktiot palauttavat saman arvon MM_TEXTkondistustapaa käytettäessä. Vieritysaseman käyttäminen Usein on hyödyllistä tietää, mikä osa näytöstä on sillä hetkellä esillä ja mikä on sen sijainti koko kuvassa. Entä, jos esimerkiksi haluaisit piirtää ristikon kuvan keskelle? Voisitko käyttää aikaisempaan tapaan GetClientRect()-funktiota ja sitten CRectin CenterPoint()- jäsenfunktiota? Tämä toimisi ainoastaan, jos ikkunasi olisi aivan näkymän vasemmassa yläkulmassa. Jos vierityspalkit olisi asetettu näkymän keskelle, olisi työalue (client rect) yhä vasemmassa yläkulmassa samoin kuin mahdollisesti piirrettävä ristikkokin. Saat vieritysnäkymän GetScrollPosition()-funktiolla selville näytettävän ikkunan osan paikan koko näkymästä ja tämän tuloksen perusteella saadaan ikkunan näkyvän osan keskipiste laskettua työ-

Näkymien vierittäminen ja koon muuttaminen alueen CenterPoint()-funktiolla ja siihen piirrettyä. Voit nyt lisätä OnDraw()-funktioon Ellipse()-kutsun jälkeen listauksessa 18.10 esitetyn koodin ristikon piirtämiseksi ikkunan näkyvän osan keskelle. LISTAUS 18.10 LST18_10.CPP Ristikon piirtäminen vieritettyyn paikkaan GetScrollPosition()-funktion avulla OSA V LUKU 18 433 1 // Make a CRect 2 CRect rctotal(cpoint(0,0),gettotalsize()); 3 4 // Draw Ellipse 5 pdc->ellipse(rctotal); 6 7 // ** Get Client Rect 8 CRect rcclient; 9 GetClientRect(&rcClient); 10 11 // ** Get Scroll Pos 12 rcclient += GetScrollPosition(); 1 13 14 // ** Find Middle 15 CPoint ptcenter = rcclient.centerpoint(); 16 17 // ** Top Left to Bottom Right Line 18 pdc->moveto(ptcenter + CPoint(-30,-30)); 19 pdc->lineto(ptcenter + CPoint(+30,+30)); 20 21 // ** Top Right to Bottom Left Line 22 pdc->moveto(ptcenter + CPoint(+30,-30)); 23 pdc->lineto(ptcenter + CPoint(-30,+30)); 24 25 // Reselect the old brush 26 pdc->selectobject(poldbrush); 27 } 1 Työalueen RECT-tiedoissa ovat ikkunan näkyvä leveys ja korkeus oikein, mutta tähän arvoon joudutaan lisäämään vielä vierityssiirros, jotta saadaan koordinaatit näkymän suhteen. Listauksessa rivillä 12 rcclient-arvoa kasvatetaan GetScrollPosition()-funktion paluuarvolla; muutoin koodi on varsin tavanomaista. Seuraavaksi lisätään rivin rcclient.centerpoint()-arvo rivien 18 ja 23 MoveTo()- ja LineTo()-funktioiden koordinaatteihin. Saattaa tuntua mutkikkaalta, mutta koodissa on vielä eräs piilossa oleva ongelma, joka estää sitä toimimasta kunnolla. Jos käännät ja ajat ohjelman muutosten tekemisen jälkeen, näet ristikon ikkunassa ja kaikki näyttää toimivan mainiosti. Kuitenkin ikkunaa vieritettäessä ristikko katoaa.

434 Määrätyn alueen pakottaminen uudelleen piirrettäväksi Voit asettaa tietyn suorakulmaisen alueen sisällön päivitettäväksi syöttämällä InvalidateRect()-funktiolle suorakulmion koordinaatit ensimmäisenä parametrinä. Vaihtoehtoisesti mutkikkaampia alueita voidaan määrittää InvalidateRgn()-funktiolla, jolloin muoto määritetään ensimmäiseen CRgn-parametriin. Nämä funktiot päivittävät rajaussääntöluetteloa siten, että Windows päivittää vain määritetyt alueet. Kehittyneet dokumentti/näkymä-tekniikat Näkymien vierittäminen ja koon muuttaminen Ilmiö johtuu rajaamisesta (clipping). Windows yrittää minimoida piirtoon käytetyn työn nopeuttaakseen toimintaa. Kun vierität ikkunaa, Windows luulee, että ainoastaan paljastunut osa ikkunasta tulee piirtää uudelleen ja ainoastaan kapea siivu ikkunan reunasta tulee piirretyksi. Tämä toimii, jos piirrettävänä on vieritettävässä ikkunassa liikkumaton ympyrä, mutta se ei päde ristikkoon. Tästä syystä Windowsia täytyy informoida siitä, että sen piirto-oletus on väärä. Tätä varten Windowsissa on funktioita, joilla voidaan asettaa uudelleen piirrettäväksi osia ikkunasta tai jopa koko ikkunan sisältö. Invalidate()-funktio käskee Windowsia unohtamaan rajaussääntönsä ja päivittämään koko alueen. Joudut siis kutsumaan Invalidate()-funktiota, mutta missä? OnDraw()-funktio kuulostaisi aluksi hyvältä, mutta siitä seuraisi vain pahempaa sotkua. Windows näes otaksuu, että OnDraw() hoitaa piirtämisen ja Invalidate()-funktion kutsu siinä saa kaiken alkamaan taas alusta OnDraw()-funktion sijaan joudut miettimään, mikä saa aikaan tarpeen piirtää uudelleen ja joudut sijoittaman uudelleenpiirtokäskyn sinne. Tilanne syntyy vierityspalkkia siirrettäessä. Tästä syystä vierityssanoma tuleekin käsitellä ja kutsua käsittelijästä Invalidate()-funktiota. Vierityssanomien käsitteleminen Vierityspalkkia käsiteltäessä kutsutaan aina OnScroll()- virtuaalifunktiota. Voit käsitellä ja korvata tämän funktion sisällön omalla koodillasi käsitelläksesi vierityspalkkia sovelluksellesi ominaiseen tapaan. OnScroll()-korvaajafunktion lisääminen 1. Napauta hiiren oikealla painikkeella CScrollView-kantaluokasta perittyä luokkaa (kuten CPanSDIView) projektin työtilaikkunan ClassView-sivulla. Saat esiin pikavalikon. 2. Valitse Add Virtual Function komento valikosta. Saat esiin New Virtual Override for class CPanSDIView ikkunan. 3. Vieritä New Virtual Function luetteloa kunnes löydät OnScroll()-funktion (kuva 18.7). 4. Napauta OnScroll()-funktiota ja Add and Edit painiketta lisätäksesi uuden virtuaalifunktion korvaajan.

Näkymien vierittäminen ja koon muuttaminen 5. Lisää oma OnScroll()-sovelluskoodisi (kuten Invalidate()- funktiokutsu //TODO-kommenttien alle listauksen 18.11 tapaan). OSA V LUKU 18 435 KUVA 18.7 OnScroll-virtuaalifunktion korvaajan lisääminen New Virtual Override ikkunassa. LISTAUS 18.11 LST18_11.CPP Uudelleenpiirron pakottaminen Invalidate()-funktiolla näkymää vieritettäessä 1 BOOL CPanSDIView::OnScroll(UINT nscrollcode, UINT npos, BOOL bdoscroll) 2 { 3 4 5 // ** Invalidate the whole window 6 Invalidate(); 7 8 return CScrollView::OnScroll(nScrollCode, 9 npos, bdoscroll); 10 } Nyt ristikko-ohjelma on saanut tarpeelliset lisäykset toimiakseen kunnolla. Rivillä 6 Invalidate()-funktio kertoo Windowsille, että ikkunan koko työalue kaipaa uudelleenpiirtämistä. OnDraw()-funktion piirtämistä ei rajata ja näet ristikon näkymää vieritettäessäkin. Voit kääntää ja ajaa sovelluksesi tämän rivin lisäämisen jälkeen; nyt ikkunan vierityksen pitäisi onnistua siten, että ristikko pysyy koko ajan ikkunan keskellä kuvan 18.8 tapaan.

436 Kehittyneet dokumentti/näkymä-tekniikat Näkymien vierittäminen ja koon muuttaminen KUVA 18.8 Ristikon uudelleenpiirtäminen näkymää vieritettäessä. Voit halutessasi käsitellä myös yksittäiset vaaka- ja pystyvierityspalkin sanomat ja lisätä niihin oman koodisi tai halutessasi muuttaa arvoja ennen kuin scroll view näkymä päivittää näyttöä niiden perusteella. Tätä varten joudut käsittelemään WM_HSCROLL ja WM_VSCROLL-sanomat vastaavissa käsittelijäfunktioissa (OnHScroll() ja OnVScroll()). OnHScroll()-käsittelijän lisääminen WM_HSCROLLsanomalle 1. Napauta hiiren oikealla painikkeella CScrollView-kantaluokasta perittyä luokkaa (kuten CPanSDIView) projektin työtilaikkunan ClassView-sivulla. Saat taas esiin pikavalikon. 2. Valitse Add Windows Message Handler komento valikosta. Saat esiin New Windows Message and Event Handlers for class CPanSDIView ikkunan. 3. Valitse New Windows Messages/Events luettelosta WM_HSCROLL. 4. Napauta Add and Edit painiketta lisätäksesi uuden käsittelijän vaakasuuntaiselle vierityssanomalle. Nyt editorin ikkunassa pitäisi olla WM_HSCROLL-sanoman käsittelevä OnHScroll()-funktio. Tämä sanoma lähetetään sovellukselle, kun sen vaakasuoraa vierityspalkkia liikutetaan. Aivan vastaavaa käsittelijää OnVScroll() kutsutaan (WM_VSCROLL-sanomasta) pystysuoraa vierityspalkkia liikutettaessa.

Näkymien vierittäminen ja koon muuttaminen Listauksessa 18.12 esitetyn OnHScroll()-käsittelijän rivillä 6 vierityspalkin palauttama asema muutetaan käänteiseksi ennen sen palauttamista vieritysnäkymään. LISTAUS 18.12 LST18_12.CPP Vierityspalkin aseman muuttaminen käänteiseksi OnHScroll()-käsittelijässä OSA V LUKU 18 437 1 void CPanSDIView::OnHScroll(UINT nsbcode, UINT npos, CScrollBar* pscrollbar) 2 { 3 // TODO: Add your message -handler code here 4 5 // ** Reverse view position 6 npos = GetScrollLimit(SB_HORZ) - npos; 1 7 8 CScrollView::OnHScroll(nSBCode, npos, pscrollbar); 9 } 1 Muuttamalla hpospaikkatietoa ennen kantaluokan OnHScroll()-käsittelijän kutsua arvo muutetaan käänteiseksi. Rivillä 6 käytetty GetScrollLimits()-funktio hakee SB_HORZ-lipun perusteella vaakasuoran vierityspalkin suurimman arvon. Kun vähennät nykyisen arvon suurimmasta mahdollisesta, muuttuu vaakasuoran vierityspalkin liike vastakkaiseksi. Tämä muutettu npos-arvo syötetään sitten rivillä 8 scroll view näkymän OnHScroll()-perustoteutukselle, joka käsittelee vierityssanoman aivan kuin mitään ei olisi tapahtunutkaan. Nyt vaakasuora vierityspalkki kuitenkin toimii täsmälleen odotuksien vastaisesti. Käännä ja aja ohjelmasi muutosten tekemisen jälkeen ja kokeile vaakasuoran vierityspalkin outoa toimintaa. Pystysuora vierityspalkki toimii yhä normaalisti (voit toki muuttaa tämänkin käsittelemällä WM_VSCROLL-sanoman).

438 Kehittyneet dokumentti/näkymä-tekniikat Näkymien vierittäminen ja koon muuttaminen