Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Control De Directx Para .net

Iniciado por zupervaca, 06 de Julio de 2005, 08:46:29 PM

« anterior - próximo »

zupervaca

 he hecho un control desde c-sharp y .net para controlar un device de directx, si teneis alguna duda ya sabeis, os pongo aqui mismo el codigo por si os interesa a alguien

#region Referencias

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

#endregion

namespace pruebasDirectX
{
   public partial class dibDX : UserControl
   {
       #region Atributos

       // Device de DirectX
       public Device Device
       {
           get
           {
               return m_Device;
           }
       }

       // Parametros del device
       public PresentParameters PresentParameters
       {
           get
           {
               return m_PParams;
           }
       }

       // Pausar el control
       public bool Pause
       {
           get
           {
               return m_Pause;
           }
           set
           {
               m_Pause = Pause;
           }
       }

       #endregion

       #region Metodos

       // Constructor
       public dibDX()
       {
           InitializeComponent();
       }

       // Activar modo de video a pantalla completa
       public void SetFullScreen(int nWidht, int nHeight, int nHz)
       {
           if (m_Device != null)
           {
               // Pantalla completa
               m_PParams.Windowed = false;
               m_PParams.BackBufferWidth = nWidht;
               m_PParams.BackBufferHeight = nHeight;
               m_PParams.FullScreenRefreshRateInHz = nHz;
               m_PParams.DeviceWindowHandle = TopLevelControl.Handle;
               m_OldBound = TopLevelControl.Bounds;
               m_Device.Reset(m_PParams);
           }
       }

       // Activar modo ventana
       public void SetWindowMode()
       {
           if (m_Device != null)
           {
               // Modo ventana
               m_PParams.Windowed = true;
               m_PParams.FullScreenRefreshRateInHz = 0;
               m_PParams.DeviceWindowHandle = Handle;
               m_Device.Reset(m_PParams);
               // Evitar bug de windows form que no actualiza bien la barra del formulario
               TopLevelControl.SetBounds(m_OldBound.X, m_OldBound.Y, m_OldBound.Width + 1, m_OldBound.Height);
               TopLevelControl.SetBounds(m_OldBound.X, m_OldBound.Y, m_OldBound.Width, m_OldBound.Height);
           }
       }

       #endregion

       #region Miembros privados de la clase

       // Valores
       private Rectangle m_OldBound = new Rectangle();
       private Device m_Device = null;
       private PresentParameters m_PParams = new PresentParameters();
       private bool m_Pause = false;

       private void dibDX_Load(object sender, EventArgs e)
       {
           if (!DesignMode)
           {
               // Inicializar el device
               CreateDevice();
           }
       }

       // Inicializar el device
       private void CreateDevice()
       {
           // Preprarar los parametros por defecto
           m_PParams.Windowed = true;
           m_PParams.DeviceWindowHandle = Handle;
           m_PParams.BackBufferFormat = Format.A8R8G8B8;
           m_PParams.BackBufferCount = 2;
           m_PParams.SwapEffect = SwapEffect.Discard;
           m_PParams.PresentationInterval = PresentInterval.Immediate;
           m_PParams.EnableAutoDepthStencil = true;
           m_PParams.AutoDepthStencilFormat = DepthFormat.D16;
           // Crear el device
           m_Device = new Device(0, DeviceType.Hardware, TopLevelControl,
               CreateFlags.MixedVertexProcessing, m_PParams);
       }

       // OnPaint
       private void dibDX_Paint(object sender, PaintEventArgs e)
       {
           if (m_Device != null && !m_Pause )
           {
               // Renderizar la escena
               m_Device.Clear(ClearFlags.Target | ClearFlags.ZBuffer,
                   System.Drawing.Color.Black, 1.0f, 0);
               m_Device.BeginScene();
               // ...
               m_Device.EndScene();
               m_Device.Present();
           }
       }

       // Comprobar cambios de tamaño
       protected override void OnResize(EventArgs e)
       {
           if (TopLevelControl != null)
           {
               // Si se minimiza o no esta visible pausar el control
               m_Pause = !Visible || ((Form)TopLevelControl).WindowState == FormWindowState.Minimized ?
                   true : false;
           }
       }

       #endregion
   }
}


saludos

Aquiles

Hola,

he estado googleando y he visto este post. Necesito embeber una ventana de DirectX en un ActiveX (en C#). No he trabajado mucho con ninguno de los dos, pero por lo que he visto lo que me falla es que a la hora de linkar el directX con un dispositivo, este no puede ser un Form, ya que esto es para ventanas independientes. Supongo que tendré que linkarlo a un usercontrol, pero no estoy seguro de cómo hacerlo.

Quizá alguno de vosotros sepa cómo hacerlo. ¿Me podeis ayudar?

Vicente

Dios, pedazo de necromancia de post :p Te recomiendo que si tienes que usar C# con DX uses SlimDX. Respecto a embeberlo, al menos en WindowsForms deberías poder sobreescribir el método paint y usar su handle para que DX pinte sobre el panel. No recuerdo si en SlimDX tienen algún ejemplo de esto, pero es un buen sitio para empezar.

Un saludo!

Vicente

[EX3]

Cita de: Aquiles en 30 de Marzo de 2009, 06:24:22 PM
lo que me falla es que a la hora de linkar el directX con un dispositivo, este no puede ser un Form, ya que esto es para ventanas independientes. Supongo que tendré que linkarlo a un usercontrol, pero no estoy seguro de cómo hacerlo.
Para conectar un WinForm o cualquier control que lo permita (un Picture por ejemplo) con DirectX debes pasar el codigo controlador de la ventana o control (Hwnd) para crear el contexto de Direct3D, DirectInput, etc... En el caso de .NET esta propiedad se llama si no recuerdo mal "Handle" pero tendras que hacer una conversion al tipo IntPtr de .NET para que sea el tipo compatible con el parametro que espera el Hwnd del control. De esta forma puedes conectar el render de D3D o los eventos de DInput a un control WinForm cualquiera.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.