C# - Futási időben szerkeszthető feliratú gomb kontrol készítése

forráskód letöltése
Cikkünkben elkészítünk egy kontrolt, mely megjelenésre egy nyomógomb azzal a különbséggel, hogy ha megnyomjuk az F2 funkcióbillentyűt, akkor a gomb felirata szerkeszthetővé válik, vagyis egy szerkesztőmezőben tetszőleges új felirat megadható. A szerkesztés befejezésekor a felirat az ENTER billentyű lenyomásával elfogadható, míg az ESC billentyű lenyomásával elvethető.
A gomb a Button osztályból származik, így örökli annak minden tulajdonságát. Amikor futási idő alatt a gombon lenyomjuk az F2 billentyűt, akkor a gomb felületén megjelenik egy szerkesztőmező. Ebben átírhatjuk a gomb feliratát. Ha a szerkesztőmezőben az ESC billentyűt nyomjuk le, akkor a kijavított szöveg nem kerül alkalmazásra, hanem megmarad a gomb előző felirata. Ha a gomb feliratát az általunk beírt szövegre akarjuk módosítani, akkor nyomjuk le az ENTER billentyűt. Ilyenkor a szerkesztőmező eltűnik, és a gomb ismét rendes gombként funkcionál tovább, az új felirattal.
A gomb feliratának átírásához egy TextBox kontrolt használunk. Ezt fel kell vennünk privát objektumként. Az objektum neve editor lesz.
private TextBox editor = new TextBox();
A kontrol konstruktorában be kell állítanunk a TextBox tagobjektum néhány tulajdonságát, hogy úgy jelenjen meg, ahogy szükséges.
editor.Visible = false;
editor.Parent = this;
Font f = new Font("Verdana",9,FontStyle.Bold);     
editor.BackColor = this.BackColor;
editor.Font = f;
A háttérszíne a kontrol háttérszínével egyezik meg, így majd úgy hat, mintha tényleg a nyomógomb felületén szerkesztenénk a feliratot. Az objektum esetén deklaráltunk egy eseménykezelőt a billentyűzetről érkező információk feldolgozásához.
editor.KeyDown += new KeyEventHandler(editor_KeyDown);
Illetve deklaráltunk egy ilyen kezelőt a kontrolhoz is.
KeyDown += new KeyEventHandler(this_KeyDown);
Amennyiben a kontrol fölött nyomjuk le a F2 billentyűt, akkor jelenik meg a szövegmező, pontosan a kontrol fölött, takarva azt. A kontrol felirata lesz a TextBox kontrol Text property-jének értéke.
switch(e.KeyCode)
{
  case Keys.F2:
  {
    editor.Left = 0;
    editor.Top = 0;
    editor.Width = Width;
    editor.Height = Height;
    editor.Visible = true;
    editor.Focus();
    editor.Text = Text;
    editor.SelectAll();
    break;
  }
}
A TextBox kontrol pedig két billentyű lenyomására érzékeny: ENTER lenyomásakor bekerül a felirat a Text property-be, ESC esetén nem.
switch(e.KeyCode)
{
  case Keys.Enter:
    Text = editor.Text;
    editor.Visible = false;
    Select();
    break;
  ...
}