FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

「SharpDX」フォントを読み込んで描画

using System;
using DX = SharpDX;
using DX2D = SharpDX.Direct2D1;
using DXWrite = SharpDX.DirectWrite;
using System.Windows;
using System.Windows.Interop;

namespace Project1
{
internal static class Program
{
[STAThread]
private static void Main()
{
Window window = new Window();

window.MouseDown += (sender, e) =>
{
var hwnd = new WindowInteropHelper(window).Handle;

var dx2dFactory = new DX2D.Factory();
var dx2dRender = new DX2D.WindowRenderTarget(dx2dFactory, new DX2D.RenderTargetProperties(), new DX2D.HwndRenderTargetProperties { Hwnd = hwnd, PixelSize = new DX.Size2(300, 300) });


//文字描画のための用意
var dxWriteFactory = new DXWrite.Factory();
//フォントを読み込む
//今回はtest.ttfを読込
var fontFile = new DXWrite.FontFile(dxWriteFactory, "test.ttf");
var fontFace = new DXWrite.FontFace(dxWriteFactory, DXWrite.FontFaceType.Truetype, new DXWrite.FontFile[] { fontFile }, 0, DXWrite.FontSimulations.None);



//表示させる文字列
var text = "表示テスト";
//文字列を数値化
var ary = new int[text.Length];
for (var i = 0; i < ary.Length; i++) ary[i] = (int)text[i];
var inde = fontFace.GetGlyphIndices(ary);



//文字列描画用オブジェクトの作成
var glyph = new DXWrite.GlyphRun();
//使用するフォント
glyph.FontFace = fontFace;
//文字サイズ
glyph.FontSize = 30;
//表示する文字列
glyph.Indices = inde;


dx2dRender.BeginDraw();
dx2dRender.Clear(DX.Color.Wheat);


//文字列の描画
dx2dRender.DrawGlyphRun(new DX.Vector2(100, 100), glyph, new DX2D.SolidColorBrush(dx2dRender, DX.Color.Black), DX2D.MeasuringMode.GdiClassic);


dx2dRender.EndDraw();
};

window.SizeToContent = SizeToContent.WidthAndHeight;
window.Content = new FrameworkElement { Width = 300, Height = 300 };
window.ShowDialog();
}
}
}
スポンサーサイト

DirectX9での矩形描画


using System;
using System.Xml;

using DX = SharpDX;
using DX3D9 = SharpDX.Direct3D9;

using System.Windows.Interop;
using System.Windows.Media;
using System.Windows;
using System.Windows.Media.Imaging;
using System.Windows.Controls;
using System.Runtime.InteropServices;

namespace Project1
{

//四角形を描画するのに必要な構造体
struct DrawingData
{
//X値
public float X;
//Y値
public float Y;
//Z値。今回使いません
public float Z;
//色の数値
public int Color;

//描画用データの指定
public DrawingData(float x, float y, float z, DX.Color color)
{
this.X = x;
this.Y = y;
this.Z = z;
this.Color = color.ToBgra();
}
}


static class Program
{
[STAThread]
static void Main()
{
//WPFの設定
var window = new Window();
var content = new Image();
var image = new D3DImage(); //DirectX9で描画したものを表示するのに必要

//Direct3D9の設定
var direct = new DX3D9.Direct3D();
var pp = new DX3D9.PresentParameters(300, 300);
var device = new DX3D9.Device(direct, 0, DX3D9.DeviceType.Hardware, IntPtr.Zero, DX3D9.CreateFlags.HardwareVertexProcessing, pp);
var sprite = new DX3D9.Sprite(device);

window.MouseDown += (sender, e) =>
{
//DirectX9で描画
device.BeginScene();
sprite.Begin(DX3D9.SpriteFlags.AlphaBlend);
device.Clear(DX3D9.ClearFlags.Target, DX.Color.Black, 0, 0);


//描画する関数
//第一引数に、DX3D9.PrimitiveType.TriangleFanを指定し、
//第二引数に、2を指定することで、矩形を描画できる
//
//第三引数には、描画データを指定した配列を代入
device.DrawUserPrimitives(DX3D9.PrimitiveType.TriangleFan, 2, new DrawingData[]
{
//四角形を描画
//
//今回は灰色の四角形を描画
//始点が100,100で、横幅は100、縦幅は100の矩形
new DrawingData(100, 100, 0, DX.Color.Gray),
new DrawingData(200, 100, 0, DX.Color.Gray),
new DrawingData(200, 200, 0, DX.Color.Gray),
new DrawingData(100, 200, 0, DX.Color.Gray),
});


sprite.End();
device.EndScene();
device.Present();
//DIrectX9での描画はここまで

//DirectX9で描画したものをWPFで表示
image.Lock();
image.SetBackBuffer(D3DResourceType.IDirect3DSurface9, device.GetBackBuffer(0, 0).NativePointer);
image.AddDirtyRect(new Int32Rect(0, 0, 300, 300));
image.Unlock();
};

content.Source = image;
window.Content = content;
window.ShowDialog();
}
}
}

SharpDX Rectangleの情報

using SharpDX;
using System;

namespace Project1
{
internal static class Program
{
private static void Main()
{
//矩形データを表す構造体
Rectangle rect = new Rectangle(50, 50, 100, 100);

//XY値と幅
//
//XY値を変更しても幅は変わりませんし、
//横幅や縦幅を変更してもXY値は変わりません
Console.WriteLine("X値 " + rect.X); //X値を変更しても横幅は変わらない
Console.WriteLine("横幅 " + rect.Width); //横幅を変更してもX値は変わらない
Console.WriteLine("Y値 " + rect.Y); //Y値を変更しても縦幅は変わらない
Console.WriteLine("縦幅 " + rect.Height); //縦幅を変更してもY値は変わらない


Console.WriteLine();

//XY値と幅
Console.WriteLine("XY値 " + rect.Location); //Locationを変更するのは、XY値を変更するのと同じ
Console.WriteLine("幅 " + rect.Size); //Sizeを変更するのは、幅を変更するのと同じ


Console.WriteLine();

//上下左右の位置
//
//左辺値・右辺値・上底値・下底値を変更すると、
//XY値や幅も変わります
Console.WriteLine("左辺 " + rect.Left); //左辺値を変更すると、X値や横幅も変化する
Console.WriteLine("右辺 " + rect.Right); //右辺値を変更すると横幅が変化する
Console.WriteLine("上底 " + rect.Top); //上底値を変更すると、Y値や縦幅も変化する
Console.WriteLine("下底 " + rect.Bottom); //下底値を変更すると縦幅が変化する


Console.WriteLine();

//その他
Console.WriteLine("中心点 " + rect.Center); //中心の位置
Console.WriteLine("左上  " + rect.TopLeft); //左上の位置
Console.WriteLine("左下  " + rect.BottomLeft); //左下の位置
Console.WriteLine("右上  " + rect.TopRight); //右上の位置
Console.WriteLine("右下  " + rect.BottomRight); //右下の位置

}
}
}

Direct2D Layerを使ったクリッピング

using System;
using SharpDX;
using SharpDX.Direct2D1;

namespace Project1
{
internal static class Program
{
private static void Main()
{
var form = new System.Windows.Forms.Form();
var formSize = form.Size;

//描画用の設定
var hwnd = new HwndRenderTargetProperties();
hwnd.Hwnd = form.Handle;
hwnd.PixelSize = new Size2(formSize.Width, formSize.Height);

//描画用オブジェクトを作成
var factory = new SharpDX.Direct2D1.Factory();
var render = new SharpDX.Direct2D1.WindowRenderTarget(factory, new RenderTargetProperties(), hwnd);


form.MouseDown += (sender, e) =>
{
//描画開始
render.BeginDraw();

//レイヤーの作成
var layer = new SharpDX.Direct2D1.Layer(render);

//レイヤーの設定
var lp = new SharpDX.Direct2D1.LayerParameters();
//クリッピングの範囲を指定
lp.ContentBounds = new RectangleF(0, 0, 200, 200);
//クリッピングの範囲をGeometryで指定
lp.GeometricMask = new EllipseGeometry(factory, new Ellipse(new Vector2(150, 150), 100, 100));
//クリッピング用Geometryの設定
lp.MaskTransform = Matrix3x2.Scaling(1);
//透明度
lp.Opacity = 0.5F;

//レイヤーをクリッピングに使用する
//
//(注)BeginDraw関数の前に実行に実行するとエラー
render.PushLayer(ref lp, layer);

//塗りつぶし
render.Clear(Color.Aqua);

//レイヤーを使用したクリッピングの終了
//
//(注)PushLayer関数を使用したら、EndDraw関数を実行する前に、
//  PopLayer関数を実行しないとエラー。
render.PopLayer();

//描画の終了
render.EndDraw();

};

form.ShowDialog();
}
}
}

Direct2D 描画範囲のクリッピング

using System;
using SharpDX;
using SharpDX.Direct2D1;

namespace Project1
{
internal static class Program
{
private static void Main()
{
var form = new System.Windows.Forms.Form();
var formSize = form.Size;

//描画用の設定
var hwnd = new HwndRenderTargetProperties();
hwnd.Hwnd = form.Handle;
hwnd.PixelSize = new Size2(formSize.Width, formSize.Height);

//描画用オブジェクトを作成
var factory = new SharpDX.Direct2D1.Factory();
var render = new SharpDX.Direct2D1.WindowRenderTarget(factory, new RenderTargetProperties(), hwnd);


form.MouseDown += (sender, e) =>
{
//描画開始
render.BeginDraw();

//描画範囲をクリッピングする関数
//(注)BeginDraw関数の前に実行するとエラー
//
//第一引数で描画範囲を指定
render.PushAxisAlignedClip(new RectangleF(10, 10, 100, 100), AntialiasMode.Aliased);

//背景の塗りつぶし
render.Clear(Color.AliceBlue);

//クリッピングを終了する関数
//(注)EndDraw関数の後に実行するとエラー。
//  また、PushAxisAlignedClip関数を使用した時は、EndDraw関数を呼ぶ前に、
//  この関数を実行しないとエラー
render.PopAxisAlignedClip();

//再度クリッピング
render.PushAxisAlignedClip(new RectangleF(100, 100, 100, 100), AntialiasMode.Aliased);
//背景の塗りつぶし
render.Clear(Color.Aqua);
//再度クリッピングを終了する
render.PopAxisAlignedClip();

//描画の終了
render.EndDraw();

};

form.ShowDialog();
}
}
}
プロフィール

みにおん

Author:みにおん
c#でゲームを作る人です
web小説なども書いています

低学歴で馬鹿なのパート従業員
ですが、よろしく

相互リンク・ブロとも募集中です
コメントなどご自由にどうぞ

ホームページを見る
Twitter(個人ページ)
PIXIV(個人ページ)

○自作ゲーム一覧
ふりーむ
フリーゲーム夢幻
100%ふりげストア

・web小説
最後の時の夢

最新記事
最新コメント
月別アーカイブ
カテゴリ
ブロとも一覧
検索フォーム
ブロとも申請フォーム

この人とブロともになる

RSSリンクの表示
リンク
アクセスランキング
QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。