ڈبلیو پی ایف ونڈو پر براہ راست ایکس این اے نظارہ ظاہر کریں

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

خلاصہ

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

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

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

ضروری شرائط

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

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

پلیٹ فارم

مادہ

ڈبلیو پی ایف ایپلی کیشنز میں ایکس این اے کا استعمال کرتے ہوئے ، میں نے ویو کو ظاہر کرنے کے لئے ونڈوز فارمز ہوسٹ کنٹرول کا استعمال کیا ، لیکن اب میں کثیر الجہتی کو ظاہر کرنے کے لئے صرف ڈبلیو پی ایف ونڈو استعمال کرنا چاہتا ہوں۔ "ڈبلیو پی ایف ایپلی کیشنز میں ایکس این اے کا استعمال" ایک نمائندگی ہے، لہذا میں اختلافات کی وضاحت کروں گا.

نام کی جگہ aliases

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

چونکہ رنگ اور میٹرکس ڈھانچے ایکس این اے فریم ورک اور ڈبلیو پی ایف نام کی جگہوں کا احاطہ کرتے ہیں ، لہذا آپ کو اسے استعمال کرنے کے لئے نام کی جگہ سے ڈھانچے کے نام کی وضاحت کرنا ضروری ہے۔ تاہم ، یہ ہر بار لمبا لگتا ہے ، لہذا میں ایک نام کی جگہ عرف بنا رہا ہوں۔ مثال کے طور پر ، "مائیکروسافٹ.Xna.فریم ورک.مستطیل" کو اب "Xna.مستطیل" کے طور پر بیان کیا جاسکتا ہے۔

ٹائمر

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

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

فیلڈ ، ڈسپیچر ٹائمر کا اعلان کرنا۔

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

ایک ایسے طریقہ کار کی وضاحت کرتا ہے جسے ڈسپیچر ٹائمر باقاعدگی سے وقفے سے کال کرتا ہے۔

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

یہ ٹائمر مقرر کرنے کا عمل ہے۔ ڈسپیچر ٹائمر کی مثال بنانے اور کال کرنے کا طریقہ اور وقت کا وقفہ ترتیب دینے کے بعد ، ڈسپیچر ٹائمر ڈاٹ اسٹارٹ طریقہ ٹائمر شروع کرتا ہے۔

ونڈو ہینڈل حاصل کرنا

ڈائریکٹ 3 ڈی ڈیوائس بنانے کے لئے ، آپ کو ونڈو ہینڈل کی ضرورت ہے۔ تاہم ، ڈبلیو پی ایف کے پاس ونڈو ہینڈل کا تصور نہیں ہے ، لہذا ونڈو کلاس سے اسے براہ راست حاصل کرنے کا کوئی طریقہ نہیں ہے۔

تاہم ، چونکہ ایسے اوقات ہوتے ہیں جب ونڈو ہینڈل کی ضرورت ہوتی ہے ، جیسا کہ اس معاملے میں ، ونڈو ہینڈل کو ون 32 کوڈ کے انٹروپ کے طور پر "سسٹم ڈاٹ ونڈوز ڈاٹ انٹروپ ڈاٹ ونڈو انٹرپ ہیلپر" کلاس کے ذریعہ حاصل کیا جاسکتا ہے۔ (یہ ونڈو کلاس ہے)

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

ڈائریکٹ 3 ڈی ڈیوائس بناتے وقت اس ہینڈل کا استعمال کریں۔ تاہم ، اگر آپ ونڈو ہینڈل کو آن انجینائزڈ طریقہ کار میں حاصل کرنے کی کوشش کرتے ہیں تو ، یہ 0 واپس آجائے گا ، شاید اس وجہ سے کہ ونڈو ابھی تک نہیں بنائی گئی ہے۔ اس نمونے میں ، آلہ آن سورس ابتدائی طریقہ کار میں بنایا گیا ہے۔

مخصوص علاقے میں پیش کریں

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

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

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

ایک آلہ کو تباہ کرنا

جب آپ ونڈو بند کرتے ہیں تو آپ اپنے آلے کو تباہ کر رہے ہیں۔ اصل میں ، میں اسے ڈسپوز طریقہ کار کے ساتھ سنبھالنا چاہتا تھا ، لیکن چونکہ ڈبلیو پی ایف ونڈو کلاس ڈیفالٹ طور پر آئی ڈسپوزایبل وراثت میں نہیں ہے ، لہذا میں نے اس کے بجائے اسے یہاں لکھا۔

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

    base.OnClosed(e);
}

نفاذ

اگر آپ نمونہ پروگرام چلاتے ہیں تو ، آپ اسے مضمون کے آغاز میں اسکرین امیج کی طرح چلا سکتے ہیں۔

پہلی نظر میں ، یہ اچھی طرح سے پیش ہوتا ہے ، لیکن جب میں ونڈو کو ماؤس کے ساتھ گھسیٹ کر اس کا سائز تبدیل کرتا ہوں تو ، نظارہ جھلکتا ہے یا دوبارہ سائزنگ کے دوران غائب ہوجاتا ہے۔ ایسا لگتا ہے کہ یہ ڈبلیو پی ایف رینڈرنگ کے ساتھ متضاد ہے ، اور میں نے بہت ساری چیزوں کی کوشش کی لیکن اسے حل نہیں کرسکا۔

اگر آپ ایکس این اے استعمال کر رہے ہیں تو ، ونڈوز فارمز ہوسٹ کنٹرول کا استعمال کرنا محفوظ لگتا ہے۔

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

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