C# - RichTextBox kontrol használata

forráskód letöltése
Ha RTF formátumú dokumentumot kell kezelnünk, vagy csak olyan szöveget szeretnénk megjeleníteni a felhasználó részére, melyben különféle formázásokra (szín, betűtípus, stb.) is van lehetőségünk, akkor ehhez a RichTextBox kontrolt kell felhasználnunk.
Ha már meglévő RTF dokumentumot szeretnénk betölteni, akkor használhatjuk a LoadFile nevű függvényt. Ennek több változata is létezik, a legegyszerűbb az, amelyikbe csak sztringként meg kell adnunk azt az elérési útvonalat, melyen található az RTF állomány.
          richTextBox1.LoadFile(Application.StartupPath+"\\a.rtf");
Másik változata a LoadFile-nak hasonlít az előzőre, mivel első paraméterük egyezik, viszont ennek van egy második is, mely a formátumot határozza meg. Ez RichTextBoxStreamType felsorolt típusú, így értéke a következők egyike lehet:
  • PlainText – egyszerű szöveg
  • RichNoOleObjs – OLE objektum tárolása nem történik meg. Ez az érték csak a SaveFile függvénynél használható
  • RichText – alapértelmezett RTF formátum
  • TextTextOleObjs – OLE objektum tárolása helyett csak szöveg jelenik meg. Ez az érték csak a SaveFile függvénynél használható.
A harmadik változata a LoadFile-nak annyiban különbözik a másodiktól, hogy itt első paraméterként nem egy sztring elérési útvonalat vár, hanem egy Stream osztályt. Második paraméter itt is RichTextBoxStreamType felsorolt típus lesz.
Betöltéshez hasonlóan arra is van lehetőségünk, hogy az aktuális tartalmat elmentsük. Itt szintén három változat áll rendelkezésünkre a SaveToFile függvényből. Paraméterezésük mindhárom esetben megegyezik a LoadFile-al, csak funkciójuk különbözik: most nem betöltés, hanem mentés történik.
A szöveg futási időben történő formázásához találunk jó néhány Selection szöveggel kezdődő property-t. Például a SelectionColor property-n keresztül az aktuálisan kijelölt szövegrész színét változtathatjuk meg.
           richTextBox1.SelectionColor = Color.Red;
Ezek a Selection kezdetű property-k persze nem csak értékadásra használhatók: ezeken keresztül le is kérdezhetjük az aktuális állapotot. Tudnunk kell azt is, hogy ha a kijelölt szöveg területen több különböző formázás van jelen, akkor null értéket kapunk vissza. Ez akkor fordul elő, ha például egy szó eleje piros, vége zöld és a teljes szó ki van jelölve, akkor a SelectionColor nem adhatna egyértelmű választ, hogy mi a szín.
  • SelectionAlignment – szöveg igazítása vízszintes irányban. Lehetséges értéke: Left, Right, Center.
  • SelectionBullet – logikai típusként megadható, hogy az adott sor előtt jelenjen-e meg felsorolás jel, ennek behúzásának mértéke a BulletIdent property-ben adható meg.
  • SelectionCharOffset – az alapvonalhoz képest megadható hogy hány pixellel legyen eltolva a szöveg függőleges irányban. Ennek segítségével felső, illetve alsó indexet készíthetünk.
  • SelectionColor - a kijelölt terület színe
  • SelectionFont – a kijelölt terület betűtípusa Font típusban
  • SelectionHangingIndent – első sor behúzásának mértéke pixelben minden egyes bekezdésnél
  • SelectionIndent – a szöveg behúzásának mértéke pixelben bal oldalt minden egyes bekezdésnél
  • SelectionLength – hány karakterből áll a kijelölt szövegrész
  • SelectionMargin - margó értéke
  • SelectionProtected – ha igaz, akkor a kijelölt szöveg területet nem lehet megváltoztatni
  • SelectionRightIndent - a szöveg behúzásának mértéke pixelben jobb oldalt minden egyes bekezdésnél
  • SelectionStart – a kijelölés első karakterének pozíciója
  • SelectionTabs – int típusú tömb, mely a tab pozíciókat írja elő
  • SelectionType – a kijelölés típusa
A SelectionType property értéke az alábbiak egyike lehet:
  • Empty – nincs kijelölés
  • MultiChar – több karakter van kijelölve
  • MultiObject – a kijelölés több OLE objektumot tartalmaz
  • Object – egy OLE objektum kijelölt
  • Text – csak szöveg lett kijelölve
A kijelölt szöveget a SelectedRTF property-n keresztül sztringként is kiolvashatjuk. Ez esetben a sztring tartalmazza az összes RTF kódot is. Ha ténylegesen csak a szövegre van szükségünk, akkor használjuk a SelectedText property-t.
Ha a beírt szövegünk tartalmaz URL-t és a DetectURLs property igaz értékű, akkor a RichTextBox képes arra, hogy ezeket az URL-eket a szövegben megkeresse és kék színnel, aláhúzással formázza. Ezek után, ha a felhasználó rákattint egy-egy ilyen linkre, akkor erről a LinkClick eseményben kapunk értesítést. Az esemény LinkClickEventArgs típusú paraméterének LintText property-ében pedig megkapjuk a linkhez tartozó feliratot is.
      protected void richTextBox1_LinkClick (object sender, System.WinForms.LinkClickEventArgs e)
      {
        MessageBox.Show(e.LinkText);
      }
Lehetőségünk van arra is, hogy a megjelenített szöveget nagyítsuk, kicsinyítsük. Ehhez a ZoomFactor property-t kell használnunk. Ennek értéke 1/64 és 64 közé kell hogy essen. Alapértéke 1, ez lesz alapnézet. Ha ennél kisebb számot adunk meg, akkor kicsinyítés, ha nagyobbat, akkor nagyítás következik be. A ResetZoom függvény hívásával ezt az értéket 1-re állíthatjuk.
Ha felhasználjuk a kontrol SelectionChange eseményét, akkor folyamatosan figyelemmel követhetjük a kijelölt szövegterület változását.
      protected void richTextBox1_SelectionChange (object sender, System.EventArgs e)
      {
        textBox1.Text = "SelectedText: " + richTextBox1.SelectedText;
      }
Az AllowDrop property igazra állításával a RichTextBox képes lesz Drag and Drop fogadására.
Ha keresni szeretnénk a szövegben, akkor ehhez a Find függvény valamely változatát használhatjuk. Első paraméterként megadhatunk sztringet, vagy karaktertömböt. Ezekben kell elhelyezni a keresni kívánt szöveget. Második paraméterként megadható egy olyan szám, ahonnan a keresést kezdeni szeretnénk. Ha RichTextBox-ban lévő összes szöveget egyetlen karakter tömbként nézzük, akkor az itt megadott szám e tömb indexeként tekinthető. A Find néhány változatánál harmadik paraméterként is megadhatunk egy számot. Ez esetben ezen az indexen befejeződik a keresés a szövegben, akkor is, ha annak még nem lett vége.
A GetCharFromPosition függvénnyel meghatározhatjuk, hogy egy X, Y pontban milyen karakter található. Ehhez paraméterként egy Point típusban kell megadnunk a kérdéses koordinátát és char típusban kapjuk vissza az eredményt. Ha arra lennénk kíváncsiak, hogy az így megadott karakter hányadik a szövegben, akkor használjuk a GetCharIndexFromPosition függvényt. Itt paraméterként szintén egy Point típust kell megadni, eredményképp pedig egy int típusú számot kapunk. Ha adott ez a szám, akkor azt is lekérdezhetjük, hogy ez a karakter hányadik sorban helyezkedik el. Ehhez a GetLineFromCharIndex függvény kell. Paraméterként egy int számot adhatunk meg, mely az adott karakter index száma. Visszatérési értékként a sor számát kapjuk meg.
Egy karakter pozíciójának meghatározására a GetPositionFromCharIndex függvény lesz segítségünkre. Itt szintén az adott karakter index számát kell megadnunk, visszatérési értékként pedig egy Point típusban kapjuk annak pozícióját.