<map version="0.7.1">
<node TEXT="GKO, luennot 3.-5.6.2004">
<node TEXT="WinAPI (API == Appication Programming Interface)" FOLDED="true" POSITION="right">
<node TEXT="Kertaus: tapahtumapohjaiset DOS-ohjelmat"/>
<node TEXT="Milloin puhtaita WinAPI-ohjelmia?">
<node TEXT="Maksimaalinen suorituskykytarve (ei &quot;ylim&#xe4;&#xe4;r&#xe4;isi&#xe4;&quot; v&#xe4;likerroksia sovelluksen ja Windowsin v&#xe4;lill&#xe4;)"/>
<node TEXT="Windows-kontrollien osalta minimaalinen k&#xe4;ytt&#xf6;liittym&#xe4;tarve"/>
<node TEXT="Pelit (WinAPI+DirectX)"/>
</node>
<node TEXT="K&#xe4;yt&#xe4;nn&#xf6;ss&#xe4; WinAPI-kutsuja tarvitaan tavallisissa Delphi-ohjelmissakin, kun k&#xe4;ytet&#xe4;&#xe4;n Windowsin ominaisuuksia, joita ei ole &apos;paketoitu&apos; komponenteiksi">
<node TEXT="Joskus voi olla jopa helpompaa k&#xe4;ytt&#xe4;&#xe4; suoraa API-kutsua kuin k&#xe4;ytt&#xe4;&#xe4; komponenttia"/>
</node>
<node TEXT="Kaikkien Windowsin osa-alueiden ohjelmointi on pohjimmiltaan API-kutsuja funktioihin, jotka sijaitsevat omissa DLL-tiedostoissaan" FOLDED="true">
<node TEXT="Esim (ks. MS SDK):" FOLDED="true">
<node TEXT="ODBC-kutsut tietokantoihin"/>
<node TEXT="ISAPI - web-palvelimen ohjelmointirajapinta"/>
<node TEXT="MAPI -viestij&#xe4;rjestelm&#xe4;"/>
<node TEXT="Multimedia API (Media Player ym...)"/>
<node TEXT="Setup API (windows installer)"/>
<node TEXT="Sockets (verkko-ohjelmointi)"/>
</node>
<node TEXT="N&#xe4;iden p&#xe4;&#xe4;lle on rakennettu uudemmissa rajapinnoissa k&#xe4;ytetyt OLE/COM/ActiveX-komponentit, jotka nekin ovat DLL-tiedostojen (oik. OCX) kaltaisia komponentteja"/>
<node TEXT="DLL-tiedostojen k&#xe4;yt&#xf6;st&#xe4; oma luento..."/>
</node>
<node TEXT="Puhtaan WinAPI-sovelluksen luominen" FOLDED="true">
<node TEXT="C++ Builder:">
<node TEXT="Luo uusi konsoliprojekti (console wizard) "/>
<node TEXT="K&#xe4;&#xe4;nn&#xe4; wizardissa kaikki optiot (use vcl/clx, multi threaded ja console application) pois p&#xe4;&#xe4;lt&#xe4;"/>
</node>
<node TEXT="Visual C++">
<node TEXT="Luo uusi ty&#xf6;tila/projekti (file-&gt;new) ja valitse Win32 Application. Huomaa, ett&#xe4; projektille tehd&#xe4;&#xe4;n oma hakemisto."/>
<node TEXT="&apos;Hello World&apos;-application on toimiva yksinkertainen esimerkki, uutta projektia tehdess&#xe4; kannattaa valita &apos;simple win32 application&apos;"/>
</node>
</node>
<node TEXT="Materiaali: Winohj-moniste, luku 3" FOLDED="true">
<node TEXT="DEF-tiedostoja ei tarvita c++ builderilla eik&#xe4; MFC-sovelluksissa"/>
<node TEXT="WinAPI-perusk&#xe4;sitteit&#xe4;">
<node TEXT="Kahva (handle)" FOLDED="true">
<node TEXT="kokonaislukuja, eri resursseille omat kahvansa"/>
<node TEXT="esim. ikkunakahva, tiedostokahva, s&#xe4;iekahva..."/>
<node TEXT="My&#xf6;s dephiss&#xe4; win-kontrolleista saa kahvan Handle-propertylla. T&#xe4;ll&#xf6;in VCL-komponentteja voidaan k&#xe4;sitell&#xe4; suoraan WinAPI-kutsuilla"/>
</node>
<node TEXT="Esiintym&#xe4; (instance)">
<node TEXT="Huom. useampikertaisten esiintymien kielt&#xe4;minen hPrevInstancen avulla ei toimi Win32:ssa (Win95 ja my&#xf6;hemm&#xe4;t.)">
<node TEXT="Syy: jokainen ohjelma ajetaan 32-bittisess&#xe4; windowsissa omassa koodisegmentiss&#xe4;&#xe4;n (vrt. winohj-kirja)"/>
</node>
<node TEXT="Uudempi tapa esim. nimettyjen Mutexien avulla, kuvattu Win32 Developer&apos;s referencessa (index: winmain)">
<node TEXT="Muita l&#xe4;hestymistapoja: ks. WinAPI-linkit"/>
</node>
</node>
<node TEXT="Viestijono">
<node TEXT="J&#xe4;rjestelm&#xe4; tarjoaa jokaiselle s&#xe4;ikeelle oman viestijonon, jossa ovat sovelluksen yksityiset viestit "/>
<node TEXT="Lis&#xe4;ksi globaalissa hardware-jonossa ovat hiiren ja n&#xe4;pp&#xe4;imist&#xf6;n tapahtumat"/>
<node TEXT="Viestisilmukan getmessage (tai peekmessage) -kutsut lukevat kumpaakin jonoa"/>
</node>
<node TEXT="Viestisilmukka">
<node TEXT="vrt. DOS-autolaskurin viestisilmukka"/>
<node TEXT="jokainen windows-sovellusohjelma sis&#xe4;lt&#xe4;&#xe4; viestisilmukan">
<node TEXT="1. tutkitaan, onko windowsin viestijonossa viestej&#xe4; (getMessage)"/>
<node TEXT="2. l&#xe4;hetet&#xe4;&#xe4;n viesti oikealle ikkunalle (dispatchMessage)"/>
<node TEXT="Delphi-ohjelmissa viestisilmukka on piilotettu Application-luokan ProcessMessage-metodiin (Application.Run -metodi kutsuu)" FOLDED="true">
<node TEXT="S&#xe4;&#xe4;st&#xe4;&#xe4; koodaajalta saman koodin kirjoittamisen jokaiseen ohjelmaan..."/>
</node>
</node>
</node>
<node TEXT="Ikkunafunktio (window procedure)">
<node TEXT="jokainen windows-ikkuna (+dialogi) sis&#xe4;lt&#xe4;&#xe4; ikkunafunktion">
<node TEXT="CALLBACK-tyyppi: windows kutsuu ikkunafunktiota, kun ikkuna saa viestin (oik. funktio-osoitin!)"/>
<node TEXT="_export: julistetaan funktio &apos;ulos&apos; omasta moduulistaan, jolloin sit&#xe4; voidaan kutsua muista ohjelmista"/>
<node TEXT="P&#xe4;&#xe4;ikkunalla MainWndProc -funktio ">
<node TEXT="p&#xe4;&#xe4;ikkunafunktion t&#xe4;ytyy sis&#xe4;lt&#xe4;&#xe4; ainakin WM_DESTROY-k&#xe4;sittelij&#xe4;, jota kutsutaan ohjelmasta poistuttaessa"/>
<node TEXT="Laajemmissa windows-ohjelmissa vaarana, ett&#xe4; switch/case-lause kasvaa kohtuuttoman laajaksi"/>
<node TEXT="Apuna omien funktioiden kutsu case-k&#xe4;sittelij&#xe4;ss&#xe4; (vrt. Delphin tapahtumat), oma taulukkoviritys viestien k&#xe4;sittelyyn (vrt. dos-autolaskuri) tai molemmat edelliset kapseloivan sovelluskehyksen (VCL/CLX, MFC, wxWidgets...) k&#xe4;ytt&#xf6;."/>
</node>
</node>
</node>
<node TEXT="Laiteyhteys (Device Context)">
<node TEXT="Joukko ikkunaan liittyvi&#xe4; piirtoattribuutteja (v&#xe4;rit, fontit ym) ja piirtofunktioita"/>
<node TEXT="Voidaan ottaa k&#xe4;ytt&#xf6;&#xf6;n tai luovuttaa tarvittaessa"/>
<node TEXT="Delphiss&#xe4; Canvas-luokka kapseloi laiteyhteyden"/>
<node TEXT="Hidas... nopeaa piirtoa varten DirectX"/>
</node>
</node>
</node>
<node TEXT="Lis&#xe4;materiaali: Delphilinkit"/>
<node TEXT="Esimerkki: whello"/>
<node TEXT="Esimerkki (useamman viestin k&#xe4;sittely): samplew"/>
<node TEXT="Jos ehtii: kolmio ja tabhand"/>
<node TEXT="esik&#xe4;&#xe4;nt&#xe4;j&#xe4;: CPP32 tai builderin ponnahdusvalikon preprocess-komento">
<node TEXT="includattujen tiedostojen ja laajennettujen makrojen tarkastelu"/>
</node>
</node>
<node TEXT="Viestink&#xe4;sittelyst&#xe4;" POSITION="right">
<node TEXT="K&#xe4;ytt&#xe4;j&#xe4; voi l&#xe4;hett&#xe4;&#xe4; ja tutkia viestej&#xe4; manuaalisesti WinAPI-kutsuilla" FOLDED="true">
<node TEXT="PostMessage l&#xe4;hett&#xe4;&#xe4; viestin jonoon ja palaa v&#xe4;litt&#xf6;m&#xe4;sti kutsuvaan funktioon">
<node TEXT="Mahdollistaa omien funktioiden &apos;viiv&#xe4;stetyn&apos; suorituksen"/>
<node TEXT="Huom. jos windowsin viestijono on t&#xe4;ynn&#xe4;, viesti&#xe4; ei l&#xe4;hetet&#xe4;. T&#xe4;m&#xe4;n voi tarkistaa funktion paluuarvosta ja tarvittaessa l&#xe4;hett&#xe4;&#xe4; viesti uudelleen."/>
</node>
<node TEXT="SendMessage l&#xe4;hett&#xe4;&#xe4; viestin jonoon ja odottaa, kunnes se on suoritettu"/>
<node TEXT="PeekMessage tutkii, onko viestijonossa viestej&#xe4; ja &apos;poimii&apos; tarvittaessa viestin. T&#xe4;ll&#xf6;in k&#xe4;ytt&#xe4;j&#xe4; voi tehd&#xe4; useita viestisilmukkaa vastaavia rakenteita ohjlemaan (ks. checker.c)">
<node TEXT="Jos viesti poimitaan, on yleens&#xe4; syyt&#xe4; tehd&#xe4; normaalit Translate- ja DispatchMessage-kutsut"/>
</node>
</node>
<node TEXT="Esimerkki viestin l&#xe4;hetyksest&#xe4; ja k&#xe4;sittelyst&#xe4; Delphiss&#xe4; ja C++ Builderissa: simplemessages"/>
<node TEXT="K&#xe4;ytt&#xe4;j&#xe4; voi m&#xe4;&#xe4;ritell&#xe4; omia viestityyppej&#xe4; WM_USER-arvon yl&#xe4;puolelle (ks. Win32 SDK: Application-defined messages) tai korttipeliesimerkin hullufinal.pas">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
</node>
<node TEXT="Moniajon mahdollistaminen piirt&#xe4;misen aikana: checker ja simplet\kolmiom.c" FOLDED="true">
<node TEXT="Idea: k&#xe4;yd&#xe4;&#xe4;n tutkimassa viestink&#xe4;sittelij&#xe4;ss&#xe4; s&#xe4;&#xe4;nn&#xf6;llisin v&#xe4;liajoin, onko viestijonossa uusia viestej&#xe4;."/>
<node TEXT="Moniajoa voidaan Win32:ssa toteuttaa my&#xf6;s s&#xe4;ikeill&#xe4; (tosin VCL-komponenttien piirto ruudulle t&#xe4;ytyy tehd&#xe4; synkronoidusti)"/>
<node TEXT="simplemessages-esimerkkiin lis&#xe4;tty my&#xf6;s &#xe4;&#xe4;rimm&#xe4;isen yksinkertaistettu versio checkeri&#xe4; vastaavasta toiminnasta delphill&#xe4;"/>
<node TEXT="S&#xe4;ikeist&#xe4; enemm&#xe4;n TCP/IP-luennolla..."/>
</node>
<node TEXT="Useita komponentteja ikkunassa: whello/thello" FOLDED="true">
<node TEXT="ikkunalla olevien komponenttien viestit k&#xe4;sitell&#xe4;&#xe4;n ikkunafunktiossa WM_COMMAND-viestin alla"/>
</node>
</node>
<node TEXT="MFC" FOLDED="true" POSITION="right">
<node TEXT="Materiaali: Olio-ohjelmointi ja C++, APF-ohjelmarunko"/>
<node TEXT="Ks. my&#xf6;s MFC-linkit Delphilinkeist&#xe4;"/>
<node TEXT="MFC k&#xe4;ytt&#xe4;&#xe4; resurssitiedostoja kuten WinAPIkin, mutta j&#xe4;rjestelm&#xe4;kutsut on kapseloitu luokkiin">
<node TEXT="Esim. MFC-luokkahierarkia">
<node TEXT="Sovellusluokka peritty CWinApp-luokasta"/>
</node>
</node>
<node TEXT="MFC:n viestink&#xe4;sittely: luodaan MESSAGE_MAP-makroilla metodiosoitintaulukko">
<node TEXT="Visual C++ tukee taulukon keskitetty&#xe4; hallintaa"/>
<node TEXT="Esim: Visual C++ -oletussovellus"/>
</node>
<node TEXT="MFC tukee Microsoftin ideaa Asiakirjakeskeisest&#xe4; k&#xe4;sittelyst&#xe4; (&quot;kaikki&quot; sovellukset ovat asiakirjaeditoreja, jotka OLE:n avulla kommunikoivat kesken&#xe4;&#xe4;n, ks. esim. Visual C++:n oletussovellus)"/>
<node TEXT="Esimerkit mfc-hakemistossa: kolmio ja laskuri"/>
</node>
<node TEXT="Resurssit" POSITION="left">
<node TEXT="Windowsin (Wanha) standarditapa liitt&#xe4;&#xe4; staattista tietoa sovelluksen"/>
<node TEXT="Visual C++:ssa resurssitiedostot _ovat_ k&#xe4;ytt&#xf6;liittym&#xe4;n tallennusformaatti, Borlandin ty&#xf6;kaluissa k&#xe4;ytet&#xe4;&#xe4;n l&#xe4;hinn&#xe4; merkkijonojen ja bittikarttojen tallentamiseen"/>
<node TEXT="Voivat sis&#xe4;lt&#xe4;&#xe4; merkkijonoja, bittikarttoja, ikoneita, pikan&#xe4;pp&#xe4;imi&#xe4;, menuja ym. komponentteja, dialogeja k&#xe4;ytt&#xf6;liittymineen..."/>
<node TEXT="K&#xe4;ytet&#xe4;&#xe4;n edelleen monikielist&#xe4;miseen: tehd&#xe4;&#xe4;n useita resurssitiedostoja, joihin sijoitetaan kaikki sovelluksen merkkijonot">
<node TEXT="Lis&#xe4;&#xe4; &apos;monikieliset ohjelmat&apos;-luennolla..."/>
</node>
<node TEXT="Tekstitiedostoja, my&#xf6;s visuaalisia editoreja saatavilla" FOLDED="true">
<node TEXT="Visual C++:n resussieditori"/>
<node TEXT="Borlandin Resource Workshop (tulee Borland C++:n, mutta ei C++ Builderin mukana)"/>
<node LINK="http://www.cs.virginia.edu/~lcc-win32/" TEXT="LCC - ilmainen C/WIN32 -IDE"/>
<node LINK="http://www.sicomponents.com/rbldr.html" TEXT="ResourceBuilder - shareware"/>
</node>
<node TEXT="RC-l&#xe4;hdekoodi k&#xe4;&#xe4;nnet&#xe4;&#xe4;n RES-tiedostoksi ja linkitet&#xe4;&#xe4;n EXE-koodiin" FOLDED="true">
<node TEXT="K&#xe4;&#xe4;nn&#xf6;ksen voi tehd&#xe4; k&#xe4;sin BRCC-k&#xe4;&#xe4;nt&#xe4;j&#xe4;ll&#xe4;"/>
<node TEXT="Jos RC-tiedosto on projektissa, se k&#xe4;&#xe4;nnet&#xe4;&#xe4;n ja linkitet&#xe4;&#xe4;n automaattisesti"/>
<node TEXT="Huom! jos RC- tai RES- tiedostoa ei ole projektissa, ohjelma ei l&#xe4;hde k&#xe4;yntiin!"/>
</node>
<node TEXT="Esimerkki resurssien yhteisk&#xe4;yt&#xf6;st&#xe4; VC++:ssa ja BCB:ss&#xe4;: vctest"/>
<node TEXT="resursseilla tehty autolaskuri: winlaski\reslask" FOLDED="true">
<node TEXT="hakemisto sis&#xe4;lt&#xe4;&#xe4; eri frameworkeill&#xe4; tehtyj&#xe4; laskureita"/>
<node TEXT="winlaski\menu5 - kuvilla ja animaatiolla varustettu laskuri"/>
</node>
<node TEXT="Tietoa resursseista Win32 SDK -avustuksessa:">
<edge WIDTH="thin"/>
<font NAME="SansSerif" SIZE="12"/>
<node TEXT="Yleiskatsaus: Microsoft Win32 Programmer&apos;s Reference: Resources"/>
<node TEXT="Resurssitiedostojen tarkka syntaksi: Resource Compiler&apos;s users guide (tai hakemalla esim: CONTROL - general control. t&#xe4;ll&#xf6;in sivuja p&#xe4;&#xe4;see selaamaan)"/>
</node>
</node>
<node TEXT="MDI, useamman ikkunan k&#xe4;sittely" POSITION="left">
<node TEXT="Ikkunatyypeist&#xe4;" FOLDED="true">
<node TEXT="SDI == Single Document Interface, sovelluksessa yksi p&#xe4;&#xe4;ikkuna" FOLDED="true">
<node TEXT="Klassinen Windows-sovellustyyppi"/>
</node>
<node TEXT="MDI == Multiple document interface, p&#xe4;&#xe4;ikkuna, joka sis&#xe4;lt&#xe4;&#xe4; lapsi-ikkunoita"/>
<node TEXT="Nykyisiss&#xe4; sovelluksissa suosittu tapa my&#xf6;s koota sovellus &quot;kelluvista&quot; ikkunoista, joita voi dockata ja j&#xe4;rjestell&#xe4; uudelleen. ">
<node TEXT="Vaarana on, ett&#xe4; k&#xe4;ytt&#xe4;j&#xe4; p&#xe4;&#xe4;see &apos;pilaamaan&apos; k&#xe4;ytt&#xf6;liittym&#xe4;ns&#xe4;"/>
<node TEXT="Toivottava ominaisuus: ikkunoiden &apos;lukitseminen&apos;"/>
</node>
</node>
<node TEXT="WinAPI-kutsut ikkunoiden k&#xe4;sittelyyn" FOLDED="true">
<node TEXT="Modaalinen dialogi luodaan kutsulla DialogBox, tuhotaan kutsulla EndDialog. Modaaliselle dialogille ei tarvitse kirjoittaa viestisilmukkaa"/>
<node TEXT="Modeless-dialogi luodaan kutsulla CreateDialog. Lis&#xe4;ksi vanhempi-ikkunan viestisilmukassa on otettava huomioon dialogit"/>
<node TEXT="Tavalliset ikkunat luodaan CreateWindow-kutsulla"/>
</node>
<node TEXT="Delphill&#xe4; ikkunoita voi k&#xe4;sitell&#xe4; helposti Show- ja Close-metodeilla. MDI-sovelluksissa lis&#xe4;ksi MDI-ikkunoiden kutsut">
<node TEXT="Actionlistissa ja TForm-luokassa on vakiotoiminnot MDI-sovelluksen k&#xe4;sittelyyn (esim. Cascade, Tile, Next/Prev window...) "/>
<node TEXT="Ikkunoita suljettaessa otettava huomioon tuhotaanko vai piilotetaanko ikkuna suljettaessa" FOLDED="true">
<node TEXT="Jos ikkuna tuhotaan ja se halutaan luoda uudelleen, se t&#xe4;ytyy luoda konstruktorilla uudelleen"/>
<node TEXT="ikkunan voi tuhota manuaalisesti TFormin release-metodilla"/>
</node>
<node TEXT="MDI-sovelluksen voi luoda delphill&#xe4;: File-&gt;New-&gt;Other-&gt;Projects-&gt;MDI Application">
<node TEXT="ActionListin ansiosta MDI-perustoiminnot syntyv&#xe4;t l&#xe4;hes ilman koodia, vrt. Visual C++:n MFC Wizard Koodigeneraattori -hirvitys :-)"/>
<node TEXT="Luotaessa MDI-ikkunaan lapsi-ikkunoita dynaamisesti FormStylen oltava fsMDIChild"/>
<node TEXT="Huom. MDI-lapsi-ikkunaa ei voi piilottaa!"/>
</node>
</node>
</node>
<node TEXT="Delphi-MDI -esimerkki" POSITION="left"/>
<node TEXT="WinAPI / MFC-esimerkki: vaihtaja" POSITION="left"/>
<node TEXT="Delphi-esimerkki: mittakaavamuunnos (vaatii kave-komponenttipaketin)" POSITION="left"/>
<node TEXT="T&#xe4;ydennyst&#xe4;" POSITION="left">
<node TEXT="Simplemessages revisited" FOLDED="true">
<node TEXT="WinAPI-viestien k&#xe4;sittely C++ Builder / VCL -sovelluksessa"/>
<node TEXT="Checkers.c -tyylisen toiminnallisuuden tekeminen Delphill&#xe4;"/>
</node>
<node TEXT="viel&#xe4; Delphin ja C++:n eroista" FOLDED="true">
<node TEXT="Delphin ja C++:n destruktoreissa on erilainen logiikka" FOLDED="true">
<node TEXT="C++:n luokka &apos;puretaan&apos; destruktoria kutsuttaessa, ks. C++ ja Olio-ohjelmointi "/>
<node TEXT="Delphiss&#xe4; luokka on kokonainen, kunnes se tuhotaan. T&#xe4;ll&#xf6;in eri yli- ja aliluokkien destruktorit n&#xe4;kev&#xe4;t saman version luokasta"/>
<node TEXT="Seuraus: erilainen k&#xe4;ytt&#xe4;ytyminen virtuaalifunktioiden kutsumisen suhteen"/>
<node TEXT="Esim: Destruct"/>
</node>
<node TEXT="C++:n metodiosoitin on Delphin vastaavaa rajoittuneempi" FOLDED="true">
<node TEXT="Delphin metodiosoitin osoittaa suoraan tietyn luokan metodiin ja osoitin voidaan ohjata toisen luokan vastaavaan metodiin"/>
<node TEXT="C++:n metodiosoittimessa t&#xe4;ytyy ilmaista luokka, jonka metodiin metodiosoitin osoittaa">
<node TEXT="Metodia kutsuttaessa olio t&#xe4;ytyy ilmoittaa erikseen"/>
</node>
<node TEXT="C++:n metodiosoittimen rajoittuneisuus on Builderissa kierretty ep&#xe4;standardilla __closure -avainsanalla, joka tarjoaa Delphin tapahtumia vastaavan k&#xe4;sittelyn">
<node TEXT="Ks. Builderin avustus: keyword extensions"/>
<node TEXT="Seuraus: C++ -builderilla tehty VCL-koodi _ei ole_ standardia C++:aa!"/>
</node>
</node>
<node TEXT="C++ tukee normaalisti moniperint&#xe4;&#xe4;, mutta uusien VCL-luokkien luonti moniperinn&#xe4;ll&#xe4; ei ole niiden Delphi-pohjaisuudesta johtuen mahdollista"/>
</node>
<node TEXT="ShellExecute, tekniikka sovellusten k&#xe4;ynnist&#xe4;miseen" FOLDED="true">
<node TEXT="Ali-hakemistoon lis&#xe4;tty ExecUnit ja ExecTest-esimerkki"/>
</node>
</node>
</node>
</map>
