伊勢的新常識  Index  Search  Changes  RSS  Login

GDI+で縁取り文字列を描画する

.NET Framework の描画機能を用いて、縁取り文字列(枠つき文字列)を描画するサンプルです。

VisualStudio2005でWindows アプリケーションを新規作成して、以下のコードを貼り付けると実際の動作を確認できます。

原理

  1. 文字列をパス化する
  2. 縁取りを描画する
  3. 文字列をを描画する

この、2と3が逆転すると、枠線のみが描画されたりということになります。

また、Graphics に描画するときは SmoothingMode を SmoothingMode.HighQuality にすることにより、アンチエイリアスがかかり、きれいに描画できます。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using System.Drawing.Drawing2D;

namespace GDI_DrawTest
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Paint(object sender, PaintEventArgs e)
        {
            // 塗りがわかりやすくなるように背景に色を塗る
            e.Graphics.FillRectangle(new SolidBrush(Color.Black), new Rectangle(0, 0, 800, 600));
            DrawBorderString(e.Graphics, new Point(10, 10), "伊勢的新常識", new Font("MS UI Gothic", 70), 
                StringFormat.GenericDefault, 7, Color.Red, Color.White);
        }

        /// <summary>
        /// 縁取り文字列を描画する
        /// </summary>
        /// <param name="g">描画対象のオブジェクト</param>
        /// <param name="position">描画する位置</param>
        /// <param name="text">描画するテキスト</param>
        /// <param name="font">フォント</param>
        /// <param name="format">書式設定</param>
        /// <param name="bwidth">縁取りの太さ</param>
        /// <param name="foreColor">文字列の色</param>
        /// <param name="borderColor">縁取りの色</param>
        private void DrawBorderString(
            Graphics g, Point position, 
            string text,
            Font font, StringFormat format, float bwidth, 
            Color foreColor, Color borderColor
        )
        {
            // アンチエイリアスをセット
            g.SmoothingMode = SmoothingMode.HighQuality;
            
            // パスを作る (描画先パスを作って、)
            GraphicsPath path = new GraphicsPath();
            path.AddString(text, font.FontFamily, (int)font.Style, font.Size, position, format);
            
            // 描画のパラメータを作る
            Brush foreBrush = new SolidBrush(foreColor);     // 背景用ブラシ
            Brush borderBrush = new SolidBrush(borderColor); // ボーダー用ブラシ
            Pen pen = new Pen(borderBrush, bwidth);           // ペンを作る
            // 描画する
            g.DrawPath(pen, path);
            g.FillPath(foreBrush, path);
            
            // 使ったオブジェクトを始末
            path.Dispose();
            pen.Dispose();
            foreBrush.Dispose();
            borderBrush.Dispose();
        }
    }
}

Last modified:2007/10/06 13:40:50
Keyword(s):
References:[SideMenu] [技術ドキュメント]