Demo 9 / Ma 13.11

Demo 9 / Ma 13.11	1
1.	Bittikartat	1
2.	Modaalinen dialogi	1
3.	Modeless-dialogi	1
4.	Bonus:  VespaCad ja talletus	2

1.	Bittikartat
1-2.	Seuraavan tehtävän saa tehdä myös Delphillä, kunhan siihen tulee sama toiminnallisuus.  Silloin toteutus on monin verroin helpompi:  Kirjoita API tai MFC -ohjelma, jossa ensin alustuksessa luodaan bittikartta, johon piirretään "tikku-ukon" kuva keltaiselle taustalle.  Tämän jälkeen tätä kuvaa käytetään täyttävänä taustakuvana (ideoita voit ottaa tiedostosta ALI\tausta.c, mutta älä käytä muita funktioita kuin alla mainitaan).  Ohjelma toteutetaan ikkunana, ei dialogina (ei tarvitse .RC:tä).  Aina kun ikkunan koko muuttuu, tausta uusiksi!  Vihjeitä API –versiota varten, eli modifioi niitä tarpeen mukaan:

Kirjoita käsittelijät seuraaville viesteille:
  WM_CREATE      - luo ja alustaa bittikartan ukon kuvalla
  WM_DESTROY     - hävittää bittikartan
  WM_SIZE        - ilmoittaa koko ikkunan pilaantuneeksi, jotta tausta
                   piirrettään uudestaan
  WM_ERASEBKGND  - täyttää taustan bittikartalla

Käytä seuraavia aliohjelmia (kerran tai useammin):
  CreateCompatibleDC
  CreateSolidBrush
  CreateCompatibleBitmap
  SelectObject
  Rectangle          - mitä tapahtuu jos tätä ei käytetä?
  ukko               - kopioi jostakin valmiista ukko-ohjelmasta WM_paint
  DeleteObject
  DeleteDC
  TaytaBittikartalla - tausta.c
  InvalidateRect
  PostQuitMessage

2.	Modaalinen dialogi
3-4.	Kirjoita MFC tai API -ohjelma, jossa hiiren oikeaa nappia painamalla saadaan modaalinen kokonaisluvun kysyvä dialogi.  Tämän jälkeen näyttöön täytyy tulostua teksti:

Luku oli 13, heksana 0x0d.
3.	Modeless-dialogi
5.	Muuta edellinen ohjelma Modeless-dialogia käyttäväksi.
6.	Sama Delphillä. (tuossahan C++ puolella on yhteensä 3 tehtävää, jos teet vain tämän Delphi-version, saat merkitä 4-6, ongelmat ovat nimittäin samoja).
4.	Bonus:  VespaCad ja talletus
7.	Tutustu viimevuonna VespaCadiin (www.jyu.fi/~vesal/gko, tai avaa vesal ja avaa g) toteutettuun kuvioiden talletukseen:
•	TFigureen lisätään property: AsString, jonka saantimetodi GetAsString palauttaa kuvion intiimit tiedot merkkijonona, esim: ’10.5,12.5,24.7,30.8’ (eli esim. x,y,h,w)
•	vastaavasti asettamismetodi SetAsString tehdäänkin parametrilistalla var s:string, josta metodia uudelleen kirjoitettaessa (override) jokainen voi ottaa ”oman” osansa jonosta.
•	Talletusvaiheessa TAlusta:Talleta(var f:Text) käy läpi kaikki päällänsä olevat muodot ja kirjoittaa tiedostoon writeln(f,muoto.ClassName,':',muoto.AsString);
•	Lukuvaiheessa TAlusta.Lue(var f:Text) lukee rivin kerrallaan Readln(f,s);
•	luokannimi := erota(s,’:’);
•	pyydetään orrelta tätä luokan nimeä vastaava uuden olion ilmentymä (vähän kuten TOrsi.Monista on nyt, mutta luokan nimen perusteella).  Eli orsi käy läpi kaikki päällänsä olevat muodot ja jos jollakin muodolla on sama luokan nimi, monistaa tällaisen olion.
•	kun olion ilmentymä on saatu, asetetaan attribuutit tietysti muoto.AsString := s;
•	vinkkiä voit katsoa esimerkiksi mallista n:\kurssit\cpp\moniste\esim\olioalk\luokkalis\elain.pas