C# 在主程序外部创建渲染格式(slimdx)

C# 在主程序外部创建渲染格式(slimdx),c#,directx,visual-studio-2013,slimdx,C#,Directx,Visual Studio 2013,Slimdx,我被困在slim DX的一开始 Application.EnableVisualStyles(); Application.Run(new view()); 我的父母名字是view 我要做的是创建一个RenderForm()或simular,在表单应用程序内部作为MdiChild,RenderForm()是一个显示DirectX的表单。 这样做的原因是能够在父窗体内创建菜单栏和按钮等。 我曾尝试创建一个新的渲染表单,但在MessagePump()中效果不太好。整个应用程序挂起。原因可能是

我被困在slim DX的一开始

Application.EnableVisualStyles();
Application.Run(new view()); 
我的父母名字是view

我要做的是创建一个
RenderForm()
或simular,在表单应用程序内部作为MdiChild,
RenderForm()
是一个显示DirectX的表单。 这样做的原因是能够在父窗体内创建菜单栏和按钮等。 我曾尝试创建一个新的渲染表单,但在
MessagePump()
中效果不太好。整个应用程序挂起。原因可能是一个无休止的循环。 我尝试过的另一种方法是通过从主程序调用函数在视图中创建渲染窗体。这也不太好,因为主程序在渲染后不会执行任何代码 我尝试了很多不同的方法,但都没有成功。我在谷歌上搜索了几个小时都没有结果

我试图修改的代码来自SlimDX教程2:

public partial class view: RenderForm
{
    public View()
    {
        // The static void Main code goes here
    }
}
使用System.Windows.Forms; 使用SlimDX; 使用SlimDX.Direct3D11; 使用SlimDX.DXGI; 使用SlimDX.Windows; 使用设备=SlimDX.Direct3D11.Device; 使用Resource=SlimDX.Direct3D11.Resource; 名称空间设备创建 { 静态类程序 { 静态void Main() { var form=新的渲染形式(“教程2:设备创建”); var description=新的SwapChainDescription() { BufferCount=1, 用法=用法.RenderTargetOutput, outputhHandle=form.Handle, IsWindowed=true, ModeDescription=新的ModeDescription(0,0,新的Rational(60,1),格式为.R8G8B8A8_UNorm), SampleDescription=新的SampleDescription(1,0), Flags=SwapChainFlags.AllowModeSwitch, SwapEffect=SwapEffect.放弃 }; 装置装置; SwapChain SwapChain; Device.CreateWithSwapChain(DriverType.Hardware,DeviceCreationFlags.None,description,out Device,out swapChain); //创建渲染目标的视图,它是我们刚刚创建的交换链的backbuffer RenderTargetView renderTarget; 使用(var resource=resource.FromSwapChain(swapChain,0)) renderTarget=新的RenderTargetView(设备、资源); //如果要实际查看任何内容,则需要设置视口 var context=device.ImmediateContext; var viewport=新视口(0.0f,0.0f,form.ClientSize.Width,form.ClientSize.Height); context.outputMerge.SetTargets(renderTarget); context.Rasterizer.SetViewports(viewport); //防止DXGI处理alt+enter,这在Winforms中无法正常工作 使用(var factory=swapChain.GetParent()) SetWindowAssociation(form.Handle,WindowAssociationFlags.IgnoreAltEnter); //处理alt+输入我们自己 form.KeyDown+=(o,e)=> { if(e.Alt&&e.KeyCode==Keys.Enter) swapChain.IsFullScreen=!swapChain.IsFullScreen; }; MessagePump.Run(表单,()=> { //将渲染目标清除为柔和的蓝色 ClearRenderTargetView(renderTarget,新颜色4(0.5f,0.5f,1.0f)); swapChain.Present(0,PresentFlags.None); }); //清理所有资源 //我们遗漏的任何内容都将显示在调试输出中 renderTarget.Dispose(); swapChain.Dispose(); device.Dispose(); } } }
我从未成功地将MessagePump()放在主程序之外。

我已经玩了几天SlimDX了。MessagePump()确实创建了一个无止境的循环。我相信您可以在新线程上创建子窗体,也可以使用RenderForm而不是form扩展父窗体,这就是我所做的

public partial class Form1 : Form
{
    Form2 renderForm;

    public Form1()
    {
        InitializeComponent();

        openNewRenderForm();
    }

    private void openNewRenderForm()
    {
        Thread thread = new Thread(new ThreadStart(startRenderForm));
        thread.Start();
    }

    private void startRenderForm()
    {
        renderForm = new Form2();
    }
}
编辑 以下是如何在父线程的新线程上启动它:


如果Form2扩展了RenderForm,只需从RenderForm中删除“var form=new RenderForm”(“教程2:设备创建”);”行。

非常感谢,这将为我打开一些新思路。但是当我尝试从另一个窗体打开View()时,应用程序仍然挂起。如果有帮助,则显示错误消息。。System.Windows.Forms.dll中发生“System.InvalidOperationException”类型的未处理异常。其他信息:在单个线程上启动第二个消息循环不是有效的操作。改用Form.ShowDialog。我必须能够从与SlimDX完全没有连接的另一个窗体打开SlimDX渲染窗体。我想知道创建多个项目是否更容易。确切的问题似乎是,如何从父级设置messageloop(MessagePump)。我坚信/希望这能解决所有问题!添加了在新线程上创建表单的方法。让它在我这边起作用。希望它能起作用。
public partial class Form1 : Form
{
    Form2 renderForm;

    public Form1()
    {
        InitializeComponent();

        openNewRenderForm();
    }

    private void openNewRenderForm()
    {
        Thread thread = new Thread(new ThreadStart(startRenderForm));
        thread.Start();
    }

    private void startRenderForm()
    {
        renderForm = new Form2();
    }
}