2010年10月30日土曜日

SlimDXでDirect2Dのテキスト描画

Direct2Dではテキストを表示するのにDirectWriteというものを使います。同じDirectXに属するものですが、それぞれ独立しています。

要するに、Direct2Dに文字を表示するというだけの存在にもかかわらず、Direct2Dを習得するのと同じくらい面倒だということです。文字を表示するだけなのに!

ま、でも普通の文字を表示するくらいなら簡単です。


using System;
using System.Drawing;
using System.Windows.Forms;
using SlimDX;
using SlimDX.Direct2D;
using SlimDX.Windows;
using DW = SlimDX.DirectWrite;

namespace Direct2DSample
{
    static class Program
    {
        [STAThread]
        static void Main()
        {
            var form = new RenderForm("SlimDX - Direct2D Sample");
            var factory = new Factory();
            var dwFactory = new DW.Factory();

            var target = new WindowRenderTarget(factory,new WindowRenderTargetProperties(){
                Handle = form.Handle,
                PixelSize = form.ClientSize
            });

            var brush = new SolidColorBrush(target,Color.Black);
            var format = new DW.TextFormat(
                dwFactory,
                "MS 明朝",
                DW.FontWeight.Normal,
                DW.FontStyle.Normal,
                DW.FontStretch.Normal,
                12.0F,
                "ja-jp"
            );

            MessagePump.Run(form, () =>
            {
              target.BeginDraw();
              target.Clear(Color.White);

              target.DrawText("ファミリーマート",format,new Rectangle(0,0,100,0),brush);
              target.DrawText("Hello Windows",format,new Rectangle(30,30,50,0),brush);

              target.EndDraw();
            });

            foreach (var item in ObjectTable.Objects)
                item.Dispose();
        }
    }
}
惚れちゃうくらい簡単ですね。

using DW = SlimDX.DirectWrite;
この文は、DWと書かれているところをSlimDX.DirectWriteに置き換えるという意味(詳しくは偉いひと)です。普通に参照せずにこのような手段を用いる理由は、Direct2DにもDirectWriteにもFactoryというクラスがあって、普通に参照するとコンパイラがどっちのFactoryなのか判別できないからです。
Direct2DとDirectWriteは一緒に使うことがほとんどなのに、名前を被らせるとか正気の沙汰ではありません。バカです。そもそもファクトリっているの?


            var dwFactory = new DW.Factory();
ここでDirectWriteのファクトリを作っています。そう言えばメディアファクトリーという会社があった気がする。どうでもいいけど。
ファクトリは工場です。残念ながらDirect2D工場では設備が不足していたらしく、新たにDirectWrite工場を建てないとといけなかったようです。


            var brush = new SolidColorBrush(target,Color.Black);
ここで文字を書くための筆を作っています。
文字の色を決めるのはブラシです。


            var format = new DW.TextFormat(
                dwFactory,
                "MS 明朝",
                DW.FontWeight.Normal,
                DW.FontStyle.Normal,
                DW.FontStretch.Normal,
                12.0F,
                "ja-jp"
            );
ここでフォントの書式(フォーマット)を決めてやります。
上から、
・工場
・書体
・太さ
・スタイル(斜体)
・横幅
・サイズ
・カルチャ名
となっています。カルチャというのはカルチャー(文化)のことですね。


              target.DrawText("ファミリーマート",format,new Rectangle(0,0,100,0),brush);
ここで、「ファミリーマート」という難解な幾何学模様を描いています。Rectangleの最初の2つで座標を、3つ目で横幅を決めています。4つ目はただの生ゴミです。


              target.DrawText("Hello Windows",format,new Rectangle(30,30,50,0),brush);
このように、横幅が狭かった場合は改行して書かれるようです。そのためにPointじゃなくてRectangleにして使いにくくしたのかぁ。うぜー。「Hello Windows」ってウィンドウズの効果音を使った良い曲だからみんな聴いてね。歌がついてるやつ。

説明お終い。


私が今現在やりたいことでは、テキストは全てビットマップ画像として用意するつもりです。DirectWriteはまだ全然使っていませんが、そのようにビットマップ画像を文字として扱うような仕組みがもしあれば使いたいですが、たぶん無いと思います。
なので、今のところDirectWriteはこれ以上する気はありません。今後何かに使いたいと思ったら使ってみて記事を書くかもしれません。


0 件のコメント:

コメントを投稿