Thomas Woelfers Baustatik Blog

Baustatik-Software und was sonst des Weges kommt

Direct3d im MDI-Child Fenster einer Windows.Forms Anwendung

Beim DirectX9 SDK ist bei den Beispielen für Managed Code unter anderem das 'Tutorial 6' dabei. Das eignet sich prima für die ersten Versuche mit 3d unter .Net. Das Problem: Normalerweise will man die 3d-Ansichten nie so dargestellt bekommen wie das in allen Beispielen gemacht wird. Dort sind die Direct3d Geschichten nämlich immer im Hauptfenster der Anwendung und füllen dessen komplette Client Area.

Statt dessen wird man normalerweise eher eine 3d Ansicht in einem MDI Child haben. Nimmt man nun beispielsweise das Tutorial 6 als Ausgang, fügt eine Form hinzu die der MdiParent wird, erzeugt dann eine 'Meshes' Form und weist der als MdiParent dann die neue Form zu - stürzt das ganze mit einer Direct3dException ab.

Läßt man die Zuweisung weg, dann gehts - nur ist das Fenster dann kein MdiChild sondern außerhalb der Anwendung frei beweglich. Unschön.

Die Lösung ist aber wirklich einfach: Man leitet 'Meshes' eben nicht von 'Form' ab, sondern von UserControl. (Dazu muss man noch die typischen UserControl Funktionen einbauen). Dann hat man ein ganz normales Control das per DirectX 3d-fähig ist - und das man einfach in einer beliebigen Form unterbringen kann. Auch in einem MdiChild.

Comments (1) -

  • CHli

    9/21/2005 6:19:57 AM |

    Sorry I don't write good enough german to reply to your message. Hope english won't be a problem.

    I did have the same problem and I think there is another way to do this in a cleaner way. The excpetion is raised when you try to pass a MdiChild to the Device constructor. The thing is that you should only have one Device for your whole application and share it trough the MdiChild.

    So create the Device in main form (passing this to the constructor) and then share it with the mdichild. When you want to display something on your MDIChild you can use the Device:Tongresent(System.Windows.Forms.Control) method passing the MdiChild as the parameter.

    Enjoy.

Comments are closed