オノデラの研究日記 in わんくま

思いついたネタを気ままに書いていくブログ

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  209  : 記事  5  : コメント  5961  : トラックバック  40

ニュース

プロフィール

  • ●おのでら
    宮城県在住
    主に業務向けソフトを製作

Twitter

ニュース

主なリンク

XNA 関連リンク

アイテム

ゲーマーカード

その他

記事カテゴリ

書庫

日記カテゴリ

 「WPF上でManaged DirectXを使用する」や「WPF上でXNAを使用する」では WindowsFormsHost コントロールを使用してビューを表示させていましたが、今回は WPF ウインドウのみを使ってポリゴンを表示させてみたいと思います。Managed DirectX も XNA も同じようなコードになるので、今回は XNA Framework の方を使ってみたいと思います。

 下が実行結果です。

WPFウインドウ上にXNAのビューを表示する

 今までと少し作りを変えているので、違う部分を説明していきます。

名前空間エイリアス

// 名前空間エイリアス
using Xna = Microsoft.Xna.Framework;
using XnaGraphics = Microsoft.Xna.Framework.Graphics;

 ColorMatrix の構造体などが XNA Framework と WPF の名前空間でかぶってしまうため、構造体の名前を使うには名前空間から指定しないといけません。しかし、毎回つけると長ったらしいので名前空間のエイリアスを作成しています。たとえば「Microsoft.Xna.Framework.Rectangle」は「Xna,Rectangle」と指定できるようになります。

タイマー

 .NET Framework 3.0 からは「System.Windows.Threading.DispatcherTimer」というタイマークラスが使えるようになっており、今回このタイマークラスを使って毎フレームレンダリングするようにしています。WPF では DispatcherTimer を使うことにより、UI と同じスレッドで処理することができるようになっています。

/// <summary>
/// タイマー
/// </summary>
private DispatcherTimer timer = null;

 フィールドで DispatcherTimer を宣言しています。

/// <summary>
/// タイマーイベント
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
    this.Draw();
}

 DispatcherTimer が一定時間ごとに呼ぶメソッドを定義します。

// タイマー
this.timer = new DispatcherTimer();
this.timer.Tick += new EventHandler(dispatcherTimer_Tick);
this.timer.Interval = new TimeSpan(0, 0, 0, 0, 16);
this.timer.Start();

 タイマーの設定処理です。DispatcherTimer のインスタンスを作成し、コールするメソッドと時間間隔を設定したら、DispatcherTimer.Start メソッドでタイマーが開始します。

ウインドウハンドルの取得

 Direct3D デバイスを作成するにはウインドウハンドルが必要です。しかし WPF ではウインドウハンドルという概念は基本的にないため、Window クラスから直接取得する方法がありません。

 ただ、今回のようにウインドウハンドルが必要な場合もあるため、Win32 コードの相互運用として「System.Windows.Interop.WindowInteropHelper」クラスを経由してウインドウハンドルを取得できるようになっています。(this は Window クラスです)

// ウィンドウハンドルを取得する
IntPtr handle = new WindowInteropHelper(this).Handle;

 Direct3D デバイスを作成するときはこのハンドルを使用します。ただ、OnInitialized メソッドでウインドウハンドルを取得しようとすると、ウインドウがまだ作成されていないためか 0 が返ってきます。今回のサンプルではデバイスの作成を OnSourceInitialized メソッドで行っています。

指定領域にレンダリング

 GraphicsDevice.Present の第2引数に描画先の領域を指定することができます。サンプルではオフセットとして(50, 50)の位置に描画するようにしています。サイズはバックバッファのサイズと同じ(300, 300)です。第1引数は描画元の領域で、null を指定すると元のバッファがそのまま使われます。

// 描画先を指定する
Xna.Rectangle rect = new Xna.Rectangle(
    50, 50,
    (int)this.viewSize.Width, (int)this.viewSize.Height);

this.device.Present(null, rect, this.windowHandle);

デバイスの破棄

 ウインドウを閉じたときにデバイスを破棄しています。本来 Dispose メソッドなどで処理したかったのですが、WPF の Window クラスはデフォルトでは IDisposable が継承されていないので、かわりにここに記述しました。

/// <summary>span class="src_documentcomment">
/// ウインドウが閉じたとき
/// </summary>
/// <param name="e"></param>
protected override void OnClosed(EventArgs e)
{
    if (this.device != null)
    {
        this.device.Dispose();
        this.device = null;
    }

    base.OnClosed(e);
}

実行

 サンプルプログラムを実行すると、記事の最初のほうに画面イメージで実行することができます。

 一見うまくレンダリングされていますが、マウスでウインドウのサイズをドラッグで変更すると、サイズ変更中にビューがちらついたり非表示になったりします。どうも WPF のレンダリングと競合しているようで、いろいろ試してみたのですが解決できませんでした。

 XNA や Managed DirectX を使う場合は WindowsFormsHost コントロールを使ったほうが無難なような気がします。

配布ファイル

 以下、実行ファイルです。「.NET Framework 3.0」と「最新の DirectX ランタイム」「Microsoft XNA Framework Redistributable 2.0」が必要です。また、ハードウェア要件として「シェーダモデルバージョン 1.1 以上に対応したグラフィックカード」が必要です(たぶん)。

 サンプルプロジェクト一式です。「Visual Studio 2008 Professional Edition」で作成しています。

投稿日時 : 2008年1月30日 12:48

コメント

# WiiaWXdoiveQCTO 2012/01/07 9:12 http://www.luckyvitamin.com/m-169-jarrow-formulas
Author, keep doing in the same way..!

# replica cartier love bracelet 2017/06/19 7:40 devtnhcvhefslrrcbwkxww@hotmal.com
Cool story bro. There are three other entrances into the alleyway from VT and RI. Do you even read a post before responding to it with condescension? I don’t care how long you’ve lived in 242; playing the “welcome to the city” card is weak and lazy.
replica cartier love bracelet http://www.myjewelery.net/tag/replica-cartier-love-bracelet

# how to open Knockoff cartier bracelet 2017/06/19 7:41 deojlnmtefsiikseotg@hotmal.com
FYI, here is how the economics work for OpenTable restaurants.
how to open Knockoff cartier bracelet http://www.clovebangles.com/2017/04/10/2017-imitation-cartier-love-bracelet-series-of-new-force-for-romantic-sale/

# replica love bracelet rose gold 2017/06/19 7:42 dewmwasdioutcefscofyynnzbq@hotmal.com
wh0cd476266 web site crestor online buy sildalis vardenafil erythromycin
replica love bracelet rose gold http://www.finejewelryinformation.com/

# prednisone 5mg price https://prednisonesnw.com/#
purchase prednisone canada 2021/11/13 9:43 Prednisone
prednisone 5mg price https://prednisonesnw.com/#
purchase prednisone canada

# sildenafil 20 mg tablet uses https://viasild24.online/
2021/12/07 19:28 Nyusjdh
sildenafil 20 mg tablet uses https://viasild24.online/


# ncovlynlqwdb 2022/05/09 6:45 xrxtla
how long has hydroxychloroquine been used https://keys-chloroquinehydro.com/

# cytotec pills buy online https://cytotec24.com/ cytotec pills buy online 2024/02/29 17:37 Cytotec
cytotec pills buy online https://cytotec24.com/ cytotec pills buy online

# abella danger izle https://abelladanger.online/ abella danger filmleri
2024/03/04 21:24 Adella
abella danger izle https://abelladanger.online/ abella danger filmleri


# lana rhoades hot - https://lanarhoades.pro/ lana rhoades
2024/03/06 18:12 LanaRho
lana rhoades hot - https://lanarhoades.pro/ lana rhoades


# aviator mz https://aviatormocambique.site aviator online
2024/03/12 1:39 AviatorMaz
aviator mz https://aviatormocambique.site aviator online


# sweet bonanza hilesi https://sweetbonanza.bid/ - sweet bonanza yasal site
2024/03/28 0:21 Bonanzaj
sweet bonanza hilesi https://sweetbonanza.bid/ - sweet bonanza yasal site


Post Feedback

タイトル
名前
Url:
コメント