C# - Szöveg kurzorpozíciójának lekérdezése és beállítása

forráskód letöltése
Cikkünkben kicsit elidőzünk az aktuális kurzorpozícióval kapcsolatos Windows API metódusok használatánál. A .NET Framework osztálykönyvtárában ugyanis nem találjuk meg azokat a metódus-megvalósulásokat, melyekkel a Form egy tetszőleges kontroljában – vagy magán a Form-on – található szövegek ilyen természetű információja lekérdezhető, vagy beállítható. A cikkünkben tárgyalandó metódusok a USER32.DLL állományban vannak implementálva, és elkészítünk használatukkal egy szemléletes példát.
A metódusok menedzselt deklarációi, valamint a művelet elvégzéséhez szükséges függvények implementációi a Utility osztályban találhatók meg. A példában ezek segítségével egy kódrészletet írunk a Form felületére, melyben a kurzor pozícióját változtathatjuk.
A felhasznált API függvények deklarációi a következők:
CreateCaret
Osztály:
int CreateCaret(
IntPtr hwnd, IntPtr hbm, int cx, int cy
);
Létrehoz egy kurzort az aktuális pozícióban.
Paraméterek
IntPtr hwnd
Az ablak azonosítója, mely majd birtokolja a kurzort.
IntPtr hbm
Deklarálhatunk egy képet a kurzorhoz. Ebben az esetben itt adhatjuk meg annak kezelőjét.
int cx
A megadott kép szélessége. Amennyibe nem adtunk meg képet, akkor ez a tulajdonság figyelmen kívül marad.
int cy
A megadott kép magassága. Amennyibe nem adtunk meg képet, akkor ez a tulajdonság figyelmen kívül marad.
Visszatérési érték
Ha a művelet sikeres, akkor nem nulla.
DestroyCaret
Osztály:
int DestroyCaret();
Megszünteti a kurzor objektumát.
Visszatérési érték
Ha a művelet sikeres, akkor nem nulla.
ShowCaret
Osztály:
int ShowCaret(
IntPtr hwnd
);
Megjeleníti a létrehozott kurzort az objektum létrehozásakor megadott pozícióban.
Paraméterek
IntPtr hwnd
Az ablak azonosítója, mely a kurzort tartalmazza.
Visszatérési érték
Ha a művelet sikeres, akkor nem nulla.
HideCaret
Osztály:
int HideCaret(
IntPtr hwnd
);
Elrejti a kurzort.
Paraméterek
IntPtr hwnd
Az ablak azonosítója, mely a kurzort tartalmazza.
Visszatérési érték
Ha a művelet sikeres, akkor nem nulla.
Az alkalmazás indulásakor egy tömbben elhelyezzük a megjelenítendő kódot, majd a tömb tartalmát a Form OnPaint eseményében kiírjuk a felületre. Itt figyelünk arra, hogy amennyiben a kód egy részét kijelöljük a szövegek kijelöléséhez hasonló módszerrel, akkor az valóban kijelölt formában jelenjen meg.
for (int i = 0; i < lines.Length; ++i)
{
  e.Graphics.DrawString(lines[i], Font, new SolidBrush(this.ForeColor), 5, Font.Height * i, StringFormat.GenericTypographic);
}
if (s) 
{
  DrawSelected(e.Graphics);
}
A művelet gerince, hogy a Form felületére kirajzolt szövegben navigálhatjuk a kurzort. Ehhez csak a billentyűzet navigáló gombjait kell megnyomnunk. A lenyomott billentyűk kiértékelése, és a megfelelő mozgás elvégzése a Form OnKeyDown metódusában történik meg.
A MoveCaret metódusban minden egyes billentyűleütéskor új értéket adunk a Utility objektum Position property-jének, mely a SetCaretPos metódussal a megfelelő pozícióba helyezi a kurzort.