Win32 ikkunaluokat
Mureakuha
Sisällysluettelo |
Kontrollit
Kaikki käyttäjän näkemät painikkeet, listat, scrollauspalkit jne. ovat ohjelmoijan kannalta ikkunoita tai oikeammin kontrolleja. Kontrollit ovat täysin itsenäisiä ohjelmakokonaisuuksia. Ne osaavat automaattisesti käsitellä sanomat, piirtää itsensä ja yleensäkin tehdä toiminnon, johon kyseinen kontrolli on suunniteltu. Painonappi on tarkoitettu painettavaksi hiirellä ja käyttäjä ymmärtää sen aloittavan jonkin toiminnan. Vierityspalkilla puolestaan pitää vierittää listan tai ikkunan näkyvää aluetta. Näiden peruskontrollien toimintaa ei pidäkkään muuttaa koska se aiheuttaa vain uuden opiskelun vaivan käyttäjältä.
Kontrolleja pystytään muokkaamaan sallituissa rajoissa valitsimilla. Esimerkiksi ryhmäkehys, painonappi, valintanappi ja valintaruutu (kts alla) ovat yksi ja sama kontrolli mutta sen ulkonäkö valitaan tietyllä valitsimella.
Kontrollit kertovat käyttäjän tekemistä toiminnoista omilla sanomillaan. Esimerkiksi kun nappia painetaan se piirtää itsensä ensin ala-asentoon ja käyttäjän päästäessä hiiren napin ylös, piirtää nappi itsensä yläasentoon. Nappi ei kuitenkaan osaa käynnistää mitään toimintoa itsestään vaan se lähettää ikkunalle, johon nappi on liitetty, sanoman. Tässä sanomassa kerrotaan yksityiskohtaisesti mikä nappi itseasiassa oli kysessä, jotta ohjelmoija pystyy erottamaan kaikki napit toisistaan, sekä toiminto mitä napille tapahtui. Nappi kertoo ala-asentoon joutumisen omalla sanomalla ja taas yläasentoon joutumisen toisella sanomalla. Myös hiiren tuplanapatus kerrotaan omalla sanomallaan. Ohjelmoija vastuulle jää käynnistää toiminto kun sopiva sanoma saadaan.
Tärkeimpiä kontrolliluokkia
button (nappi)
Tehtävä: Ryhmäkehys, painonappi, valintanappi tai valintaruutu.
Tärkeimmät valitsimet (CreateWindow -funktio):
- BS_PUSHBUTTON, painonappi
- BS_AUTORADIOBUTTON, valintanappi
- BS_AUTOCHECKBOX, valintaruutu
- BS_3STATE, kolmitilainen valintaruutu
- BS_GROUPBOX, ryhmäkehys
Tärkeimmät sanomat kontrollilta pääikkunalle (WM_COMMAND -viesti):
BN_CLICKED, lapsi-ikkunaa on painettu
Tärkeimmät sanomat pääikkunalta kontrollerille (SendMessage -funktio):
- BM_GETCHECK, palauttaa valintaruudun tai -napin tilan
- BM_SETCHECK, asettaa valintaruudun tai -napin tilan
static (tekstikehys)
Tehtävä: Esittää tekstikentän lomakkeella, jota ei voi käyttäjä muokata
Tärkeimmät valitsimet (CreateWindow -funktio):
SS_CENTER, teksti keskitetään SS_LEFT, teksti tasataan vasemmalle
scrollbar (vierityspalkki)
Tehtävä: Käytetään lomakkeen tai jonkin kontrollin sisällön vierittämiseen
Tärkeimmät valitsimet (CreateWindow -funktio):
- SBS_VERT, pystysuuntainen palkki
- SBS_HORZ, vaakasuuntainen palkki
Tärkeimmät sanomat kontrollilta (WM_COMMAND -viesti):
- SB_PAGEDOWN, vierityspalkin kuilua painetaan
- SB_PAGEUP, vierityspalkin kuilua painetaan
- SB_LINEDOWN, vierityspalkin vierityspainiketta painetaan
- SB_LINEUP, vierityspalkin vierityspainiketta painetaan
- SB_THUMBPOSITION, vierityslaatikkoa siirretään
- SB_THUMBTRACK, vierityslaatikko päästetään irti
edit (muokkausruutu)
Tehtävä: Esittää tekstikentän jota voidaan myös muokata
Tärkeimmät valitsimet (CreateWindow -funktio):
- ES_CENTER, teksti keskitetään
- ES_MULTILINE, teksti jaetaan automaattisesti usealle riville
Tärkeimmät sanomat kontrollilta (WM_COMMAND -viesti):
- EN_UPDATE, tekstiä on muuttunut
- EN_CHANGE, tekstiä ollaan muuttamassa
Tärkeimmät sanomat pääikkunalta kontrollerille (SendMessage -funktio):
- EM_UNDO, käyttäjä haluaa perua muutoksen
- WM_GETTEXT, kontrollin teksti kopioidaan puskuriin
listbox (luetteloruutu)
Tehtävä: Luetteloruutu, jossa näytetään useita tekstirivejä alekkain
Tärkeimmät valitsimet (CreateWindow -funktio):
LBS_STANDARD, sisältää tyylit LBS_NOTIFY, LBS_SORT, WS_VSCROLL, WS_BORDER
Tärkeimmät sanomat kontrollilta (WM_COMMAND -viesti):
- LBN_SELCHANGE, valinta on vaihdettu
- LBN_DBLCLK, kontrollia tuplanautettiin
Tärkeimmät sanomat pääikkunalta kontrollerille (SendMessage -funktio):
- LB_ADDSTRING, listaan lisätään uusi rivi
- LB_GETCURSEL, hakee valitun rivin järjestysnumeron
- LB_GETTEXT, hakee halutun rivin tekstin
- LB_DELETESTRING, poistaa halutun rivin
- LB_RESETCONTENT, koko lista tyhjennetään
combobox (yhdistelmäruutu)
Tehtävä: Edit tai static tyyppisen ja listbox typpisen kontollin yhdistelmä
Tärkeimmät valitsimet:
- CBS_DROPDOWN, kontrolliin voidaan kirjoittaa
- CBS_DROPDOWNLIST, kontrolliin ei voida kirjoittaa
Tärkeimmät sanomat kontrollilta lomakkeelle:
- CBN_SELCHANGE, valinta on vaihdettu
- CBN_DROPDOWN, avaa alasvetovalikon
Tärkeimmät sanomat lomakkeelta kontrollilta:
- CB_ADDSTRING, listaan lisätään uusi rivi
- CB_GETCURSEL, hakee valitun rivin järjestysnumeron
- CB_DELETESTRING, poistaa halutun rivin
- CB_GETLBTEXT, hakee valitun tekstin
common controls (yleiset kontrollit)
Tehtävä: Lisäkontrolleja (internet -selaimen versiosta riippuvia). Ennen käyttöä on suoritettava käsky InitCommonControls() tai InitCommonControlsEx(&comm) riippuen mikä versio on käytössä. Kontrolleja on noin 20 erilaista.
| luokan nimi | kuvaus | tyylejä |
|---|---|---|
| ANIMATE_CLASS | videopätkien näyttäminen | - |
| HOTKEY_CLASS | näppäinyhdistelmät | - |
| PROGRESS_CLASS | edistymäpalkki | - |
| STATUSCLASSNAME | tilarivi (ikkunan alalaita) | SBARS_SIZEGRIP, CCS_TOP |
| TOOLBARCLASSNAME | nappipalkki | TBSTYLE_ALTDRAG, TBSTYLE_TOOLTIPS, TBSTYLE_WRAPABLE |
| TOOLTIPS_CLASS | ponnahtavat vinkit | TTS_ALWAYSTIP, TTS_NOPREFIX |
| TRACKBAR_CLASS | liukukytkin | TBS_HORZ, TBS_VERT, TBS_AUTOTICKS, TSM_NOTICKS, TBS_BOTTOM, TBS_TOP, TBS_RIGHT, TBS_LEFT, TBS_BOTH, TBS_ENABLESELRANGE, TBS_FIXEDLENGTH, TBS_NOTHUMB |
| UPDOWN_CLASS | edit, jossa napit ylös ja alas tai vasemmalle ja oikealle | UDS_ALIGNLEFT, UDS_ALIGNRIGHT, UDS_ARROWKEYS, UDS_NOTHOUSANDS, UDS_HORZ, UDS_WRAP, UDS_SETBUDDYINT, UDS_AUTOBUDDY |
| WC_HEADER | otsikkorivi (listaan) | HDS_BUTTONS, HDS_HORZ, HDS_HIDDEN |
| WC_LISTVIEW | lista (taulukko) | noin 20 tyyliä |
| WC_TABCONTROL | välilehdet | yli 10 tyyliä |
| WC_TREEVIEW | puu | TVS_HASLINES, TVS_LINESATROOT, TVS_HASBUTTONS, TVS_LINESATROOT, TVS_EDITLABELS, TVS_SHOWSELALWAYS |
| Drag List Box | lista, jonka järjestystä voi muuttaa raahaamalla | Perustetaan MakeDragList -funktiolla |
| Imagelist | kuvaluettelo | Perustetaan ImageList_Create -funktiolla |
| Property Sheets | Perustetaan CreatePropertySheetPage ja PropertySheet -funktioilla | |
| RichEdit | edit, mutta enemmän tyylejä | noin 20 tyyliä, yleisin ES_MULTILINE |
Katso kontrolleriin liittyvät perustamisparametrit ja viestit Windowsin oppaista.
Yleiset sanomat kontrollilta ikkunalle:
- NM_CLICK, kontrollia on painettu
- NM_DBLCLK, kontrollia on tuplanapautettu
Kontrollien ohjaaminen
Kontrolleja pystyy ohjaamaan kutsumalla Windows API-funktioita eli järjestelmässä olevien dll -tiedostojen funktioita (esim. user32.dll ja comctl32.dll). Kontrolleja luodaan CreateWindow()-funktiolla. Sopivia parametrejä annettaessa saadaan tehtyä kaikki tarpeelliset kontrollit. Tärkeää on muistaa ottaa funktion palautusarvo talteen, se on ainoa keino saada kiinni tästä kontrollista, kun sitä myöhemmin halutaan ohjata. Tämä "kahva" täytyy antaa parametrinä kaikissa muissa funktioissa, jotta toiminto kohdistuu oikeaan osoitteeseen.
Alla on lista esimerkin omaisesti tärkeimmistä funktioista. Huomaa jokaisen metodin ensimmäinen parametri joka on juuri tuo kahva, jonka CreateWindow() palauttaa.
Tärkeimpiä funktioita
CreateWindow
HWND CreateWindow(lpClassName,lpWindowName,dwStyle,x,y,nWidth,nHeight,hWndParent,hMenu,hInstance,lpParam);
Tehtävä: Luo erityyppisiä lomakkeita ja kontrolleja
Parametrit:
- Luotavan ikkunan luokan nimi, jokin ylempänä mainittu kontrolliluokka
- Ikkunan otsikko, vapaata tekstiä
- Ikkunan tyyli, jokin ylempänä mainittu valitsin
- x-koordinaatti aluksi
- y-koordinaatti aluksi
- Ikkunan leveys
- Ikkunan korkeus
- Emoikkunan kahva, mihin kontrolli piirretään
- Ikkunan valikon kahva, menuja harvoin konrolleilla on
- Ohjelman ilmentymän kahva, Windows on moniajoympäristö joten ohjelma täytyy yksilöidä
- Luontiparametrit
Palautusarvo: Kahva uuteen ikkunaan, muuten NULL
Esimerkki: hwndGroupbox = CreateWindow ( "button", NULL, WS_CHILD | WS_VISIBLE | BS_GROUPBOX, 10, 10, 300, 200, hwnd, (HMENU) 1, hInstance, NULL ) ;
Ikkunaproseduuri
LRESULT CALLBACK WindowProc(hwnd, uMsg, wParam, lParam);
Tehtävä: Koodi, joka käsittelee ohjelman käyttöjärjestelmästä tulevat viestit (käyttäjän toimet)
Parametrit:
- Ikkunan kahva
- Sanoma
- Riippuu sanomasta
- Riippuu sanomasta
Palautusarvo: Riippuu viestistä, mutta yleensä nolla jos sanoma käsitellään. Muuten DefWindowProc()-funktion palauttama arvo
Esimerkki: LRESULT CALLBACK WndProc ( HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam ) ;
DefWindowProc
LRESULT DefWindowProc(hWnd, Msg, wParam, lParam);
Tehtävä: viestien oletuskäsittely. Jos koodissa ei haluta käsitellä kaikkia käyttöjärjestelmästä tulevia viestejä, loput viestit voi antaa tälle funktiolle.
Parametrit: samat kuin edellisessä.
SendMessage
LRESULT SendMessage(hWnd, Msg, wParam, lParam);
Tehtävä: Funktio lähettää halutunlaisen viestin lomakkeelle tai kontrollille
Parametrit:
- kohdeikkunan kahva
- sanoma
- sanomasta riippuva
- sanomasta riippuva
Palautusarvo: Riippuu sanomasta
Esimerkki: SendMessage ( hwndListbox, LB_ADDSTRING, 0, (LPARAM) bufferi ) ;
PostQuitMessage
void PostQuitMessage(nExitCode);
Tehtävä: Lopetetaan säie (thread). Käytetään yleensä ikkunan WM_DESTROY -viestissä. Funktio lähettää WM_QUIT -viestin, jolloin GetMessage -funktio saa paluuarvon 0.
Parametri: lopetuskoodi
GetClientRect
BOOL GetClientRect(hWnd, lpRect);
Tehtävä: Palauttaa lomakkeen sen hetkisen koon
Parametrit:
- Kohdeikkunan kahva
- Osoite RECT-struktuurin omaavaan muuttujaan
Palautusarvo: Nolla jos epäonnistuu, muuten jokin muu
Esimerkki: static RECT rect ; GetClientRect ( hwnd, &rect ) ;
GetWindowText
int GetWindowText(hWnd, lpString, nMaxCount);
Tehtävä: Kopioi määritellyn tekstin valitusta kohdekontrollista merkkijonomuuttujaan. Tämä on sama kuin suora kutsu SendMessage(hWnd, WM_GETTEXT, nMaxCount, lpString).
Parametrit:
- Kohdeikkunan kahva
- Merkkijonomuuttuja johon teksti kopioidaan
- Kopioitavien merkkien lukumäärä
Palautusarvo: Kopioidun merkkijonon pituus
Esimerkki: int pituus = GetWindowText ( hwndEdit, bufferi, 10 ) ;
SetWindowText
BOOL SetWindowText(hWnd, lpString);
Tehtävä: Vaihdetaan kohdekontrollin näyttämä teksti. Tämä on sama kuin suora kutsu SendMessage(hWnd, WM_SETTEXT, 0, lpString).
Parametrit:
- Kohdeikkunan kahva
- Merkkijono tai merkkijonomuuttuja
Palautusarvo: Nolla jos toiminto onnistuu, muuten jokin muu
Esimerkki: SetWindowText ( hwndStatic, "Uusi teksti" ) ;
MessageBox
int MessageBox(hWnd, lpText, lpCaption, uType);
Tehtävä: Kysyy käyttäjältä yksinkertaisia kysymyksiä pullahdusikkunalla
Parametrit:
- Omistajaikkunan kahva
- Tekstiviesti
- Otsikko
- Painonapit, modaalisuus ja kuvake
Palautusarvo: Riippuu käyttäjän painamasta painonapista
Esimerkki: int valinta = MessageBox ( hwnd, "Viesti tähän", "Otsikko", MB_YES ) ;
MoveWindow
BOOL MoveWindow(hWnd, x, y, nWidth, nHeight, bRepaint);
Tehtävä: Muuttaa minkä tahansa lomakkeen tai kontrollin paikkaa ja kokoa
Parametrit:
- Kohdeikkunan kahva
- Ikkunan vasen laita
- Ikkunan yläreuna
- Ikkunan leveys
- Ikkunan korkeus
- TRUE tai FALSE
Palautusarvo: Nolla jos epäonnistuu, muuten jokin muu
Esimerkki: MoveWindow ( hwndEdit, 50, 50, 100, 20, TRUE ) ;
Kopio lisenssistä (englanniksi) löytyy täältä.
Alkuperäinen (c) Petteri Hämäläinen
