C# - Szövegbeviteli kontrol sorszámokkal

forráskód letöltése
A Windows-os alkalmazásokban felhasználható RichTextBox kontrol számtalan hasznos jellemzővel rendelkezik, azonban lehetőségei korlátozottak. Nem tud például sorszámokat megjeleníteni a sorok elején. Cikkünkben elkészítünk egy összetettebb kontrolt, mely a RichTextBox kontrol továbbfejlesztése annak érdekében, hogy az említett hiányosságokat kiküszöböljük.
A kontrolunk tulajdonképpen két egymás mellé helyezett RichTextBox kontrol, melyek közül az egyik a sorszámokat, a másik a beírt szöveget tartalmazza.
A következőkben megvizsgáljuk az egyes részeket, hogyan végzik funkciójukat.
A sorszám kontrol
A kontrol működési elve, hogy a WndProc metódusának felülírásával elérhetjük a kontrol által kapott üzeneteket, és a megfelelő kapott üzenet esetén kiváltunk egy eseményt. Az esemény és a típus delegáltja a következő:
public  delegate void WriteEventHandler();
public event WriteEventHandler WriteEvent;
A kontrol újrarajzolásakor, a fókusz elvesztésekor és az egér kontrol fölé érkezésekor megtörténik az esemény kiváltása.
if (WriteEvent != null) WriteEvent();
A szöveg kontrol
A kontrol működési elve azonos, csupán a figyelt üzenetek természete különböző. A kontrol esetén a billentyű-leütéseket (KeyUp esemény), a szöveg megváltozását (TextChange esemény), az újrarajzolás (Paint esemény), a scroll-ozás (VScroll esemény) és az egér kontrol fölé érkezésének (MouseEnter esemény) üzeneteit figyeljük, és váltjuk ki a fenti módon az eseményt.
A kontrolok együttese
A hívó alkalmazásban felhasználható kontrolban a két részmodul (rtbHelper01 és rtbHelper02) mindegyikéhez szükség van egy eseménykezelőre a fenti események kezelésére. A két kontrol azonos kezelőmetódust használ.
this.rtbHelper01.WriteEvent += new RTBHelper01.WriteEventHandler(helper_Write);
this.rtbHelper02.WriteEvent += new RTBHelper02.WriteEventHandler(helper_Write);
A két kontrol úgy működik együtt, hogy a szerkesztő kontrol egy újabb sorának megkezdésekor megjelenik egy új sorszám a sorszámokat tartalmazó másik kontrol azonos indexű sorában.
A metódusban az egyes kontroloknak a felhasználói művelet függvényében küldünk üzeneteket a SendMessage API függvény segítségével. Ennek deklarációja a következő:
[DllImport ("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
Itt a metódus első paramétere a kontrol kezelője (Handle property), második paramétere az üzenet konstansa. A többi paraméter az üzenet paramétereit tartalmazza.
A kontrol rendelkezik egy Draw metódussal, melyre akkor van szükség, amikor a ShowNumbers property beállításával jelezzük, hogy a kontrolban jelenjen-e meg sorszám, vagy sem. A függvényben gondoskodunk arról, hogy a ShowNumbers igazra állítása esetén megjelenítsük, ellenkező esetben pedig eltüntessük a sorszámokat megjelenítő RichTextBox kontrolt.
A kontrol segédkontroljainak osztályát INTERNAL kulcsszóval minősítjük, hogy ToolBox-on való regisztráláskor azok ne jelenjenek meg a palettán.
A hívó alkalmazásban egyszerűen feldobjuk a kontrolt a Form-ra, méretre igazítjuk, és használjuk.