2010年10月30日土曜日

SlimDXでDirect2Dの図形(線、四角)

Direct2Dで線とか、四角とか、円を描いてみましょ!

今回は線と四角形です。


サンプルを提示してその説明をするのが分かりやすいかなと思うので、そうします。


<線>

using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Windows.Forms;
using SlimDX;
using SlimDX.Direct2D;
using SlimDX.Windows;

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

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

            var brush = new SolidColorBrush(target,Color.Aqua);

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

              target.DrawLine(brush,0,0,100,50);

              target.EndDraw();
            });

            foreach (var item in ObjectTable.Objects)
                item.Dispose();
        }
    }
}


とても美しく、華麗に線が描かれましたね。

            var brush = new SolidColorBrush(target,Color.Aqua);
図形を描くときは、ブラシが必要になります。犬の体をわしゃわしゃ洗うときに使うアレ……ではなく、筆でしょうね。
ブラシは何種類かあるのですが、ここでは単純なSolidColorBrush(固定色ブラシ)を使っています。SolidColorBrushを使うときは、対象のレンダーターゲットを指定してあげなければなりません。なぜなのかはわかりません。それにブラシは工場で作らないらしく、ファクトリの指定は不要です。

              target.DrawLine(brush,0,0,100,50);
ここでさっきのブラシを使って線を引いています。
画面の左上を原点としたときに(0,0)から(100,50)まで線を引いています。
他にもPoint構造体を使って線を引くことができます。
少数点以下まで座標を指定したい場合はPointF構造体を使うことができます。このとき意識しないといけないのは、通常C#で小数点数を扱う場合double型になりますがDirect2Dではfloat型になります。数値(リテラル)を書くときに1.0FみたいにFと付けてやるとfloat型になります。以下は全て同じ線を描きます。
              target.DrawLine(brush,0,0,100,50);
              target.DrawLine(brush,0.0F,0.0F,100.0F,50.0F);
              target.DrawLine(brush,new Point(0,0),new Point(100,50));
              target.DrawLine(brush,new PointF(0.0F,0.0F),new PointF(100.0F,50.0F));





<四角形>

              target.DrawRectangle(brush,new Rectangle(10,10,100,60));
Rectangleは四角形のことです。座標(10,10)に幅100、高さ60の四角形を描いています。
ところで私の目の異常かもしれませんが(たまに黒が緑に見える)、少し暗くないですか? 実はこれ、なめらかな線を描こうとしたがために起きた悲劇なのです。この原因はまだ別の機会に書くとして、回避するには、座標を(10.5,10.5)にしてやればいいです。
              target.DrawRectangle(brush,new RectangleF(10.5F,10.5F,100.0F,60.0F));
ほら。



<塗りつぶした四角形>

              target.FillRectangle(brush,new Rectangle(10,10,100,60));
これは塗りつぶした四角形です。Drawの部分をFillに変えるだけです。



今回はこれだけ!


0 件のコメント:

コメントを投稿