[Atelier Blue アトリエブルー]HomeプログラミングManaged DirectX3D>サイズ可変ウィンドウ

サイズ可変ウィンドウ

サイズが可変なウィンドウの作り方です。

前回との変更点は次の通りです。

using System;
using System.Drawing;
using System.Windows.Forms;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

namespace Project2
{
    /// <summary>
    /// md3d2 の概要の説明です。
    /// </summary>
    public class md3d2:Form
    {

        public md3d2():base()
        {
            //最小サイズを設定
            this.MinimumSize=new Size(80,60);
            //ウィンドウの名前(かっこいいのを付けてあげてください)
            this.Text ="Direct3D-My";
        }

        private Device device_;
        private PresentParameters presentParam_;

        /// <summary>
        /// Direct3Dの初期化を行います。
        /// </summary>
        /// <returns>初期化が成功したかどうか</returns>
        public bool DXInitialize()
        {
            try 
            {
                //プレゼンテーションパラメータを作成
                presentParam_ = new PresentParameters();

                //ウィンドウモード
                presentParam_.Windowed =true;

                //スワップエフェクトを設定。
                presentParam_.SwapEffect = SwapEffect.Discard;

                //デバイスを作成
                device_ = new Device(0,DeviceType.Hardware,this
                    ,CreateFlags.HardwareVertexProcessing,presentParam_);

                creatVertex();

                //初期化成功
                return true;
            }
            catch 
            {
                //初期化失敗
                return false;
            }

        }

        /// <summary>
        /// 頂点バッファ
        /// </summary>
        private VertexBuffer vertexBuffer_;

        /// <summary>
        /// 頂点バッファ作成関数
        /// </summary>
        private void creatVertex()
        {
            //頂点バッファ領域を確保
            vertexBuffer_ = new VertexBuffer(typeof(CustomVertex.TransformedColored),
                6, device_, 0, CustomVertex.TransformedColored.Format, Pool.Managed);

            //バッファをロック
            GraphicsStream stm = vertexBuffer_.Lock(0,0,0);

            //頂点データの配列を作成
            CustomVertex.TransformedColored[] verts = new CustomVertex.TransformedColored[6];

            //頂点データ
            verts[0].X=50;verts[0].Y=250;verts[0].Z=0.5f; verts[0].Rhw=1;
            verts[0].Color = System.Drawing.Color.LightPink.ToArgb();
            verts[1].X=150;verts[1].Y=50;verts[1].Z=0.5f; verts[1].Rhw=1;
            verts[1].Color = System.Drawing.Color.Aqua.ToArgb();
            verts[2].X=250;verts[2].Y=250;verts[2].Z=0.5f;verts[2].Rhw=1;
            verts[2].Color = System.Drawing.Color.Brown.ToArgb();

            verts[3].X=350;verts[3].Y=50;verts[3].Z=0.5f; verts[3].Rhw=1;
            verts[3].Color = System.Drawing.Color.Black.ToArgb();
            verts[4].X=450;verts[4].Y=250;verts[4].Z=0.5f;verts[4].Rhw=1;
            verts[4].Color = System.Drawing.Color.Red.ToArgb();
            verts[5].X=550;verts[5].Y=50;verts[5].Z=0.5f; verts[5].Rhw=1;
            verts[5].Color = System.Drawing.Color.Green.ToArgb();


            //頂点データをバッファに書き込み
            stm.Write(verts);

            //バッファのロックを解除
            vertexBuffer_.Unlock();
        }

        public void Render()
        {
            if(device_==null)return;
            if(this.WindowState ==FormWindowState.Minimized)return;


            //クリア処理
            device_.Clear(ClearFlags.Target,Color.Blue,1.0f,0);

            //描画開始
            device_.BeginScene();


            //頂点バッファをセット
            device_.SetStreamSource(0,vertexBuffer_,0);
            //頂点バッファのフォーマットをセット
            device_.VertexFormat = CustomVertex.TransformedColored.Format;
            //描画
            device_.DrawPrimitives(PrimitiveType.TriangleStrip,0,4);


            //描画終わり
            device_.EndScene();

            try             
            {
                //更新
                device_.Present();
            }
            catch(DeviceLostException ex)
            {
                resetDevice();
            }

        }

        /// <summary>
        /// デバイスのリセットを行う
        /// </summary>
        private void resetDevice()
        {
            int result;
            if(!device_.CheckCooperativeLevel(out result))
            {
                if(result ==(int)ResultCode.DeviceLost)
                {
                    //ちょっと待つ
                    System.Threading.Thread.Sleep(10);
                }
                else if(result ==(int)ResultCode.DeviceNotReset)
                {
                    device_.Reset(presentParam_);
                }
            }
        }
    }

    /// <summary>
    /// エントリクラス
    /// </summary>
    class Program
    {
        public static void Main()
        {
            using(md3d2 dxform =new md3d2())
            {
                if(!dxform.DXInitialize())
                {
                    MessageBox.Show("Direct3Dの初期化に失敗しました。","初期化の失敗");
                    return;
                }

                dxform.Show();

                while(dxform.Created)
                {
                    dxform.Render();
                    Application.DoEvents();
                }
            }
        }
    }
}



ページの一番上へ
前のページへ 一覧に戻る 次のページへ
初版2006-3-10
[Atelier Blue アトリエブルー]HomeプログラミングManaged DirectX3D>サイズ可変ウィンドウ