Zaawansowane rysowanie tekstu w C#

06.02.2010 @ 18:44:47 by Rafał Kozik | C# .NET grafika

Pisząc różnego rodzaju aplikacje (i gry), chcielibyśmy czasami mieć większa możliwość dostosowania parametrów rysowanego tekstu niż tylko krój, rozmiar i kolor. W .NET jest to bardzo proste -- pokażę dzisiaj jak łatwo można to osiagnać za pomocą GraphicPath.



GraphicPath jest klasą przechowującą ścieżki, które mogą być używane do późniejszego rysowania. Metoda AddString pozwala na dodanie tekstu, co wykorzystamy. Przyjmijmy takie wartości parametrów:

FontFamily fontFamily = new FontFamily("Tahoma");
Point location = new Point(100, 100);
int style = (int)FontStyle.Bold;
float emSize = 100;

Zacznijmy od wypełnienia tekstu grafiką:

void DrawText1(Graphics g, string text)
{
    g.SmoothingMode = SmoothingMode.AntiAlias;
    g.InterpolationMode = InterpolationMode.HighQualityBicubic;

    using (GraphicsPath path = new GraphicsPath())
    {
        path.AddString(text, fontFamily, style, emSize, location, 
            StringFormat.GenericDefault);

        using (TextureBrush brush = new TextureBrush(bgBitmap))
        {
            g.FillPath(brush, path);
        }
    }
}
Obrazek

Możemy użyć tego samego sposobu do wypełnienia tekstu dowolnym obiektem Brush, np. gradientem:

void DrawText2(Graphics g, string text)
{
    g.SmoothingMode = SmoothingMode.AntiAlias;
    g.InterpolationMode = InterpolationMode.HighQualityBicubic;

    using (GraphicsPath path = new GraphicsPath())
    {
        path.AddString(text, fontFamily, style, emSize, location,
            StringFormat.GenericDefault);

        using (LinearGradientBrush brush 
            = new LinearGradientBrush(path.GetBounds(), Color.Red, Color.Blue, 90.0f))
        {
            g.FillPath(brush, path);
        }
    }
}
Obrazek

Możemy też zrobić obrys tekstu:

void DrawText3(Graphics g, string text)
{
    g.SmoothingMode = SmoothingMode.AntiAlias;
    g.InterpolationMode = InterpolationMode.HighQualityBicubic;

    using (GraphicsPath path = new GraphicsPath())
    {
        path.AddString(text, fontFamily, style, emSize, location,
            StringFormat.GenericDefault);

        using (Pen pen = new Pen(Color.Black, 3))
        {
            pen.DashStyle = DashStyle.DashDot;
            pen.LineJoin = LineJoin.Round;

            g.DrawPath(pen, path);
        }
    }
}
Obrazek

Sposób ten daje dużo możliwości i pozwala na osiągnięcie ciekawych efektów. Ja używam tego do generowania fontów bitmapowych do swoich projektów:


Obrazek

Komentarze

Reg
2010-02-07 @ 12:30:02

Wow, fajne, nie znałem tego! Tylko od której wersji .NET to jest dostępne?
2010-02-07 @ 12:43:56

Według msdn już od 1.1 ;)
MSM
2010-02-22 @ 12:50:35

Ja używałem gPathy od dawna (pierwszy raz podczas swojej luźnej implementacji gry kółko i krzyżyk :) ), ale jakoś nigdy nie wpadłem na to żeby wykorzystać je do rysowania teksu... Dzięki :)

Dodaj komentarz

Nick:
E-Mail (nie będzie widoczny):
Strona www (opcjonalnie):
2 - 5 + 5 =
Zapamiętaj mnie

Komentarz (pomoc bbCode):