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 .


Anmelden zum Antworten