Rendering Controll

pria

Mitglied
Hallo ,
ich habe folgendes Problem:

Ich möchte mit DirectX ein rendering in einem Panel vornehmen , den ich auf einem TapPanel habe. Jetzt hab ich aber immer das Problem , dass ich beim starten eine Anwendungsfehler Dialogbox erhalte. Kann mir einer zeigen wie es richtig geht?
 

PhoenixLoe

Erfahrenes Mitglied
Hi,

ein bissel mehr Info wäre nicht schlecht: Wie lautet die Fehlermeldung, wie sieht dein Code aus, welche DirectX-Version verwendest du, ...

Gruß
PhoenixLoe
 

pria

Mitglied
DirectX 9.0c August 2007
Die Fehlermeldung ist ein programmerzeugtes Fenster , in dem steht : Es ist ein Fehler in Ihrer Anwendung.
Aufgrund des Fensters und da ich für meine anderen Fehlermeldungen andere Fenster verwende , ist das ein DX erzeugtes Fenster.
Hier mein Code:

Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;

namespace Universe
{
    class DirectX
    {
        private Device m_device;
        private Panel devpanel;

        public DirectX(Panel devicepanel)
        {
            this.devpanel = devicepanel;
            initGFX();
            Render();
        }

        public void initGFX()
        {
            try
            {

                PresentParameters pp = new PresentParameters();

                pp.Windowed = false;
                pp.DeviceWindow = devpanel;
                pp.SwapEffect = SwapEffect.Copy;

                m_device = new Device(Manager.Adapters.Default.Adapter, DeviceType.Hardware, devpanel, CreateFlags.HardwareVertexProcessing, pp);

            }
            catch (DirectXException e)
            {
                MessageBox.Show(e.Message);
            }

        }

        public void Render()
        {
            m_device.Clear(ClearFlags.Target, Color.Blue, 0.0f, 0);
            m_device.BeginScene();
            // rendern
            m_device.EndScene();
            m_device.Present();

        }







    }
}
Der Fehler liegt an meinem aufruf des Devices, ich weiss aber nicht so recht , wie ich das sonst instanzieren soll, da das Rendering auf einem vorgeschriebenen Bereich meiner Hauptanwendung volzogen werden soll.

Wie gesagt , brauch ich dabei Hilfe.
 

PhoenixLoe

Erfahrenes Mitglied
Da du in ein Panel rendern willst, solltest du bei PresenParameters die Windowed-Eigenschaft auf true setzen.

Allerdings wirst du bei diesem Code nach dem Laden der Windows Form kein gerendertes Bild angezeigt bekommen, da die Anzeige nur einmal gezeichnet wird und beim Erscheinen der Form wieder gelöscht wird. Verwende hier einen Thread, der die Render()-Funktion in einer Endlosschleife aufruft.

Ansonsten funktioniert der Code bei mir so.

Gruß
PhoenixLoe
 

pria

Mitglied
Ich habs jetzt darauf erweitert:

Code:
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Drawing;
using Microsoft.DirectX;
using Microsoft.DirectX.Direct3D;
using System.Threading;

namespace Universe
{
    class DirectX
    {
        private Device m_device;
        private Panel devpanel;

        public DirectX(Panel devicepanel)
        {
            this.devpanel = devicepanel;
            initGFX();
            Thread rendering = new Thread(this.Render);
            rendering.Start();
        }

        public void initGFX()
        {
            try
            {

                PresentParameters pp = new PresentParameters();

                pp.Windowed = true;
                pp.DeviceWindow = devpanel;
                pp.SwapEffect = SwapEffect.Copy;

                m_device = new Device(Manager.Adapters.Default.Adapter, DeviceType.Hardware, devpanel, CreateFlags.HardwareVertexProcessing, pp);

            }
            catch (DirectXException e)
            {
                MessageBox.Show(e.Message);
            }

        }

        public void Render()
        {
            m_device.Clear(ClearFlags.Target, Color.Blue, 0.0f, 0);
            m_device.BeginScene();
            // rendern
            m_device.EndScene();
            m_device.Present();

        }







    }
}

Die Fehlermeldung ist jetzt verschwunden.
Eine Frage hab ich noch , wird die Farbe bei m_device.Clear(ClearFlags.Target, Color.Blue, 0.0f, 0); ignoriert?
Mein Renderingfeld ist immernoch Grau , wenn ich das ausführe.
 

PhoenixLoe

Erfahrenes Mitglied
Nein, der Befehl wird nicht ignoriert. Allerdings sorgst du per 0.0f dafür, dass nichts gelöscht wird. Verwende hier 1.0f, um die Ebene bis zum letzten Rest zu löschen. Dann sollte es funktionieren.

Gruß
PhoenixLoe
 

Neue Beiträge