SourceChord

C#とXAML好きなプログラマの備忘録。最近はWPF系の話題が中心です。

縁取り文字の描画

.NETフレームワークでは,標準では縁取り文字の描画という機能は用意されていないので自分で処理しなければなりません.
縁取り文字の描画法は主に以下の二通り

  • 文字列をpathに変換してGDIのブラシとペンを用いて描画
  • 上下左右にそれぞれ1pxずらして同じ文字列を縁取りの色で描画し,最後に真ん中に文字色で描画する


で,まずはpathに変換して描画という方法を試してみました.

// 描画先のグラフィックスクラスを取得
Graphics g = pictureBox1.CreateGraphics();
System.Drawing.Drawing2D.GraphicsPath gp =
    new System.Drawing.Drawing2D.GraphicsPath();
gp.AddString("表示する文字列", new FontFamily("MS ゴシック"),
    0, 30, new Point(0, 0), StringFormat.GenericDefault);

Brush foreBrush = new SolidBrush(Color.White);      // 背景用ブラシ
Brush borderBrush = new SolidBrush(Color.Black);    // ボーダー用ブラシ
Pen pen = new Pen(borderBrush, 4/*←縁取りの太さ*/);// ペンを作る

g.DrawPath(pen, gp);
g.FillPath(foreBrush, gp);

pen.Dispose();
borderBrush.Dispose();
foreBrush.Dispose();
gp.Dispose();
g.Dispose();

これを,Paintイベントなどで行うと,縁取り文字を描画できます.


しかし描画する文字列が長くなってきたり,漢字が多くなったりとか,パスが複雑になってくると,アニメーションさせるときに描画が間に合わずちらつくようになってしまいました.
これはおそらく,今自分が組んでいるプログラムは「徐々に消えていく」という処理のために,不透明度を変えて再描画という処理を行っているためです.
Invalidate()メソッドを何度も呼び出してるのがマズイのかなぁ・・・


ということで,今度はもう一つの,位置をずらして何度も文字を重ねて表示する方法を試して見たいと思います.でも,コレって縁取りの太さをいじれない気がする.
うーん,どうしようか・・