Win32 sanomat

Mureakuha

Loikkaa: valikkoon, hakuun

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.

Kuva:Win32_sanomajono.PNG

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.

Kuva:Win32_sanomajonotarkemmin.png

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
);
Tulevia viestejä ovat:
viesti (uMsg)merkitysmuut parametritpaluuarvo
WM_CREATEIkkuna on perustettu. Jokaisen ikkunan ensimmäinen viestilParam: osoite tietueeseen CREATESTRUCT (CreateWindow -käskyn parametrit)0, jos jatketaan
-1, jos ikkuna halutaan tuhota
WM_DESTROYIkkunan lopetussanoma-0
WM_PAINTIkkunan maalaussanomawParam: piirtopinnan kahva0
WM_MOUSEMOVEHiirtä (kohdistinta) liikutettiin. Yleisin viesti, joita tulee paljonx=LOWORD(lParam), y=HIWORD(lParam), fwKeys=wParam (Ctrl,Shift,hiiren nappien tila)-
WM_CHARNäppäimistöä käytettiin (TranslateMessage -funktion lopputulos WM_KEYDOWN -viesteistä)wParam: merkki, lParam: lisätietoa0
WM_SIZEIkkunan kokoa muutettiinwParam: koon muuttamisen tyyppi, leveys=LOWORD(lParam), korkeus=HIWORD(lParam)0
WM_COMMANDKontrollien sanomat, valikon viestit, näppäinyhdistelmätHIWORD(wParam): tapahtuman tunnus, LOWORD(wParam): lapsi-ikkunan tunnus, lParam: lapsi-ikkunan kahva (jos kyseessä ei ole näppäinyhdistelmä)0
WM_NOTIFYKontrollien sanomiawParam: Lapsi-ikkunan tunnus, lParam: osoite tietueeseen NMHDRriippuu viestistä
WM_HSCROLLVaakasuuntaisen vierityspalkin sanomiawParam alaosa: Luku, joka kertoo mitä vierityspalkille tehtiin, SB-alkuisia symbolivakioita

wParam yläosa: Riippuu alaosasta

lParam: Vaakasuuntaisen vierityspalkin kahva
0
WM_VSCROLLPystysuuntaisen vierityspalkin sanomiawParam alaosa: Luku, joka kertoo mitä vierityspalkille tehtiin, SB-alkuisia symbolivakioita

wParam yläosa: Riippuu alaosasta

lParam: Pystysuuntaisen vierityspalkin kahva
0
Tämän dokumentin kopiointi, levittäminen sekä muokkaaminen on sallittua GNU Free Documentation Licensen version 1.2 tai uudemman Free Software Foundationin julkaiseman version mukaisesti, ilman muuttumattomuuslauseketta tai kansitekstejä. Tätä koskee vastuuvapaus.
Kopio lisenssistä (englanniksi) löytyy täältä.

Alkuperäinen (c) Petteri Hämäläinen

Henkilökohtaiset työkalut