Win32 sanomat
Mureakuha
Sanomapohjaisuus
Oheinen kuva esittää yleisesti sanomapohjaista ohjelmointiympäristöä. Tällaisia ympäristöjä ovat kaikki Windows versiot, Unix, Linux, Symbian ja yleensäkin kaikki graafiset käyttöjärjestelmät. Tekstipohjaisissa ympäristöissä kutsutaan funktioita (esim. C -kirjasto), jotta saataisiin käyttäjältä syöte. Sanomapohjaisessa ympäristössä puolestaan odotetaan, että käyttöjärjestelmä toimittaa viestit. Graafisessa käyttöliittymässä kohdistimen käyttö mahdollistaa käyttäjältä tiedon syöttämisen useista vaihtoehtoisista kohteista ja ohjelman täytyy reagoida kaikkiin herätteisiin oikein.
Käyttäjän näppäimistön ja hiiren toiminnat muuttuvat ajurien avulla sanomiksi, jotka tulevat Windowsin sanomajonoon. Käyttöjärjestelmässä on yksi sanomajono ja jokaisella graafisen käyttöliittymän säikeellä omansa. Säikeitä eli samanaikaisesti suoritettavia ohjelmia ja ohjelman osia voi olla lukuisia. Säie saa oman jononsa, kun ensimmäisen kerran käytetään joko User tai GDI -kirjaston funktiota. Jokaisessa ohjelmassa voi puolestaan olla useita ikkunoita, joille osoittimen ja näppäimistön viestit voidaan lähettää. Viestit tulevat aina sen säikeen jonoon, jolla kyseinen ikkuna luotiin.
Sanomat jakautuvat kahteen ryhmään: säikeen jonon kautta kulkeviin ja jonon ohittaviin. Näppäimistön ja hiiren tai muun kohdistimen toiminnot kulkevat jonon läpi. Muita jonon kautta kulkevia ovat mm. WM_PAINT, WM_COMMAND, WM_TIMER, WM_QUIT ja PostMessage -funktion kautta tulevat. Suurin osa muista viesteistä ohittaa siis säikeen jonon (esim. SendMessage -funktion kautta). Viestit tulevat jonon läpi tulojärjestyksessä. Poikkeuksena on kuitenkin WM_PAINT, joka lähetetään säikeen jonoon vasta, kun jono on tyhjä. Sanomia siis tulee epämääräisessä järjestyksessä, ajoin ja epämääräisille kohteille. Hetkittäin voi olla ettei ohjelma saa yhtään sanomaa, mutta seuraavassa tilanteessa niitä tulee ryöpsähdyksen omaisesti enemmän kuin käyttöjärjestelmä pystyy käsittelemään.
Windows-käyttöjärjestelmissä tärkeimmät sanomat ovat WM-alkuisia (WM = Windows Message). Nämä sanomat ovat vain C-kielen define-määrittelyllä tehtyjä numerovakioita. Ohjelmointia helpottamaan sanomat on nimetty kuvaamaan tapahtumaa. Esimerkiksi WM_PAINT tarkoittaa että ohjelman tulisi piirtää ruutunsa uudelleen mahdollisesti, koska käyttäjä on siirtänyt ikkunaa, ohjelman on peittänyt toinen ohjelmaikkuna tai ehkä käyttäjä on vaihtanut Windowsin asetuksia ja ikkunan taustaväri pitää piirtää toisella värillä. Mahdollisuuksia on useita eikä sillä ohjelmoinnin kannalta ole mitään merkitystä.
Sanomajonosta käyttöjärjestelmä noutaa suoritukseen joutuvat sanomat ja antaa sen sanoman kohteena olevalle säikeelle. Ohjelma hakee viestit jonosta sanomasilmukkaan, josta ne tulevat varsinaiseen suorituskoodiin itse ohjelman ikkunaproseduuriin. Tyypillisesti ikkunaproseduurissa on suuri switch-case-rakenne jossa on oma case-kohtansa jokaiselle sanomalle. Tässä ohjelmoijan tehtäväna on kirjoittaa koodi jotta ohjelman toiminta olisi oikein. Esimerkiksi kuvankäsittelyohjelmassa WM_PAINT sanomassa piirretään käsiteltävä kuva.
Mikäli ohjelmoija ei halua muuttaa sanoman oletustoimintaa, voi työn jättää käyttöjärjestelmälle. Tällön sanoma menee sanomien oletuskäsittelijälle. Esimerkiksi omassa ohjelmassasi voit jättää WM_SIZE sanoman käsittelemättä, jos et tarvitse tietää miksi ikkunan koko muuttui tai uutta kokoa.
Tärkeimpiä Windows-sanomia
Ikkunan käsittelyohjelma on muodoltaan
LRESULT CALLBACK WindowProc(HWND hwnd, // ikkunan kahva UINT uMsg, // viesti WPARAM wParam, // viestin ensimmäinen parametri LPARAM lParam // viestin toinen parametri );
| viesti (uMsg) | merkitys | muut parametrit | paluuarvo |
|---|---|---|---|
| WM_CREATE | Ikkuna on perustettu. Jokaisen ikkunan ensimmäinen viesti | lParam: osoite tietueeseen CREATESTRUCT (CreateWindow -käskyn parametrit) | 0, jos jatketaan -1, jos ikkuna halutaan tuhota |
| WM_DESTROY | Ikkunan lopetussanoma | - | 0 |
| WM_PAINT | Ikkunan maalaussanoma | wParam: piirtopinnan kahva | 0 |
| WM_MOUSEMOVE | Hiirtä (kohdistinta) liikutettiin. Yleisin viesti, joita tulee paljon | x=LOWORD(lParam), y=HIWORD(lParam), fwKeys=wParam (Ctrl,Shift,hiiren nappien tila) | - |
| WM_CHAR | Näppäimistöä käytettiin (TranslateMessage -funktion lopputulos WM_KEYDOWN -viesteistä) | wParam: merkki, lParam: lisätietoa | 0 |
| WM_SIZE | Ikkunan kokoa muutettiin | wParam: koon muuttamisen tyyppi, leveys=LOWORD(lParam), korkeus=HIWORD(lParam) | 0 |
| WM_COMMAND | Kontrollien sanomat, valikon viestit, näppäinyhdistelmät | HIWORD(wParam): tapahtuman tunnus, LOWORD(wParam): lapsi-ikkunan tunnus, lParam: lapsi-ikkunan kahva (jos kyseessä ei ole näppäinyhdistelmä) | 0 |
| WM_NOTIFY | Kontrollien sanomia | wParam: Lapsi-ikkunan tunnus, lParam: osoite tietueeseen NMHDR | riippuu viestistä |
| WM_HSCROLL | Vaakasuuntaisen vierityspalkin sanomia | wParam alaosa: Luku, joka kertoo mitä vierityspalkille tehtiin, SB-alkuisia symbolivakioita wParam yläosa: Riippuu alaosasta | 0 |
| WM_VSCROLL | Pystysuuntaisen vierityspalkin sanomia | wParam alaosa: Luku, joka kertoo mitä vierityspalkille tehtiin, SB-alkuisia symbolivakioita wParam yläosa: Riippuu alaosasta | 0 |
Kopio lisenssistä (englanniksi) löytyy täältä.
Alkuperäinen (c) Petteri Hämäläinen

