システム開発・Webサイト構築 プラスラス

2010/2/14 日曜日

【.NET】文字を縁取りして描画する

このエントリーを含むはてなブックマーク Yahoo!ブックマークに登録 Google ブックマーク del.icio.us

image

VB.NETやC#で文字をふちどりして描画する方法です。System.Drawing.Drawing2D.GraphicsPathオブジェクトで、文字のパスを作成して描画する方法が簡単です。

下記のサンプルはFormのPaintイベントでフォーム自体に描画しています。

サンプルでは、ある程度小さい文字でも綺麗に見えるように、アンチエイリアスをかけています。

'VB.NETのサンプル

Private Sub Form1_Paint(ByVal sender As Object, ByVal e As PaintEventArgs) _
 Handles Mybase.Paint
    'アンチエリアス
    Dim initialMode As System.Drawing.Drawing2D.SmoothingMode _
        = e.Graphics.SmoothingMode

    e.Graphics.SmoothingMode = _
        System.Drawing.Drawing2D.SmoothingMode.HighQuality

    'レンダリング品質
    Dim initialQuality As System.Drawing.Drawing2D.CompositingQuality _
        = e.Graphics.CompositingQuality

    e.Graphics.CompositingQuality = _
    System.Drawing.Drawing2D.CompositingQuality.HighQuality

    Dim str As String = "ふちどりして描画したいテキスト"

    Dim gp As New System.Drawing.Drawing2D.GraphicsPath()

    gp.AddString(str, New FontFamily("MS Gothic"), _
         CInt(FontStyle.Regular), 30F, _
        New Point(3, 3), StringFormat.GenericDefault)

    'パスの線分を描画
    Dim drawPen As New Pen(Color.Blue, 3F)

    e.Graphics.DrawPath(drawPen, gp)

    '塗る
    Dim fillBrush As Brush = New SolidBrush(Color.White)

    e.Graphics.FillPath(fillBrush, gp)

    drawPen.Dispose()
    fillBrush.Dispose()

    '念のため元に戻しておきます
    e.Graphics.SmoothingMode = initialMode
    e.Graphics.CompositingQuality = initialQuality
End Sub
//C#のサンプル
private void Form1_Paint(object sender, PaintEventArgs e)
{
    //アンチエリアス
    System.Drawing.Drawing2D.SmoothingMode initialMode
                                = e.Graphics.SmoothingMode;
    e.Graphics.SmoothingMode =
           System.Drawing.Drawing2D.SmoothingMode.HighQuality;    

    //レンダリング品質
    System.Drawing.Drawing2D.CompositingQuality initialQuality
                                  = e.Graphics.CompositingQuality;
    e.Graphics.CompositingQuality
        = System.Drawing.Drawing2D.CompositingQuality.HighQuality;

    string str = "ふちどりして描画したいテキスト";

    System.Drawing.Drawing2D.GraphicsPath gp =
        new System.Drawing.Drawing2D.GraphicsPath();

    gp.AddString(str, new FontFamily("MS Gothic"),
                    (int)FontStyle.Regular, 30.0F,
                    new Point(3, 3), StringFormat.GenericDefault);

    //パスの線分を描画
    Pen drawPen = new Pen(Color.Blue, 3.0F);

    e.Graphics.DrawPath(drawPen, gp);

    //塗る
    Brush fillBrush = new SolidBrush(Color.White);

    e.Graphics.FillPath(fillBrush, gp);

    drawPen.Dispose();
    fillBrush.Dispose();

    //念のため元に戻しておきます
    e.Graphics.SmoothingMode = initialMode;
    e.Graphics.CompositingQuality = initialQuality;
}

もし、これ以上の何かをやりたい場合は、フォントのアウトラインを取得して、自分で処理することになると思います。

あるいはcairo等のライブラリを使用すると、求めていることが実現できるかもしれません。

(cairoを使った例を掲載しています。【.NET】VB/C#でグラフィックライブラリcairoを使う)

参考URL

MSDNライブラリ GlyphTypeface.GetGlyphOutline メソッド .Net Framework 3.5以上

MSDNライブラリ GetGlyphOutline(Win32 API)

マイクロソフト サポート オンライン TrueType グリフのアウトラインを作成する方法

http://www.pinvoke.net/default.aspx/gdi32/GetGlyphOutline.html

cairo

関連図書

関連記事

タグ: ,
Filed under: C#,Programming,VB.NET — Nakai @ 2:42:23

コメントはまだありません »

コメントはまだありません。

この投稿へのコメントの RSS フィード。 TrackBack URL

コメントする

HTML convert time: 0.745 sec. Powered by WordPress