ڈبلیو پی ایف ایپلی کیشنز میں ایکس این اے کا استعمال

جب صفحے کی تازہ کاری :
صفحہ تخلیق تاریخ :

خلاصہ

ڈبلیو پی ایف ایپلی کیشنز میں ایکس این اے فریم ورک کو استعمال کرنے کا طریقہ بیان کرتا ہے۔

WPF アプリケーションで XNA を使用する

آپریٹنگ ماحول

ضروری شرائط

XNA ورژن کی حمایت کی
  • 2.0
  • 3.0
حمایت یافتہ پلیٹ فارم
  • ونڈوز (ایکس پی ایس پی 2 یا اس کے بعد، وسٹا)
Windows Required Vertex Shader Version 1.1
Windows Required پکسل شادer Version 1.1

آپریٹنگ ماحول

پلیٹ فارم

مادہ

ڈائریکٹ ایکس کا استعمال کرتے ہوئے کسی خاص کنٹرول کو پیش کرنے کے لئے ، آپ کو اس کنٹرول کے لئے ونڈو ہینڈل حاصل کرنے کی ضرورت ہے۔ تاہم ، ونڈوز فارم کنٹرولز کے برعکس ، ڈبلیو پی ایف کنٹرولز میں ونڈو ہینڈل نہیں ہوتے ہیں (ڈبلیو پی ایف میں وہ صرف کنٹرول کو "کھینچتے" ہیں)۔

تاہم ، ڈبلیو پی ایف "ونڈوز فارمز ہوسٹ" نامی ایک کنٹرول فراہم کرتا ہے جو آپ کو ونڈوز فارم کنٹرول استعمال کرنے کی اجازت دیتا ہے۔

اس مضمون میں ، ہم ایک کثیر الجہتی ڈرائنگ کا ایک نمونہ بنائیں گے کیونکہ اسے اوپر دکھایا گیا ہے ، لیکن میں ایکس این اے کی تفصیلات کو ہی چھوڑ دوں گا کیونکہ اس کی وضاحت کرنے میں بہت وقت لگے گا۔ میں صرف ڈبلیو پی ایف اور ایکس این اے کے درمیان تعلقات کے بارے میں بات کروں گا.

سب سے پہلے ، ڈبلیو پی ایف ونڈو کھولیں (اس معاملے میں ، ونڈو 1.xaml) اور ٹول بار سے ونڈوز فارم ہوسٹ کنٹرول رکھیں۔ دائیں طرف سلائیڈر ایک بونس ہے۔

WPF ウインドウデザイン

مجھے واقعی ایکس اے ایم ایل پر تھوڑا سا اور کام کرنے کی ضرورت ہے ، لیکن میں اسے بعد میں چھوڑ دوں گا کیونکہ مجھے پہلے ایکس این اے کو استعمال کرنے کے لئے کنٹرول بنانا ہوگا۔

اپنے پروجیکٹ میں "ونڈوز فارم" "کسٹم کنٹرول" شامل کریں۔ گرافکس ڈیوائس کنٹرول کا نام چھوڑ دیں۔

Windows Forms のカスタムコントロールを追加

"Microsoft.Xna.فریم ورک" کا حوالہ پہلے شامل کرنا مت بھولنا۔ "مائیکروسافٹ.Xna.فریم ورک.گیم" بھی ہے ، لیکن یہ صرف گیم پروجیکٹ میں استعمال ہوتا ہے ، لہذا اسے شامل کرنے کی ضرورت نہیں ہے۔

Managed DirectX の参照

نمونہ کوڈ کو مختصر رکھنے کے لئے ، تمام ایکس این اے سے متعلق پروگراموں کا خلاصہ GraphicsDeviceControl.cs میں کیا گیا ہے۔ یہ ایک بہت ورسٹائل لکھنے کا انداز نہیں ہے، لہذا براہ مہربانی اسے لاگو کریں اور اسے دوبارہ لکھیں.

گرافکس ڈیوائس کنٹرول کے لئے مکمل کوڈ نیچے دکھایا گیا ہے (ڈیزائنر کے حصے کو چھوڑ کر). اگر آپ نے کبھی ایکس این اے استعمال کیا ہے تو ، آپ کو معلوم ہوگا کہ یہ عام سے باہر کچھ بھی نہیں کرتا ہے۔ میں ٹائمر جزو استعمال کر رہا ہوں تاکہ کثیر الجہتی کو ہر وقت گھومتا ہوا ظاہر کیا جاسکے۔

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace XNAOnWPF
{
    /// <summary>
    /// グラフィックデバイスコントロール
    /// </summary>
    public partial class GraphicsDeviceControl : Control
    {
        /// <summary>
        /// グラフィックデバイス
        /// </summary>
        private GraphicsDevice device = null;

        /// <summary>
        /// エフェクト
        /// </summary>
        private BasicEffect effect = null;

        /// <summary>
        /// 頂点データ
        /// </summary>
        private VertexPositionColor[] vertices = new VertexPositionColor[3];
        /// <summary>
        /// 頂点データ
        /// </summary>
        public VertexPositionColor[] Vertices
        {
            get { return this.vertices; }
        }


        /// <summary>
        /// コンストラクタ
        /// </summary>
        public GraphicsDeviceControl()
        {
            InitializeComponent();
        }

        /// <summary>
        /// コントロールが作成されるとき
        /// </summary>
        protected override void OnCreateControl()
        {
            if (this.DesignMode == false)
            {
                try
                {
                    // デバイス作成
                    PresentationParameters pp = new PresentationParameters();
                    pp.SwapEffect = SwapEffect.Discard;
                    pp.BackBufferWidth = 300;
                    pp.BackBufferHeight = 300;
                    pp.EnableAutoDepthStencil = true;
                    pp.AutoDepthStencilFormat = DepthFormat.Depth16;
                    this.device = new GraphicsDevice(GraphicsAdapter.DefaultAdapter,
                        DeviceType.Hardware, this.Handle, pp);

                    // 頂点データの設定
                    this.vertices[0] = new VertexPositionColor(
                        new Vector3(0.0f, -2.0f + (float)Math.Sqrt(3) * 3.0f, 0.0f),
                        new Microsoft.Xna.Framework.Graphics.Color(255, 0, 0));
                    this.vertices[1] = new VertexPositionColor(
                        new Vector3(3.0f, -2.0f, 0.0f),
                        new Microsoft.Xna.Framework.Graphics.Color(0, 255, 0));
                    this.vertices[2] = new VertexPositionColor(
                        new Vector3(-3.0f, -2.0f, 0.0f),
                        new Microsoft.Xna.Framework.Graphics.Color(0, 0, 255));

                    // 頂点定義
                    this.device.VertexDeclaration =
                        new VertexDeclaration(this.device, VertexPositionColor.VertexElements);

                    // エフェクト
                    this.effect = new BasicEffect(this.device, null);
                    this.effect.VertexColorEnabled = true;

                    // ビュー変換行列を設定
                    this.effect.View = Matrix.CreateLookAt(
                        new Vector3(0.0f, 0.0f, -10.0f),
                        new Vector3(0.0f, 0.0f, 0.0f),
                        Vector3.Up);

                    // 射影変換を設定
                    this.effect.Projection = Matrix.CreatePerspectiveFieldOfView(
                        MathHelper.ToRadians(45.0f), 1.0f, 1.0f, 100.0f);

                    // レンダリングステート設定
                    this.device.RenderState.CullMode = CullMode.None;
                    this.device.RenderState.AlphaBlendEnable = true;
                    this.device.RenderState.SourceBlend = Blend.SourceAlpha;
                    this.device.RenderState.DestinationBlend = Blend.InverseSourceAlpha;
                }
                catch (Exception ex)
                {
                    Trace.WriteLine(ex.ToString());
                }
            }

            base.OnCreateControl();
        }

        /// <summary>
        /// 使用中のリソースをすべてクリーンアップします。
        /// </summary>
        /// <param name="disposing">マネージ リソースが破棄される場合 true、破棄されない場合は false です。</param>
        protected override void Dispose(bool disposing)
        {
            if (disposing && (components != null))
            {
                components.Dispose();
            }

            if (disposing)
            {
                if (this.device != null)
                {
                    this.device.Dispose();
                }
            }
            base.Dispose(disposing);
        }

        /// <summary>
        /// 描画イベント
        /// </summary>
        /// <param name="pe"></param>
        protected override void OnPaint(PaintEventArgs pe)
        {
            this.Draw();

            base.OnPaint(pe);
        }

        /// <summary>
        /// 描画
        /// </summary>
        private void Draw()
        {
            if (this.device == null)
            {
                return;
            }

            this.device.Clear(Microsoft.Xna.Framework.Graphics.Color.DarkBlue);

            // ポリゴンを描画する
            this.effect.Begin();
            this.effect.Techniques[0].Passes[0].Begin();

            this.effect.World = Matrix.CreateRotationY((float)Environment.TickCount / 1000.0f);
            this.device.DrawUserPrimitives<VertexPositionColor>(
                PrimitiveType.TriangleList, vertices, 0, 1);

            this.effect.Techniques[0].Passes[0].End();
            this.effect.End();

            this.device.Present();
        }

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

اب جب آپ نے کنٹرول بنایا ہے تو ، آئیے ایکس اے ایم ایل پر نظر ڈالیں۔ چونکہ ہم اپنے بنائے ہوئے کنٹرول کو رکھنے جا رہے ہیں ، لہذا ہم روٹ ٹیگ میں ایک نام کی جگہ شامل کریں گے۔ یہاں ، اسے "ایکس ڈبلیو" کے طور پر بیان کیا گیا ہے۔

<Window&nbsp;x:Class="ManagedDirectXOnWPF.Window1"
&nbsp;&nbsp;&nbsp;&nbsp;xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
&nbsp;&nbsp;&nbsp;&nbsp;Title="WPFウインドウ上でManaged DirectXを使用してポリゴン描画"
&nbsp;&nbsp;&nbsp;&nbsp;Height="338"&nbsp;Width="422"
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:my="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xw="clr-namespace:ManagedDirectXOnWPF">
    <!-- 省略 -->
</Window>

اگلا ، ونڈوز فارمز ہوسٹ کنٹرول کے لئے ٹیگ کو وسعت دیں جو آپ نے ابھی رکھا ہے ، اور گرافکس ڈیوائس کنٹرول شامل کریں ، جیسا کہ نیچے دکھایا گیا ہے۔

<my:WindowsFormsHost&nbsp;Name="windowsFormsHostManagedDirectX"&nbsp;Width="300"&nbsp;Height="300"
                    HorizontalAlignment="Left"&nbsp;VerticalAlignment="Top">
  <xw:GraphicsDeviceControl&nbsp;x:Name="GraphicsDeviceControl"&nbsp;/>
</my:WindowsFormsHost>

آپ کو "x: نام" رکھنے کی ضرورت نہیں ہے ، لیکن نمونہ سلائیڈر کے ساتھ ورٹیکس ڈیٹا تک رسائی حاصل کرنے کے لئے اس کا استعمال کرتا ہے۔

اگر آپ ایسا کرتے ہیں تو ، آپ ڈبلیو پی ایف پر ایک منظر چلا سکتے ہیں جہاں کثیر الجہتی کو گھومنے والے کثیر الجہت کے ساتھ کھینچا جاتا ہے ، جیسا کہ نمونے میں دکھایا گیا ہے۔ سلائیڈر کے ذریعہ رسائی ایک بونس ہے ، لہذا براہ کرم نمونہ ڈیٹا ڈاؤن لوڈ کریں اور اسے چیک کریں۔

پروگرام کو .NET فریم ورک 3.0 ، تازہ ترین ڈائریکٹ ایکس رن ٹائم ، اور مائیکروسافٹ ایکس این اے فریم ورک دوبارہ تقسیم کرنے کے قابل 2.0 کی ضرورت ہے۔ اس کے علاوہ ، ہارڈ ویئر کی ضرورت کے طور پر ، "ایک گرافکس کارڈ جو پکسل شیڈر 1.1 یا اس سے زیادہ کی حمایت کرتا ہے" کی ضرورت ہے۔

اس کے علاوہ ، یہ منصوبہ "ویژول اسٹوڈیو 2008 پروفیشنل ایڈیشن" میں بنایا گیا تھا۔ ویژول اسٹوڈیو 2008 کے لئے ایک ماحول تیار کریں۔