C# - Szöveget vertikálisan megjelenítő Label kontrol

forráskód letöltése
A Windows-os alkalmazások dialógusablakainak szövegeit leggyakrabban a Label kontrol segítségével jelenítjük meg. Erre a funkcióra a kontrol tökéletesen alkalmas. Nem teszi azonban lehetővé, hogy a szöveget vertikálisan, vagyis függőleges elrendezésben (lentről fölfelé vagy föntről lefelé) írhassuk ki. Erre a képességre ritkán lehet szükség, de azért néha jól jöhet. A funkciót egy saját kontrollal valósíthatjuk meg, melyet cikkünkben elkészítünk.
A mellékelt alkalmazásban felhasznált kontrol kódja a VLLibrary projektben található. A kontrol konstruktorában megadjuk a kezdő méretet, mely most igazodik a szöveg elrendezéséhez, vagyis a magassága a fontosabb érték. Valamint beállítjuk a szöveg igazítását.
public VLControl()
{  
  Width = 25;
  Height = 100;
  TextAlign = ContentAlignment.MiddleCenter;
}
A kontrol egy kiegészítő tulajdonsággal rendelkezik az őskontrolhoz képest. Ezzel a logikai tulajdonsággal jelezhetjük, hogy a szöveg fentről vagy lentről indulva legyen olvasható. A property neve CAlign.
A megjelenítés lényegi részét a kontrol OnPaint metódusában végezzük el. Első lépésként létrehozunk egy RectangleF objektumot a kontrol kliensterületének adataival.
RectangleF rectf = new RectangleF((float)ClientRectangle.X,(float)ClientRectangle.Y,(float)ClientRectangle.Width,(float)ClientRectangle.Height);
A következő lépésben beállítjuk a szöveg megjelenítésére vonatkozó adatokat.
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;
sf.Trimming = StringTrimming.None;
sf.FormatFlags = StringFormatFlags.DirectionVertical;
A kódban ezt követően megadjuk, hogy az egyes igazítási módokat milyen szövegigazítási értékek kísérjék.
if (TextAlign == ContentAlignment.BottomCenter || TextAlign == ContentAlignment.BottomLeft || TextAlign == ContentAlignment.BottomRight)
{
  sf.Alignment = calign ? StringAlignment.Near : StringAlignment.Far;
}
...
A CharacterRange objektum tartalmazza a szöveg karaktereinek pozícióját, melyet a StringFormat objektum SetMeasurableCharacterRanges metódusában használunk fel.
CharacterRange[] cRanges = {new CharacterRange(0, Text.Length)};
sf.SetMeasurableCharacterRanges(cRanges);
...
Utolsó lépésként gondoskodunk arról, hogy a szöveg a megfelelő irányban legyen olvasható.
g.TranslateTransform(xOffset,0f);
g.DrawString(Text,Font,b,rectf,sf);
A kontrol logikai property-jének igazra állításával a szöveg lentről olvasható fölfelé.
if (calign)
{
  g.RotateTransform(180f);
  g.TranslateTransform(-rectf.Width,-rectf.Height);
}
A példában a CheckBox kontrol jelölt állapotában lesz a property értéke igaz.