Para poder incrustar XNA en Winforms me base en los ejemplos oficiales de Microsoft y el código que proporcionaban (desgraciadamente las ligas ya no funcionan pero si alguien le interesa era esta http://create.msdn.com/en-US/education/catalog/sample/winforms_series_1) . Por suerte guarde una copia =) y pueden descargar el código original de Microsoft desde aquí.
Para poder empezar debemos tener instalado Visual Studio 2010 como IDE y el SDK de XNA (los enlaces de descarga se pueden obtener rápidamente googleando), el lenguaje de programacion sera C# , primero debemos crear un proyecto nuevo pero de Winforms con el nombre que nos parezca mas correcto.
Después de crear el proyecto debemos copiar las clases GraphicsDeviceControl.cs, GraphicsDeviceService.cs y ServiceContainer.cs que descargamos del código de Microsoft a la carpeta donde esta nuestro código (generalmente la ruta es C://../VisualStudio/Proyectos/NombreDeMiProyecto/NombreDeMiProyecto/ que debe contener únicamente las clases generadas por el IDE) y agregarlas desde la interfaz con click derecho sobre el proyecto, en el submenu seleccionar Add>Existing Item y seleccionar las clases que acabamos de agregar a la carpeta.
Después de este paso deben de verse las clases en el árbol de archivos del proyecto.
Ahora debemos agregar las referencias a XNA para que las clases agregadas funcionen dando click derecho sobre "References".
En la ventana que se abre, nos vamos a la pestaña .NET y seleccionamos todas las referencias al framework de XNA y compilamos para verificar que no hay ningún error, si todo funciona correctamente es que lo hemos hecho bien hasta ahora.
Como en este caso solo queremos que este renderizada por la tarjeta de vídeo una parte de la aplicacion utilizando XNA, agregaremos un panel desde el diseñador de interfaces donde sucederá esto (de hecho se puede hacer con cualquier componente de winforms).
Ahora agregamos una clase a nuestro proyecto, yo le llame XNAPanel que heredara de la clase GraphicsDeviceControl (que esta en el namespace WinFormsGraphicsDevice) e implementar los métodos abstractos Initialize() y Draw().
Aquí se muestra el código:
Ahora tenemos que forzar a que el panel de Winforms hecho con el diseñador sea sustituido por nuestro panel creado (si no lo hacemos de esta manera, no podremos usar el diseñador en nuestra aplicacion).
Para llevar a cabo esto debemos entrar al código de nuestra forma generada por el asistente (hacer click derecho en form1 y entrar a "View code" de la clase Form1.Designer.cs)
Observamos que aquí viene comentado la parte de código donde se crea cada componente de la interfaz gráfica.
Para evitar cometer errores e interferir con el código autogenerado, vamos a implementar un método llamado initializeXNAPanel() y aquí asignaremos nuestro XNAPanel al contenedor panel creado con el asistente, además declaramos nuestra referencia al XNAPanel para poder utilizarlo.
Después de realizar este paso, solo tenemos que llamar a nuestro método en el momento en que es creada nuestra forma, en este caso es en la clase Form1.cs.
Si todo ha salido bien debemos ver un bonita pantalla como esta:
...Y eso es todo :D , para revisar el proyecto, los códigos fuente están aquí
Cualquier duda o comentario no duden en contactarme =)
Para evitar cometer errores e interferir con el código autogenerado, vamos a implementar un método llamado initializeXNAPanel() y aquí asignaremos nuestro XNAPanel al contenedor panel creado con el asistente, además declaramos nuestra referencia al XNAPanel para poder utilizarlo.
Después de realizar este paso, solo tenemos que llamar a nuestro método en el momento en que es creada nuestra forma, en este caso es en la clase Form1.cs.
Si todo ha salido bien debemos ver un bonita pantalla como esta:
...Y eso es todo :D , para revisar el proyecto, los códigos fuente están aquí
Cualquier duda o comentario no duden en contactarme =)











Buen dia amigo, estaba viendo este tutorial que subiste, la verdad muy bueno explica todo paso a paso, actualmente tengo que elaborar algo justamente haciendo esto que comentas, pero tengo la duda de como hacer para llamar los metodos de Draw y todos los que tiene el xna, los hacemos desde la clase XNAPanel o desde donde podemos hacer esto?
ResponderEliminarEl metodo Draw se llama automaticamente, todo lo que quieras dibujar y tenga cambios deben estar dentro de este metodo (En este caso cambiar el color de fondo en runtime).
EliminarTe dejo un codigo de ejemplo, sirve para cambiar el color de fondo mostrado en el panel al utilizar el metodo changeBackground que se manda llamar desde una clase externa.
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using System.Windows.Forms;
namespace Graficacion
{
/* La clase abstracta GraphicsDeviceControl ofrece a un control de WinForms redibujarse
* utilizando XNA (por medio de la tarjeta de video), es por esto que se hereda de
* GraphicsDeviceControl.*/
/* Se deben sobreescribir los metodos Draw e Initialize para poder instanciar esta clase*/
class XNAPanel : GraphicsDeviceControl
{
/*Se crea un apuntador al objeto Color que utilizaremos para cambiar el color del buffer*/
private Color background;
/*Inicializacion de los parametros*/
protected override void Initialize()
{
/*Se da un valor al apuntador utilizando CornflowerBlue para emular el color
* por defecto en XNA*/
background = Color.CornflowerBlue;
/*Se sobreescribe el evento "Idle" para redibujar constantemente la escena
* dando la interactividad que necesitamos*/
Application.Idle += delegate { Invalidate(); };
}
/*En el metodo Draw se declaran los cambios en la escena*/
protected override void Draw()
{
/*GraphicsDevice es la abstraccion de la tarjeta de video, el metodo Clear limpia
* el buffer de video y lo rellena con un color*/
GraphicsDevice.Clear(background);
}
/*changeBackground permite acceder al atributo background de la instancia y cambiarlo*/
public void changeBackground(int R, int G, int B)
{
background = new Color(R, G, B);
}
}
Gracias amigo checare esto y te aviso como me fue jejeje soy nuevo en esto, disculpa las molestias
EliminarActualizo:
Me funciono bien y era justo lo que necesitaba, gracias, me preguntaba si habia alguna forma de contactarte por mail, por si me surgen algunas dudas luego jejeje no conosco a mucha gente que sepa manejar XNA y menos XNA y Winform combinados. De todas formas te dejo mi mail de forma entusiasta en_dk_@hotmail.com por si tienes algunos tutoriales que tengas guardados por ahi y me los puedas pasar, te lo agradeceria mucho. Tengo que sacar un proyecto combinando estas tecnologias y ando como loco buscando en todas partes como hacerlo.
Por Cierto, deberias seguir publicando, explicas bien el tema y creo que a muchos les serviria tener alguna referencia en español, ya que la mayoria de esto esta en ingles.
Saludos y gracias por la ayuda.
Este comentario ha sido eliminado por el autor.
ResponderEliminarYa te agregue a Skype, si me gustaria seguir escribiendo pero no he podido por el trabajo jeje. Sobre que es tu proyecto?
ResponderEliminarCreo que ambos andamos igual con el trabajo jejeje, el proyecto es de un graficador de grafos en 3D que proveendran de un xml que es generado por una DB, el problema es que esta grafica es un aditamento visual y requiere ser modificado por objetos de la interface de la aplicacion asi como resaltados o manipulados por la seleccion de datos en la grilla que estara alado de la visualizacion de la grafica. Es practicamente un proyecto de maestria en el que se me solicita crear mi propio software y mira que se me acaba de agregar otro proyecto pero en 2D que es de Clustering y tendre que hacer la representacion en 2D de los algoritmos de clustering de los datos de la investigacion ya si despues me dicen que lo pase a 3D pues tendre que pasarlo a 3D jejejeje
EliminarLamentablemente entre la maestria y el trabajo no he podido avanzar mucho hago lo que puedo en el momento que puedo...
En fin como podras ver tu aportacion me ha ayudado bastante y me saco del apuro, espero poder coincidir contigo en el skype, plz cuando puedas hablame y dime que eres el del blog de xna tengo lleno el skype de usuarios y no conosco a todos XD lo uso mucho. Si por alguna razon no te he aceptado es porque no me ha llegado tu solicitud me falla mucho el skype en ese sentido, solo mandame un mail o proporcioname un mail y te agrego o me comunico contigo.
Saludos
http://sdrv.ms/14gq2z7
EliminarTe dejo el link de lo que hice con XNA y winform es uno de los proyectos que me encargaron, picandole se le entiende, pero de lo que se trata es del algoritmo de k-means, es un algoritmo de clustering, los circulos grandes son centroides, los circulos pequeños son datos... o esa es la idea... igual picandole se le entiende...
Nota: le faltan varias validaciones, pero como solo era un proyecto de muestra no le puse tanto lujo, para probarlo de forma basica le picas a iniciar automatico y luego a play, ya las demas opciones son para hacer mas cosas... a fin de cuentas para que jale debe haber circulos de colores(Centroides) y circulos negros(Datos) en la pantalla.
Me costo creo como de 6 a 8 horas hacerlo
PD. si tienes broncas con el link, pues me avisas