C# - Numerikus billentyűzet kontrol készítése

forráskód letöltése
Cikkünkben elkészítjük a klaviatúra numerikus billentyűzetét megjelenítő kontrolt, melynek használata lehetővé teszi, hogy az adott alkalmazást felhasználó-közelivé tegyük. A kontrol egyes billentyűire kattintva lekérdezhető, hogy éppen melyik fölött tartózkodott az egérmutató, és a lenyomott billentyűnek mi a felirata. Természetesen a gombok alsó és felső felirata is lekérdezhető.
A kontrol assembly-jében két osztályt találunk, melyek mindegyike a UserControl osztályból származik. A PadButton osztály tartalmazza a billentyűzet egy gombjának kódját.
A gombok osztályában deklaráltunk egy delegáltat, valamint egy eseményt a kattintás majdani kezeléséhez.
public delegate void ClickEventHandler(object sender,ClickEventArgs e);
public event ClickEventHandler ClickEvent;
A delegált második paramétere egy ClickEventArgs típusú elem, melynek két property-je tartalmazza a kattintás után a feliratokat.
Az osztályban felüldefiniált OnMouseDown metódusban kezeljük az egér gombjának lenyomásakor keletkező eseményt, amikor is a gomb addig fehér területét pirosra színezzük.
Az OnMouseUp metódusban ezt rögtön fehérre vissza is állítjuk, így csak a kattintás pillanatában látható a piros szín. Ebben a metódusban elsütjük a lenyomás gombeseményét is.
ClickEvent(this,new ClickEventArgs(this.Caption1,this.Caption2));
Az OnPaint metódusban rajzoljuk meg a gomb felületét. Itt a DrawOutLine metódus rajzolja meg a külső körvonalat, míg a DrawInLine metódus a belső kerekített körvonalat, majd ezt kitölti fehér színnel.
A DrawCaption metódusban kirajzoljuk a gomb felületére a feliratokat. Amikor karaktereket rajzolunk, a Graphics osztály DrawString metódusát használjuk, míg a nyilak rajzolása három lépésben, a DrawLine metódus meghívásával történik.
A CNPControl osztályban rajzoljuk meg a hívó alkalmazásban megjelenő kontrol egészét. Az egyedi gombok lenyomásakor generált eseményt itt továbbgörgetjük, és itt is írunk rá egy globális kezelőt, melynek paramétere ugyanaz lesz, mint a gombok osztályában.
public delegate void ClickEventHandler(object sender,ClickEventArgs e);
public event ClickEventHandler ClickEvent;
A gombokat egy tömbben helyezzük el. A kontrol konstruktorában hozzuk létre a gombok objektumait, gondoskodva arról, hogy a Parent property értéke a CNPControl objektumra mutasson.
for(int i=0;i<17;i++)
{
  buttons[i] = new PadButton();
  buttons[i].ClickEvent += new PadButton.ClickEventHandler(button_Handler);
  buttons[i].Width = (Width-10)/4;
  buttons[i].Height = (Height-12)/5;
  buttons[i].Parent = this;
  ...
Az OnPaint metódusban rajzoljuk a gombokat a felületre, meghatározott rendben.
A gombokhoz létrehozott eseményt itt kezeljük, közben kiváltva egy újat, melyet már a hívó alkalmazásban kezelünk le.
private void button_Handler(object sender,ClickEventArgs e)
{
  ClickEvent(this,new ClickEventArgs(e.UpCaption,e.DownCaption));
}
A hívó alkalmazásban egyszerűen csak kiolvassuk a kezelőfüggvény második paraméterének property-jeit, majd megjelenítjük azt, amelyre éppen szükség van.
private void cnpControl1_Click(object sender,CNPLibrary.ClickEventArgs e)
{
  textBox1.Text = e.UpCaption;
}