MDX in panel rendern
-
Ich habe seit ein paar tagen ein problem , an dem ich einfachnicht weiterkomme . Ich will in einer windows form in ein panel (mit MDX 1.1 )rendern . Nun isses aber so , dass , egal wie ich es drehe, entweder nur dieses Panel ( bzw. device ) neu gezeichnet wird , oder die windows form ohne das panel.
Ich habe hier mal das vereinfachte grundgerüst der klasse. Vielleicht kann mir da jemand weiterhelfen : Es soll zB einen Button , eine textbox und eben dieses panel zeichnen und richtig "refresehen" oder zeichnen.
[cs] using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Microsoft.DirectX; using Microsoft.DirectX.Direct3D; namespace App_test { public partial class Form1 : Form { private float angle = 0.0f; private Device panelDevice; private PresentParameters pp; private Mesh mesh; public Form1() { InitializeComponent(); } private void InitializeGraphics(object sender, EventArgs e) { pp = new PresentParameters(); pp.Windowed = true; pp.SwapEffect = SwapEffect.Discard; panelDevice = new Device(0, DeviceType.Hardware, scenePanel1, CreateFlags.SoftwareVertexProcessing, pp); mesh = Mesh.Teapot(panelDevice); } private void Render(object sender, PaintEventArgs e) { angle += 0.01f; int i = 0; if ((i = new Random().Next(100)) < 10) textBox1.Text += "Number : " + i + "\r\n"; panelDevice.Transform.World = Matrix.RotationY(angle); panelDevice.Transform.View = Matrix.LookAtLH(new Vector3(0, 0, -5f), new Vector3(0, 0, 1), new Vector3(0, 1, 0)); panelDevice.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / 4.0f, (float)scenePanel1.Width / (float)scenePanel1.Height, 1.0f, 1000.0f); panelDevice.Clear(ClearFlags.Target, Color.CornflowerBlue, 1.0f, 0); panelDevice.BeginScene(); mesh.DrawSubset(0); panelDevice.EndScene(); panelDevice.Present(); this.Invalidate(); } } public class ScenePanel : Panel { public ScenePanel() { } } } [/cs]
in der partial class vom designer :
this.Paint += new System.Windows.Forms.PaintEventHandler(Render);
this.Load += new System.EventHandler(this.InitializeGraphics);Ich hab schon alles versucht . Anstatt an das this.Paint += Render alles in Paint zu machen und OnPaint zu übreschreiben, ein invalidate nur auf das panel , die ganze "Paint" sachen für das panel zu machen , etc. ... Nichts hat bis jetzt geholfen. Sicherlich liegt der fehler in meiner Verständnis wie man ein (device)panel in eine form einbettet, aber ich wäre für jede hilfe dankbar , auch weil ich dazu nur sehr wenige nicht hilfreiche sachen bis jetzt gefunden habe .
Danke im voraus
-
versuchs mal mit einem Timer, der beim Tick die D3D Renderfunktion aufruft.
-
Jo , danke . habs anders gelöst . Dachte der Tom miller render loop bezieht sich nur auf full screen apps , funktioniert mit ein paar modifikationen aber auch recht gut für forms .