5 Näppäimistö Näppäimistö (Keyboard) on Windows Forms -ohjelmissa keskeisessä asemassa. Erityisesti erilaisissa tekstinkäsittelyohjelmissa ja ohjelmissa, joissa tarvitaan datan syöttämistä esimerkiksi formissa oleviin tekstikenttiin. Lisäksi näppäimistöä on kätevä käyttää ohjelman kontrollointiin. Näppäimistöä käytetään esimerkiksi monissa tietokonepeleissä pelin ohjaukseen. Näppäimistön painallukset aiheuttavat näppäimistöön liittyvien eventtien signaloinnin ja tätä kautta kyseisiin eventteihin liitettyjen tapahtumankäsittelijöiden kutsumisen. Tällä tavalla näppäinpainallukset välittyvät Windows Forms -ohjelmaan. Kuvassa 5-1 on esitetty näppäimistön näppäinpainalluksien välittyminen Windows Forms -ohjelmaan. Kuva 5-1. Näppäinpainalluksien välittyminen Windows Forms -ohjelmaan. 5.1 Näppäimistön eventit Näppäimistön käsittelyn keskeisimmät elementit ovat näppäinten painalluksiin liittyvät eventit. Formin näppäimistön nappien painalluksiin liittyy seuraavat eventit. o PreviewKeyDown o KeyDown o KeyPress o KeyUp PreviewKeyDow-eventti signaloidaan heti, kun jotakin näppäimistön nappia painetaan. KeyDow-eventti signaloidaan napin laskevalla reunalla. KeyDown-eventin signaloinnin jälkeen signaloidaan välittömästi KeyPress-eventti. KeyUp-eventti signaloidaan heti, kun nappi vapautetaan eli napin nousevalla reunalla. Näille eventeille voidaan käsin kirjoittaa tapahtumankäsittelijöiden rungot formin luokkaan. www.stickmansoft.com 71
Tapahtumankäsittelijöiden luomisessa voidaan käyttää hyväksi myös Microsoft Visual Studio -ohjelman ominaisuuksia. Microsoft Visual Studio -ohjelmassa voidaan kaikille näille neljälle eventille luoda tapahtumankäsittelijät siten, että Properties-ikkunassa olevassa Events-välilehdellä suoritetaan tuplaklikkaus kyseisten eventtien kohdalla. Tällöin Formiin liitetyn lähdetekstitiedoston sisältämään luokkaan generoidaan tapahtumankäsittelijöiden rungot. Seuraavassa on esitetty kaikkien edellä mainittujen käsittelijöiden rungot, jotka on generoitu Microsoft Visual Studio -ohjelman avulla. private void WinForm_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)... private void WinForm_KeyDown(object sender, KeyEventArgs e)... private void WinForm_KeyPress(object sender, KeyPressEventArgs e)... private void WinForm_KeyUp(object sender, KeyEventArgs e)... Kuten edellä olevien tapahtumankäsittelijöiden ohjelmarungoista näkee, niin kaikkien tapahtumankäsittelijöiden toisena parametrina on jokin EventArgs-tyyppinen parametri. Näiden parametrien avulla saadaan selvitettyä esimerkiksi mitä nappia on painettu, onko samanaikaisesti Alt-, Shift tai Control-nappi alas painettuna tai vaikka mikä on painetun napin merkkikoodi. Kuvissa 5-2, 5-3 ja 5-4 on esitetty edellä esitettyjen tapahtumankäsittelijöiden KeyPressEventArgs-, PreviewKeyDownEventArgs- ja KeyEventArgs-tyyppisten parametrien keskeisimmät ominaisuudet, joita voi hyödyntää kyseisissä tapahtumankäsittelijöissä. Kuva 5-2. KeyPressEventArgs-parametrin keskeiset ominaisuudet. 72 C# Windows-ohjelmointi
Kuva 5-3. PreviewKeyDownEventArgs-parametrin keskeiset ominaisuudet. Kuva 5-4. KeyEventArgs-parametrin keskeiset ominaisuudet. Alt, Control ja Shift ominaisuuksien avulla voi tutkia onko kyseiset napit alas painettuna, kun jotakin muutakin nappia on painettu. IsInputKey-ominaisuuden avulla saadaan selvitettyä onko painettu nappi normaali -nappi vai jokin erikoisnappi (PAGE UP, PAGE DOWN, ENTER, ESC, TAB tai jokin nuolinappi). KeyCode-ominaisuus palauttaa napin yksilöllisen näppäinkoodin. Jokaisella napilla on näppäinkoodi, mutta kaikilla napeilla ei ole esimerkiksi ASCII-koodia. Jos napilla on näkyvä ASCII-koodi eli näkyvä merkki, niin napin näppäinkoodi ei ole välttämättä sama tämän ASCIIkoodin kanssa. Modifiers-ominaisuus kertoo sen, mikä CTRL, SHIFT ja ALT nappien yhdistelmä on alas painettuna. KeyData-ominaisuus pitää sisällään KeyCode ja Modifiers ominaisuksien informaatioiden kombinaation eli näppäinkoodin ja tiedon siitä, mikä CTRL, SHIFT ja ALT näppäimien kombinaatio on alas painettuna. KeyValue-ominaisuus palauttaa saman informaation, kuin KeyData, mutta tekee sen kokonaislukumuodossa (int). Handled-ominaisuuden avulla voidaan estää näppäineventin välittäminen eteenpäin eli voidaan kertoa se, että tapahtuma on jo käsitelty. Tämän avulla voidaan estää esimerkiksi joidenkin merkkien syöttäminen johonkin tekstiä vastaanottavaan kontrolliin. SuppressKeyPress-ominaisuuden avulla voidaan määrittää välitetäänkö kyseinen tapahtuma kontrollille vai ei. KeyCharominaisuus palauttaa painetun napin Unicode-merkin (16-bittinen) ja sillä voidaan myös suorittaa merkkien asetus. Tämän ominaisuuden avulla voitaisiin esimerkiksi www.stickmansoft.com 73
muuttaa pienet kirjaimet isoiksi kirjaimiksi ennen kontrolliin tulostamista. Seuraavat merkit voidaan lukea ja asettaa. o a-z, A-Z o CTRL o ENTER o Pilkut, välimerkit ja pisteet. o Numerot EventArgs-parametrien käyttö Näppäimistön eventtien tapahtumankäsittelijöiden EventArgs-tyyppisten parametrien hyödyntäminen tapahtumankäsittelijöissä on suhteellisen yksinkertaista. Näppäinten painalluksien tunnistamisen kannalta keskeinen tietorakenne on Keys. Keystietorakenne sisältää kaikkien näppäimistön nappien tunnukset. Kuvassa 5-5 on esitetty Keys-tietorakenne. Kuva 5-5. Keys-tietorakenne. Keys-tietorakenteen avulla voidaan tutkia esimerkiksi mitä nappia on painettu. Esimerkiksi, KeyDown-eventin tapahtumankäsittelijässä voitaisiin seuraavalla tavalla tutkia onko a nappia painettu. if (e.keycode == Keys.A) // Button A pressed. KeyPress-eventin tapahtumankäsittelijässä voitaisiin tulostaa painetun napin Unicodekoodi (Jos napilla on Unicode-koodi.) näytölle KeyChar-ominaisuuden avulla esimerkiksi seuraavalla tavalla. 74 C# Windows-ohjelmointi
CreateGraphics().DrawString(e.KeyChar.ToString(), new Font("Arial", 25), Brushes.Black, 10.0f, 50.0f); Näppäimistön ALT, CTRL ja SHIFT nappien tilainformaation eli se onko kyseinen nappi alas painettuna vai ei saa selville myös muualla ohjelmakoodissa, kuin pelkästään näppäimistön eventtien tapahtumankäsittelijöissä. Tätä varten Control-luokassa on staattinen ModifierKeys-ominaisuus. Seuraavassa on joitakin käyttöesimerkkejä edellä mainittujen nappien tilan selvittämiseksi. Keys keysmod = Control.ModifierKeys; if (keysmod == (Keys.Shift Keys.Control)) // SHIFT and CTRL are pressed. else if (keysmod == Keys.Shift) // SHIFT button pressed. else if (keysmod == Keys.Control) // CTRL button pressed. 5.1.1 WinKeyboard-ohjelma WinKeyboard-ohjelma on esimerkki näppäimistön eventtien käytöstä. Ohjelmassa näppäimistön eventtien tapahtumankäsittelijöissä hyödynnetään EventArgs-parametrin mukana kulkevaa KeyCode ja KeyChar ominaisuuksia. Ohjelmassa tulostetaan näytölle painetun napin näppäin- ja merkki-informaatiota eli painetun napin näppäinkoodi, Unicode-merkki ja tämän numeroarvo sekä näppäinkoodi merkkimuodossa (Esimerkiksi, jos on painettu nappia F12, niin merkkikoodi on F12.). Ohjelma koostuu Program.cs-tiedostosta ja pääformista sekä tähän liittyvästä WinForm.cslähdetekstitiedostosta. Seuraavassa on esitelty edellä mainittujen lähdetekstitiedostojen sisältämät ohjelmakoodit. Program.cs Program.cs-lähdetekstitiedosto sisältää Main()-metodin eli ohjelman aloituskohdan. Kuvassa 5-6 on esitetty Program.cs-tiedoston ohjelmakoodi. /* */ Program.cs Copyright Markku Rahikainen. www.stickmansoft.com www.stickmansoft.com 75
using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace WinFrame static class Program static void Main() Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new WinForm()); WinForm.cs Kuva 5-6. WinKeyboard-ohjelman Program.cs-tiedosto. WinForm.cs-lähdetekstitiedosto on ohjelman pääformiin liitetty lähdetekstitiedosto. Tiedosto sisältää ohjelmakoodit WinKeyboard-ohjelman toimintojen toteuttamista varten. Kuvassa 5-7 on esitetty WinForm.cs-tiedoston ohjelmakoodi. /* WinForm.cs Copyright Markku Rahikainen. www.stickmansoft.com */ using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; namespace WinFrame public partial class WinForm : Form public WinForm() InitializeComponent(); 76 C# Windows-ohjelmointi
private void WinMenuFileExit_Click(object sender, EventArgs e) Application.Exit(); private void WinForm_PreviewKeyDown( object sender, PreviewKeyDownEventArgs e) KeyDownStatusLabel.Text = ""; KeyPressStatusLabel.Text = ""; KeyPressCharacterLabel.Text = ""; KeyUpStatusLabel.Text = ""; private void WinForm_KeyDown(object sender, KeyEventArgs e) KeyDownStatusLabel.Text = ((int)e.keycode).tostring(); KeyDownStatusLabel.Update(); Thread.Sleep(2000); private void WinForm_KeyPress( object sender, KeyPressEventArgs e) KeyPressStatusLabel.Text = ((int)e.keychar).tostring(); KeyPressCharacterLabel.Text = e.keychar.tostring(); KeyPressStatusLabel.Update(); KeyPressCharacterLabel.Update(); Thread.Sleep(2000); private void WinForm_KeyUp(object sender, KeyEventArgs e) KeyUpStatusLabel.Text = e.keycode.tostring(); Kuva 5-7. WinKeyboard-ohjelman WinForms.cs-tiedosto. www.stickmansoft.com 77
Kun WinKeyboard-projektin toteuttaa, suorittaa ohjelman kääntämisen ja käynnistää ohjelman, niin näyttö on kuvan 5-8 mukainen. Kuva 5-8. WinKeyboard-ohjelman tulostus. 78 C# Windows-ohjelmointi