C# - Szöveg kiírása egy adott szögben

forráskód letöltése
A Label kontrol segítségével tetszőleges szövegeket jeleníthetünk meg az alkalmazás felületén, és erre a célra használható a Graphics objektum DrawString metódusa is. Ezek a módszerek azonban csak vízszintes irányú szövegkiírást tesznek lehetővé, dőlésszöget nem határozhatunk meg a szövegek esetén. Cikkünkben megvizsgáljuk, hogyan hidalható át ez a probléma, hogyan oldható fel a rajzosztályok eme hiányossága.
A megoldáshoz egy új FONT objektumot kell létrehozni. A szükséges deklarációkat a Win32 osztályban hoztuk létre. Az új betűtípust a LOGFONT struktúra menedzselt változata tartalmazza, mely számtalan mezővel rendelkezik. Többek közt megadható a betűtípus magassága, szélessége, vonalvastagsága, a szöveg dőlésének szöge, megadható, hogy dőlt, aláhúzott, vagy áthúzott típussal kívánjuk-e a szöveget megjeleníteni.
A Win32 osztályban deklaráltunk metódusokat is, melyek a gdi32.dll könyvtárban találhatók, és a szöveg kiírásában lesznek a segítségünkre. Az első a CreateFontIndirect, mellyel létrehozhatjuk a logikai betűtípusunkat.
[DllImport("gdi32.dll")]
public static extern IntPtr CreateFontIndirect(LOGFONT lf);
A SetMapMode metódussal megadható a rajzolás léptéke.
[DllImport("gdi32.dll")]
public static extern Int32 SetMapMode(IntPtr hdc, int mapmode);
A SelectObject metódussal választhatjuk ki a létrehozott betűtípus objektumát a rajzolás számára.
[DllImport("gdi32.dll")]
public static extern IntPtr SelectObject(IntPtr hdc, IntPtr obj);
A TextOut metódussal pedig a tényleges megjelenítés történik, itt kell megadnunk a rajzolás pozícióját, az eszközkezelőt, valamint a szöveget.
[DllImport("gdi32.dll")]
public static extern bool TextOut(IntPtr hdc,int nXStart,int nYStart,[MarshalAs(UnmanagedType.LPStr)]string lpString,int cbString);
A rajzolás – az egyszerűség kedvéért – a Form felületére történik, így a művelet kódját a Form OnPaint eseménykezelőjében helyezzük el.
A Form újrafestése a TrackBar kontrol csúszkájának minden mozgatására bekövetkezik, és a szöget a kontrol Value property-jének aktuális értéke adja meg. Az értékek 0 és 90 fok között változhatnak.
A rajzolás első lépése, hogy a LOGFONT struktúrát példányosítjuk.
Win32.LOGFONT lf = new Win32.LOGFONT();
A struktúra adatainak megadása a következő lépés.
lf.lfHeight = 600;
lf.lfFaceName = "Verdana";
lf.lfQuality = 0x4;
lf.lfOutPrecision = 0x7;
A dőlésszöget kicsit fura módon úgy kell megadnunk, hogy negatív szám legyen, és a kontrol aktuális értékének tízszeresét kell alapul vennünk.
lf.lfOrientation = lf.lfEscapement = trackBar1.Value * -10;
Ezt követően létrehozzuk az eszközkezelő objektumot, majd a betűtípust indirekt módon.
IntPtr hdc = e.Graphics.GetHdc();
IntPtr fn=Win32.CreateFontIndirect(lf);
Beállítjuk a léptéket.
Win32.SetMapMode(hdc,3);
A rajzolás számára megadjuk a logikai betűtípust.
string s = "SoftwareOnline";
IntPtr old = Win32.SelectObject(hdc,fn);
Meghívjuk a rajzolófüggvényt, majd felszabadítjuk az erőforrásokat.
Win32.TextOut(hdc,1000,-7000,s,s.Length);
e.Graphics.ReleaseHdc(hdc);
A szöveg kevésbé finom rajzolási móddal, de megjelenik dőlve, a kívánt szögben.